You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by ks...@apache.org on 2009/05/14 20:25:57 UTC

svn commit: r774865 - /webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java

Author: kstam
Date: Thu May 14 18:25:56 2009
New Revision: 774865

URL: http://svn.apache.org/viewvc?rev=774865&view=rev
Log:
JUDDI-205 adding locking of the subscription row in the db, so only *one* thread/node will send out a notification.

Modified:
    webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java

Modified: webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
URL: http://svn.apache.org/viewvc/webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java?rev=774865&r1=774864&r2=774865&view=diff
==============================================================================
--- webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java (original)
+++ webservices/juddi/branches/v3_trunk/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java Thu May 14 18:25:56 2009
@@ -10,6 +10,7 @@
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityTransaction;
+import javax.persistence.LockModeType;
 import javax.persistence.Query;
 import javax.xml.datatype.DatatypeFactory;
 import javax.xml.datatype.Duration;
@@ -76,7 +77,7 @@
             	log.info("Notification background task took " + (endTime - startTime) + " milliseconds.");
             }
 		} else {
-			log.warn("Skipping current notification cycle because the registry is busy.");
+			log.warn("Skipping current notification cycle because the registry is too busy.");
 		}
 	}
 	/**
@@ -155,13 +156,20 @@
 	 */
 	@SuppressWarnings("unchecked")
 	protected Collection<Subscription> getAllSubscriptions() {
+		Collection<Subscription> subscriptions = null;
 		EntityManager em = PersistenceManager.getEntityManager();
 		EntityTransaction tx = em.getTransaction();
-		tx.begin();
-		Query query = em.createQuery("SELECT s FROM Subscription s");
-	    Collection<Subscription> subscriptions = (Collection<Subscription>) query.getResultList();
-	    tx.commit();
-		em.close();
+		try {
+			tx.begin();
+			Query query = em.createQuery("SELECT s FROM Subscription s");
+		    subscriptions = (Collection<Subscription>) query.getResultList();
+		    tx.commit();
+		} finally {
+			if (tx.isActive()) {
+				tx.rollback();
+			}
+			em.close();
+		}
 	    return subscriptions;
 	}
 	/**
@@ -174,9 +182,20 @@
 	{
 		EntityManager em = PersistenceManager.getEntityManager();
 		EntityTransaction tx = em.getTransaction();
-		tx.begin();
 		try {
+			tx.begin();
 			org.apache.juddi.model.Subscription modelSubscription = em.find(org.apache.juddi.model.Subscription.class, resultList.getSubscription().getSubscriptionKey());
+			log.debug("Taking out a write lock on this subscription, and bail if we can't get it since that would mean" 
+			 + " another jUDDI instance is in the process of sending out the notification.");
+			em.lock(modelSubscription, LockModeType.WRITE);
+			Date startPoint = resultList.getCoveragePeriod().getStartPoint().toGregorianCalendar().getTime();
+			Date endPoint   = resultList.getCoveragePeriod().getEndPoint().toGregorianCalendar().getTime();
+			if (modelSubscription.getLastNotified()!=null 
+					&& startPoint.before(modelSubscription.getLastNotified()) 
+					&& endPoint.after(modelSubscription.getLastNotified())) {
+				 log.info("We already send out a notification within this coverage period, no need to send another one.");
+				 return;
+			}
 			org.apache.juddi.model.BindingTemplate bindingTemplate= em.find(org.apache.juddi.model.BindingTemplate.class, modelSubscription.getBindingKey());
 			NotifySubscriptionListener body = new NotifySubscriptionListener();
 			body.setSubscriptionResultsList(resultList);



---------------------------------------------------------------------
To unsubscribe, e-mail: juddi-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: juddi-cvs-help@ws.apache.org