[webbeans-commits] Webbeans SVN: r1393 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation.
webbeans-commits at lists.jboss.org
webbeans-commits at lists.jboss.org
Tue Feb 3 03:20:03 EST 2009
Author: nickarls
Date: 2009-02-03 03:20:03 -0500 (Tue, 03 Feb 2009)
New Revision: 1393
Added:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
Log:
Refactoring in preparation for concurrency control
Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java 2009-02-03 08:20:03 UTC (rev 1393)
@@ -0,0 +1,49 @@
+package org.jboss.webbeans.conversation;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.servlet.http.HttpSession;
+
+import org.jboss.webbeans.context.ConversationContext;
+import org.jboss.webbeans.servlet.ConversationBeanMap;
+
+public class ConversationEntry
+{
+ private String cid;
+ private Future<?> terminationHandle;
+ private ReentrantLock concurrencyLock;
+
+ protected ConversationEntry(String cid, Future<?> terminationHandle)
+ {
+ this.cid = cid;
+ this.terminationHandle = terminationHandle;
+ this.concurrencyLock = new ReentrantLock(true);
+ }
+
+ public static ConversationEntry of(String cid, Future<?> terminationHandle)
+ {
+ return new ConversationEntry(cid, terminationHandle);
+ }
+
+ public boolean cancelTermination()
+ {
+ return terminationHandle.cancel(false);
+ }
+
+ public void destroy(HttpSession session)
+ {
+ ConversationContext terminationContext = new ConversationContext();
+ terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
+ terminationContext.destroy();
+ }
+
+ public void lock() {
+ concurrencyLock.lock();
+ }
+
+ public void unlock() {
+ concurrencyLock.unlock();
+ }
+
+}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java 2009-02-03 03:49:06 UTC (rev 1392)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java 2009-02-03 08:20:03 UTC (rev 1393)
@@ -45,13 +45,13 @@
@Current
private Conversation currentConversation;
- private Map<String, Future<?>> longRunningConversations;
+ private Map<String, ConversationEntry> longRunningConversations;
private HttpSession session;
protected DefaultConversationManager()
{
log.trace("Created " + getClass());
- longRunningConversations = new ConcurrentHashMap<String, Future<?>>();
+ longRunningConversations = new ConcurrentHashMap<String, ConversationEntry>();
session = null;
}
@@ -80,7 +80,7 @@
log.info("Could not restore long-running conversation " + cid);
return;
}
- if (!longRunningConversations.remove(cid).cancel(false))
+ if (!longRunningConversations.remove(cid).cancelTermination())
{
log.info("Failed to cancel termination of conversation " + cid);
}
@@ -96,7 +96,9 @@
{
Runnable terminationTask = new TerminationTask(currentConversation.getId());
Future<?> terminationHandle = conversationTerminator.scheduleForTermination(terminationTask);
- longRunningConversations.put(currentConversation.getId(), terminationHandle);
+ String cid = currentConversation.getId();
+ ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
+ longRunningConversations.put(cid, conversationEntry);
log.trace("Scheduling " + currentConversation + " for termination");
}
else
@@ -118,24 +120,18 @@
public void run()
{
log.trace("Conversation " + cid + " timed out and was terminated");
- destroyConversation(cid, session);
+ longRunningConversations.get(cid).destroy(session);
}
}
-
+
public void destroyAllConversations()
{
- for (Map.Entry<String, Future<?>> entry : longRunningConversations.entrySet()) {
- entry.getValue().cancel(false);
- destroyConversation(entry.getKey(), session);
+ for (ConversationEntry conversationEntry : longRunningConversations.values())
+ {
+ conversationEntry.cancelTermination();
+ conversationEntry.destroy(session);
}
+ longRunningConversations.clear();
}
- private void destroyConversation(String cid, HttpSession session)
- {
- ConversationContext terminationContext = new ConversationContext();
- terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
- terminationContext.destroy();
- longRunningConversations.remove(cid);
- }
-
}
More information about the weld-commits
mailing list