[webbeans-commits] Webbeans SVN: r1406 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: conversation and 1 other directories.
webbeans-commits at lists.jboss.org
webbeans-commits at lists.jboss.org
Wed Feb 4 02:47:37 EST 2009
Author: nickarls
Date: 2009-02-04 02:47:37 -0500 (Wed, 04 Feb 2009)
New Revision: 1406
Added:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java
Modified:
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.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/ConversationManager.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java
ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java
Log:
New theory on conversation handling for Pete to review (missing e.g. thread safety stuff )
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bootstrap/WebBeansBootstrap.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -36,6 +36,7 @@
import org.jboss.webbeans.log.Logging;
import org.jboss.webbeans.resources.spi.NamingContext;
import org.jboss.webbeans.resources.spi.ResourceLoader;
+import org.jboss.webbeans.servlet.SessionManager;
import org.jboss.webbeans.transaction.Transaction;
/**
@@ -103,6 +104,7 @@
beanDeployer.addClass(DefaultConversationManager.class);
beanDeployer.addClass(JavaSEConversationTerminator.class);
beanDeployer.addClass(NumericConversationIdGenerator.class);
+ beanDeployer.addClass(SessionManager.class);
beanDeployer.deploy();
}
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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationEntry.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -1,6 +1,23 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.jboss.webbeans.conversation;
import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import javax.servlet.http.HttpSession;
@@ -8,42 +25,99 @@
import org.jboss.webbeans.context.ConversationContext;
import org.jboss.webbeans.servlet.ConversationBeanMap;
+/**
+ * Represents a long-running conversation entry
+ *
+ * @author Nicklas Karlsson
+ */
public class ConversationEntry
{
+ // The conversation ID
private String cid;
+ // The handle to the asynchronous timeout task
private Future<?> terminationHandle;
+ // The lock for concurrent access prevention
private ReentrantLock concurrencyLock;
+ /**
+ * Creates a new conversation entry
+ *
+ * @param cid The conversation ID
+ * @param terminationHandle The timeout termination handle
+ */
protected ConversationEntry(String cid, Future<?> terminationHandle)
{
this.cid = cid;
this.terminationHandle = terminationHandle;
- this.concurrencyLock = new ReentrantLock(true);
+ this.concurrencyLock = new ReentrantLock();
}
+ /**
+ * Factory method
+ *
+ * @param cid The conversation ID
+ * @param terminationHandle The timeout termination handle
+ * @return A new conversation entry
+ */
public static ConversationEntry of(String cid, Future<?> terminationHandle)
{
return new ConversationEntry(cid, terminationHandle);
}
+ /**
+ * Cancels the timeout termination
+ *
+ * @return True if successful, false otherwise
+ */
public boolean cancelTermination()
{
return terminationHandle.cancel(false);
}
+ /**
+ * Destroys the conversation and it's associated conversational context
+ *
+ * @param session The HTTP session for the backing context beanmap
+ */
public void destroy(HttpSession session)
{
+ if (!terminationHandle.isCancelled())
+ {
+ cancelTermination();
+ }
ConversationContext terminationContext = new ConversationContext();
terminationContext.setBeanMap(new ConversationBeanMap(session, cid));
terminationContext.destroy();
}
-
- public void lock() {
- concurrencyLock.lock();
+
+ /**
+ * Attempts to lock the conversation for exclusive usage
+ *
+ * @param timeoutInMilliseconds The time in milliseconds to wait on the lock
+ * @return True if lock was successful, false otherwise
+ * @throws InterruptedException If the lock operation was unsuccessful
+ */
+ public boolean lock(long timeoutInMilliseconds) throws InterruptedException
+ {
+ return concurrencyLock.tryLock(timeoutInMilliseconds, TimeUnit.MILLISECONDS);
}
-
- public void unlock() {
+
+ /**
+ * Attempts to unlock the conversation
+ */
+ public void unlock()
+ {
concurrencyLock.unlock();
}
+ /**
+ * Re-schedules timeout termination
+ *
+ * @param terminationHandle The fresh timeout termination handle
+ */
+ public void reScheduleTermination(Future<?> terminationHandle)
+ {
+ this.terminationHandle = terminationHandle;
+ }
+
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationIdGenerator.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -16,7 +16,17 @@
*/
package org.jboss.webbeans.conversation;
+/**
+ * Generates conversation ID:s for the conversation manager
+ *
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationManager#beginConversation(String)
+ */
public interface ConversationIdGenerator
{
+ /**
+ * Gets the next ID for a new conversation
+ * @return The ID
+ */
public abstract String nextId();
}
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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationImpl.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -17,25 +17,46 @@
package org.jboss.webbeans.conversation;
+import javax.annotation.Named;
import javax.context.Conversation;
import javax.context.RequestScoped;
+/**
+ * The current conversation implementation
+ *
+ * @author Nicklas Karlsson
+ * @see javax.context.Conversation
+ */
@RequestScoped
+ at Named("conversation")
public class ConversationImpl implements Conversation
{
+ // The conversation ID
private String cid;
+ // Is the conversation long-running?
private boolean longRunning;
+ // The inactivity timeout in milliseconds
private long timeoutInMilliseconds;
- public ConversationImpl() {
- }
-
+ /**
+ * Creates a new conversation
+ *
+ * @param cid The conversation ID
+ * @param timeoutInMilliseconds The inactivity timeout in milliseconds
+ */
protected ConversationImpl(String cid, long timeoutInMilliseconds)
{
this.timeoutInMilliseconds = timeoutInMilliseconds;
this.cid = cid;
}
+ /**
+ * Factory method
+ *
+ * @param cid The conversation ID
+ * @param timeoutInMilliseconds The inactivity timeout in milliseconds
+ * @return A new conversation
+ */
public static ConversationImpl of(String cid, long timeoutInMilliseconds)
{
return new ConversationImpl(cid, timeoutInMilliseconds);
@@ -77,11 +98,18 @@
this.timeoutInMilliseconds = timeout;
}
- public void become(String cid, boolean longRunning, long timeout)
+ /**
+ * Assumes the identity of another conversation
+ *
+ * @param cid The new conversation ID
+ * @param longRunning The new long-running status
+ * @param timeout The new inactivity timeout in milliseconds
+ */
+ public void become(String cid, boolean longRunning, long timeoutInMilliseconds)
{
this.cid = cid;
this.longRunning = longRunning;
- this.timeoutInMilliseconds = timeout;
+ this.timeoutInMilliseconds = timeoutInMilliseconds;
}
@Override
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationManager.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -16,9 +16,43 @@
*/
package org.jboss.webbeans.conversation;
+/**
+ * A conversation manager responsible for starting, resuming and ending conversations
+ *
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationManager
+ */
public interface ConversationManager
{
+ /**
+ * Begins a conversation
+ *
+ * @param cid The incoming conversation ID. Can be null in cases of transient conversations
+ */
public abstract void beginConversation(String cid);
+
+ /**
+ * Ends the current conversation
+ */
public abstract void endConversation();
+
+ /**
+ * Destroys all long-running conversations
+ */
public abstract void destroyAllConversations();
+
+ /**
+ * Gets The inactivity timeout
+ *
+ * @return The timeout in milliseconds
+ */
+ public abstract long getInactivityTimeoutInMilliseconds();
+
+ /**
+ * Gets The concurrent access timeout
+ *
+ * @return The timeout in milliseconds
+ */
+ public abstract long getConcurrentAccessTimeoutInMilliseconds();
+
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/ConversationTerminator.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -18,8 +18,21 @@
import java.util.concurrent.Future;
+/**
+ * A conversation terminator for scheduling inactivity timeout destructions
+ *
+ * @author Nicklas Karlsson
+ *
+ */
public interface ConversationTerminator
{
- public abstract Future<?> scheduleForTermination(Runnable task);
- public abstract long getTimeout();
+ /**
+ * Schedules a termination
+ *
+ * @param terminationTask The termination task to run
+ * @param timeoutInMilliseconds The timeout in milliseconds
+ *
+ * @return A handle for manipulating the task later on
+ */
+ public abstract Future<?> scheduleForTermination(Runnable terminationTask, long timeoutInMilliseconds);
}
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-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/DefaultConversationManager.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -22,6 +22,7 @@
import java.util.concurrent.Future;
import javax.context.Conversation;
+import javax.context.RequestScoped;
import javax.context.SessionScoped;
import javax.inject.Current;
import javax.inject.Produces;
@@ -31,96 +32,180 @@
import org.jboss.webbeans.context.ConversationContext;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
-import org.jboss.webbeans.servlet.ConversationBeanMap;
+/**
+ * The default conversation manager
+ *
+ * @author Nicklas Karlsson
+ *
+ */
@SessionScoped
public class DefaultConversationManager implements ConversationManager, Serializable
{
private static LogProvider log = Logging.getLogProvider(WebBeansBootstrap.class);
+ // The conversation id generator
@Current
private ConversationIdGenerator conversationIdGenerator;
+
+ // The conversation terminator
@Current
private ConversationTerminator conversationTerminator;
+
+ // The current conversation
@Current
private Conversation currentConversation;
- private Map<String, ConversationEntry> longRunningConversations;
+ // The current HTTP session
+ @Current
private HttpSession session;
- protected DefaultConversationManager()
+ // A map of current active long-running conversation entries
+ private Map<String, ConversationEntry> longRunningConversations;
+
+ /**
+ * Creates a new conversation manager
+ */
+ public DefaultConversationManager()
{
log.trace("Created " + getClass());
longRunningConversations = new ConcurrentHashMap<String, ConversationEntry>();
- session = null;
}
+ /**
+ * Producer method for transient conversations
+ *
+ * @return A new transient conversation
+ */
@Produces
+ @RequestScoped
public Conversation produceNewTransientConversation()
{
- Conversation conversation = ConversationImpl.of(conversationIdGenerator.nextId(), conversationTerminator.getTimeout());
+ Conversation conversation = ConversationImpl.of(conversationIdGenerator.nextId(), getInactivityTimeoutInMilliseconds());
log.trace("Produced a new conversation: " + conversation);
return conversation;
}
- public void setSession(HttpSession session)
- {
- log.trace("Conversation manager got session " + session.getId());
- this.session = session;
- }
-
public void beginConversation(String cid)
{
if (cid == null)
{
+ // No incoming conversation ID, nothing to do here, Conversation
+ // factory will produce new transient conversation
return;
}
if (!longRunningConversations.containsKey(cid))
{
+ // We got an incoming conversation ID but it was not in the map of
+ // known ones, nothing to do, factory to the rescue
log.info("Could not restore long-running conversation " + cid);
return;
}
- if (!longRunningConversations.remove(cid).cancelTermination())
+ // Try to get a lock to the requested conversation, return and fall back
+ // to new transient conversation from factory
+ // if we fail
+ try
{
+ if (!longRunningConversations.get(cid).lock(getConcurrentAccessTimeoutInMilliseconds()))
+ {
+ log.info("Could not acquire conversation lock in " + getConcurrentAccessTimeoutInMilliseconds() + "ms, giving up");
+ return;
+ }
+ }
+ catch (InterruptedException e)
+ {
+ log.info("Interrupted while trying to acquire lock");
+ return;
+ }
+ // If we can't cancel the termination, release the lock, return and fall
+ // back to new transient conversation from factory
+ if (!longRunningConversations.get(cid).cancelTermination())
+ {
+ longRunningConversations.get(cid).unlock();
log.info("Failed to cancel termination of conversation " + cid);
}
else
{
- ((ConversationImpl) currentConversation).become(cid, true, conversationTerminator.getTimeout());
+ // If all goes well, set the identity of the current conversation to
+ // match the fetched long-running one
+ ((ConversationImpl) currentConversation).become(cid, true, getInactivityTimeoutInMilliseconds());
}
}
public void endConversation()
{
+ String cid = currentConversation.getId();
if (currentConversation.isLongRunning())
{
- Runnable terminationTask = new TerminationTask(currentConversation.getId());
- Future<?> terminationHandle = conversationTerminator.scheduleForTermination(terminationTask);
- String cid = currentConversation.getId();
- ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
- longRunningConversations.put(cid, conversationEntry);
+ Future<?> terminationHandle = scheduleForTermination(cid);
+ // When the conversation ends, a long-running conversation needs to
+ // start its self-destruct. We can have the case where the conversation
+ // is a previously known conversation (that had it's termination canceled in the
+ // beginConversation) or the case where we have a completely new long-running conversation.
+ if (longRunningConversations.containsKey(currentConversation.getId()))
+ {
+ longRunningConversations.get(currentConversation.getId()).unlock();
+ longRunningConversations.get(currentConversation.getId()).reScheduleTermination(terminationHandle);
+ }
+ else
+ {
+ ConversationEntry conversationEntry = ConversationEntry.of(cid, terminationHandle);
+ longRunningConversations.put(cid, conversationEntry);
+ }
log.trace("Scheduling " + currentConversation + " for termination");
}
else
{
+ // If the conversation is not long-running it can be a transient
+ // conversation that has been so from the start or it can be a
+ // long-running conversation that has been demoted during the request
log.trace("Destroying transient conversation " + currentConversation);
+ if (longRunningConversations.containsKey(cid))
+ {
+ if (!longRunningConversations.get(cid).cancelTermination())
+ {
+ log.info("Failed to cancel termination of conversation " + cid);
+ }
+ longRunningConversations.get(cid).unlock();
+ }
ConversationContext.INSTANCE.destroy();
}
}
+ private Future<?> scheduleForTermination(String cid)
+ {
+ Runnable terminationTask = new TerminationTask(cid);
+ return conversationTerminator.scheduleForTermination(terminationTask, getInactivityTimeoutInMilliseconds());
+ }
+
+ /**
+ * A termination task that destroys the conversation entry
+ *
+ * @author Nicklas Karlsson
+ *
+ */
private class TerminationTask implements Runnable
{
+ // The conversation ID to terminate
private String cid;
+ /**
+ * Creates a new termination task
+ *
+ * @param cid The conversation ID
+ */
public TerminationTask(String cid)
{
this.cid = cid;
}
+ /**
+ * Executes the termination
+ */
public void run()
{
log.trace("Conversation " + cid + " timed out and was terminated");
- longRunningConversations.get(cid).destroy(session);
+ longRunningConversations.remove(cid).destroy(session);
}
}
@@ -128,10 +213,19 @@
{
for (ConversationEntry conversationEntry : longRunningConversations.values())
{
- conversationEntry.cancelTermination();
conversationEntry.destroy(session);
}
longRunningConversations.clear();
}
+ public long getConcurrentAccessTimeoutInMilliseconds()
+ {
+ return 1000;
+ }
+
+ public long getInactivityTimeoutInMilliseconds()
+ {
+ return 10 * 60 * 1000;
+ }
+
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/JavaSEConversationTerminator.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -24,19 +24,20 @@
import javax.context.SessionScoped;
+/**
+ * A ConversationTerminator implementation using Java SE scheduling
+ *
+ * @author Nicklas Karlsson
+ * @see org.jboss.webbeans.conversation.ConversationTerminator
+ */
@SessionScoped
public class JavaSEConversationTerminator implements ConversationTerminator, Serializable
{
private ScheduledExecutorService terminator = Executors.newScheduledThreadPool(1);
- public Future<?> scheduleForTermination(Runnable terminationTask)
+ public Future<?> scheduleForTermination(Runnable terminationTask, long timeoutInMilliseconds)
{
- return terminator.schedule(terminationTask, getTimeout(), TimeUnit.MILLISECONDS);
+ return terminator.schedule(terminationTask, timeoutInMilliseconds, TimeUnit.MILLISECONDS);
}
- public long getTimeout()
- {
- return 10 * 60 * 1000;
- }
-
}
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/conversation/NumericConversationIdGenerator.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -21,11 +21,21 @@
import javax.context.ApplicationScoped;
+/**
+ * A ConversationIdGenerator implementation using running numerical values
+ *
+ * @author Nicklas Karlsson
+ *
+ */
@ApplicationScoped
public class NumericConversationIdGenerator implements ConversationIdGenerator, Serializable
{
+ // The next conversation ID
private AtomicInteger id;
+ /**
+ * Creates a new conversation ID generator
+ */
public NumericConversationIdGenerator()
{
id = new AtomicInteger(1);
Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java 2009-02-04 07:25:42 UTC (rev 1405)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/ServletLifecycle.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -29,7 +29,6 @@
import org.jboss.webbeans.context.RequestContext;
import org.jboss.webbeans.context.SessionContext;
import org.jboss.webbeans.conversation.ConversationManager;
-import org.jboss.webbeans.conversation.DefaultConversationManager;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
@@ -96,6 +95,7 @@
*/
public static void beginRequest(HttpServletRequest request)
{
+ CurrentManager.rootManager().getInstanceByType(SessionManager.class).setSession(request.getSession());
SessionContext.INSTANCE.setBeanMap(new SessionBeanMap(request.getSession()));
beginConversation(request);
DependentContext.INSTANCE.setActive(true);
@@ -104,10 +104,6 @@
private static void beginConversation(HttpServletRequest request)
{
ConversationManager conversationManager = CurrentManager.rootManager().getInstanceByType(ConversationManager.class);
- if (conversationManager instanceof DefaultConversationManager)
- {
- ((DefaultConversationManager) conversationManager).setSession(request.getSession());
- }
conversationManager.beginConversation(request.getParameter("cid"));
Conversation conversation = CurrentManager.rootManager().getInstanceByType(Conversation.class);
ConversationContext.INSTANCE.setBeanMap(new ConversationBeanMap(request.getSession(), conversation.getId()));
@@ -125,6 +121,7 @@
SessionContext.INSTANCE.setBeanMap(null);
endConversation();
ConversationContext.INSTANCE.setBeanMap(null);
+ CurrentManager.rootManager().getInstanceByType(SessionManager.class).setSession(null);
}
private static void endConversation()
Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/servlet/SessionManager.java 2009-02-04 07:47:37 UTC (rev 1406)
@@ -0,0 +1,24 @@
+package org.jboss.webbeans.servlet;
+
+import javax.context.RequestScoped;
+import javax.inject.Produces;
+import javax.servlet.http.HttpSession;
+
+ at RequestScoped
+public class SessionManager
+{
+ private HttpSession session;
+
+ public void setSession(HttpSession session)
+ {
+ this.session = session;
+ }
+
+ @Produces
+ @RequestScoped
+ HttpSession produceSession()
+ {
+ return session;
+ }
+
+}
More information about the weld-commits
mailing list