Class JTANonClusteredSemaphore

  • All Implemented Interfaces:
    Semaphore

    public class JTANonClusteredSemaphore
    extends java.lang.Object
    implements Semaphore
    Provides in memory thread/resource locking that is JTA Transaction aware. It is most appropriate for use when using JobStoreCMT without clustering.

    This Semaphore implementation is not Quartz cluster safe.

    When a lock is obtained/released but there is no active JTA Transaction, then this Semaphore operates just like SimpleSemaphore.

    By default, this class looks for the TransactionManager in JNDI under name "java:TransactionManager". If this is not where your Application Server registers it, you can modify the JNDI lookup location using the "transactionManagerJNDIName" property.

    IMPORTANT: This Semaphore implementation is currently experimental. It has been tested a limited amount on JBoss 4.0.3SP1. If you do choose to use it, any feedback would be most appreciated!

    See Also:
    SimpleSemaphore
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected org.slf4j.Logger getLog()  
      protected javax.transaction.Transaction getTransaction()
      Helper method to get the current Transaction from the TransactionManager in JNDI.
      boolean isLockOwner​(java.sql.Connection conn, java.lang.String lockName)
      Determine whether the calling thread owns a lock on the identified resource.
      boolean obtainLock​(java.sql.Connection conn, java.lang.String lockName)
      Grants a lock on the identified resource to the calling thread (blocking until it is available).
      void releaseLock​(java.lang.String lockName)
      Release the lock on the identified resource if it is held by the calling thread, unless currently in a JTA transaction.
      protected void releaseLock​(java.lang.String lockName, boolean fromSynchronization)
      Release the lock on the identified resource if it is held by the calling thread, unless currently in a JTA transaction.
      boolean requiresConnection()
      This Semaphore implementation does not use the database.
      void setTransactionManagerJNDIName​(java.lang.String transactionManagerJNDIName)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • DEFAULT_TRANSACTION_MANANGER_LOCATION

        public static final java.lang.String DEFAULT_TRANSACTION_MANANGER_LOCATION
        See Also:
        Constant Field Values
    • Constructor Detail

      • JTANonClusteredSemaphore

        public JTANonClusteredSemaphore()
    • Method Detail

      • getLog

        protected org.slf4j.Logger getLog()
      • setTransactionManagerJNDIName

        public void setTransactionManagerJNDIName​(java.lang.String transactionManagerJNDIName)
      • obtainLock

        public boolean obtainLock​(java.sql.Connection conn,
                                  java.lang.String lockName)
                           throws LockException
        Grants a lock on the identified resource to the calling thread (blocking until it is available).
        Specified by:
        obtainLock in interface Semaphore
        Parameters:
        conn - Database connection used to establish lock. Can be null if Semaphore.requiresConnection() returns false.
        Returns:
        true if the lock was obtained.
        Throws:
        LockException
      • getTransaction

        protected javax.transaction.Transaction getTransaction()
                                                        throws LockException
        Helper method to get the current Transaction from the TransactionManager in JNDI.
        Returns:
        The current Transaction, null if not currently in a transaction.
        Throws:
        LockException
      • releaseLock

        public void releaseLock​(java.lang.String lockName)
                         throws LockException
        Release the lock on the identified resource if it is held by the calling thread, unless currently in a JTA transaction.
        Specified by:
        releaseLock in interface Semaphore
        Throws:
        LockException
      • releaseLock

        protected void releaseLock​(java.lang.String lockName,
                                   boolean fromSynchronization)
                            throws LockException
        Release the lock on the identified resource if it is held by the calling thread, unless currently in a JTA transaction.
        Parameters:
        fromSynchronization - True if this method is being invoked from Synchronization notified of the enclosing transaction having completed.
        Throws:
        LockException - Thrown if there was a problem accessing the JTA Transaction. Only relevant if fromSynchronization is false.
      • isLockOwner

        public boolean isLockOwner​(java.sql.Connection conn,
                                   java.lang.String lockName)
        Determine whether the calling thread owns a lock on the identified resource.