Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

When the scheduler fires according to the trigger, the SemaphoreGatedRunner's execute methods is called.  The semaphore will generate a random number between 0 and the maximum number of workers of that type (exclusive) and concatenate that number with the worker's unique key to generate a lock string.  It will then attempt to acquire a global lock on that string using the semaphore RDS table.  If a lock is acquired, it will be held in a try/finally block while configured runner is executed. It will unconditional unconditionally release the lock when the Runner's run() method returns.

...

  • When lock is issued, it is guaranteed to be held until released by the lock holder or the configured timeout is exceeded.
  • The same lock will not be issued to multiple callers.
  • Lock acquisition is non-blocking, meaning it does not wait for a lock to be acquire.  In other words, the SemaphoreGatedRunner will return to the caller immediately if a lock cannot be acquired.
  • When a lock is acquired a new unique token is issued to the lock holder.  This token must be used to release the lock.  The means if one thread is issued a lock but does not release it before the configured timeout is exceed, then the same lock can be issued to another thread but with a new token.  Since the original thread's token is no longer bound to the lock it cannot , that token cannot be used to release the lock since it had been re-issued to the other caller.

...