[webbeans-commits] Webbeans SVN: r1545 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: servlet and 1 other directory.
webbeans-commits at lists.jboss.org
webbeans-commits at lists.jboss.org
Mon Feb 16 14:02:24 EST 2009
Author: nickarls
Date: 2009-02-16 14:02:24 -0500 (Mon, 16 Feb 2009)
New Revision: 1545
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java
Log:
Better session for conversation destruction
Re-scheduling old conversation for destruction after beginning new
Modified: 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 2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java 2009-02-16 19:02:24 UTC (rev 1545)
@@ -95,7 +95,7 @@
*/
public void destroy(HttpSession session)
{
- log.trace("Destroying conversation " + cid);
+ log.debug("Destroying conversation " + cid);
if (!terminationHandle.isCancelled())
{
cancelTermination();
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java 2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java 2009-02-16 19:02:24 UTC (rev 1545)
@@ -31,18 +31,20 @@
* The current conversation implementation
*
* @author Nicklas Karlsson
- * @see javax.context.Conversation
+ * @see javax.context.Conversation
*/
@RequestScoped
@Named("conversation")
@WebBean
public class ConversationImpl implements Conversation
{
-
+
private static LogProvider log = Logging.getLogProvider(ConversationImpl.class);
// The conversation ID
private String cid;
+ // The original conversation ID (if any)
+ private String originalCid;
// Is the conversation long-running?
private boolean longRunning;
// The inactivity timeout in milliseconds
@@ -54,9 +56,9 @@
public ConversationImpl()
{
}
-
+
/**
- * Initializes a new conversation
+ * Initializes a new conversation
*
* @param conversationIdGenerator The conversation ID generator
* @param timeoutInMilliseconds The inactivity timeout in milliseconds
@@ -77,6 +79,10 @@
public void begin(String id)
{
+ if (originalCid == null)
+ {
+ originalCid = cid;
+ }
cid = id;
begin();
}
@@ -113,7 +119,7 @@
*
* @param cid The new conversation ID
* @param longRunning The new long-running status
- * @param timeout The new inactivity timeout in milliseconds
+ * @param timeout The new inactivity timeout in milliseconds
*/
public void switchTo(String cid, boolean longRunning, long timeoutInMilliseconds)
{
@@ -135,4 +141,9 @@
log.debug("Set conversation " + cid + " to long-running: " + longRunning);
this.longRunning = longRunning;
}
+
+ public String getOriginalCid()
+ {
+ return originalCid;
+ }
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java 2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ServletConversationManager.java 2009-02-16 19:02:24 UTC (rev 1545)
@@ -22,11 +22,11 @@
import java.util.concurrent.Future;
import javax.context.SessionScoped;
-import javax.faces.context.FacesContext;
import javax.inject.Current;
import javax.inject.Produces;
import javax.servlet.http.HttpSession;
+import org.jboss.webbeans.CurrentManager;
import org.jboss.webbeans.WebBean;
import org.jboss.webbeans.context.ConversationContext;
import org.jboss.webbeans.conversation.bindings.ConversationConcurrentAccessTimeout;
@@ -34,6 +34,7 @@
import org.jboss.webbeans.conversation.bindings.ConversationInactivityTimeout;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
+import org.jboss.webbeans.servlet.HttpSessionManager;
/**
* The default conversation manager
@@ -59,10 +60,6 @@
@Current
private ConversationImpl currentConversation;
- // The current HTTP session
- @Current
- private HttpSession session;
-
// The conversation timeout in milliseconds waiting for access to a blocked
// conversation
@ConversationConcurrentAccessTimeout
@@ -160,7 +157,8 @@
}
}
- // TODO: check that stuff gets terminated when you flip between several long-running conversations
+ // TODO: check that stuff gets terminated when you flip between several
+ // long-running conversations
public void cleanupConversation()
{
String cid = currentConversation.getId();
@@ -199,6 +197,15 @@
}
ConversationContext.INSTANCE.destroy();
}
+ // If Conversation.begin(String) is called, it might be that the
+ // conversation will be switched. We need to unlock this original
+ // conversation and re-schedule it for termination
+ String originalCid = currentConversation.getOriginalCid();
+ if (originalCid != null && longRunningConversations.containsKey(originalCid))
+ {
+ longRunningConversations.get(originalCid).unlock();
+ longRunningConversations.get(originalCid).reScheduleTermination(scheduleForTermination(originalCid));
+ }
}
/**
@@ -209,7 +216,8 @@
*/
private Future<?> scheduleForTermination(String cid)
{
- Runnable terminationTask = new TerminationTask(cid, (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true));
+ HttpSession session = CurrentManager.rootManager().getInstanceByType(HttpSessionManager.class).getSession();
+ Runnable terminationTask = new TerminationTask(cid, session);
return conversationTerminator.scheduleForTermination(terminationTask, inactivityTimeout);
}
@@ -249,6 +257,7 @@
public void destroyAllConversations()
{
+ HttpSession session = CurrentManager.rootManager().getInstanceByType(HttpSessionManager.class).getSession();
log.debug("Destroying " + longRunningConversations.size() + " long-running conversations in session " + session.getId());
for (ConversationEntry conversationEntry : longRunningConversations.values())
{
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java 2009-02-16 18:24:24 UTC (rev 1544)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/HttpSessionManager.java 2009-02-16 19:02:24 UTC (rev 1545)
@@ -20,7 +20,7 @@
@Produces
@RequestScoped
@WebBean
- HttpSession produceSession()
+ public HttpSession getSession()
{
return session;
}
More information about the weld-commits
mailing list