[jbossseam-issues] [JBoss JIRA] Closed: (JBSEAM-4212) JMS feature does not work after cluster failover
Norman Richards (JIRA)
jira-events at lists.jboss.org
Fri Aug 28 18:09:23 EDT 2009
[ https://jira.jboss.org/jira/browse/JBSEAM-4212?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Norman Richards closed JBSEAM-4212.
-----------------------------------
Fix Version/s: 2.2.1.CR1
Resolution: Done
setting fix version
> JMS feature does not work after cluster failover
> ------------------------------------------------
>
> Key: JBSEAM-4212
> URL: https://jira.jboss.org/jira/browse/JBSEAM-4212
> Project: Seam
> Issue Type: Bug
> Components: Remoting
> Affects Versions: 2.0.2.SP1
> Environment: JBoss 4.2.3.GA (clustered)
> Reporter: Scott McNab
> Assignee: Norman Richards
> Fix For: 2.2.1.CR1
>
>
> We have configured Seam to work in a clustered environment by using a custom JMSConnectionProvider that fetches the UIL2ConnectionFactory from HA-JNDI. This arrangements works perfectly fine while both servers are up - i.e. a web client connected to the slave server will correctly receive Asynchronous Seam notifications from a JMS topic hosted on the master server.
> However, when the master server fails over to the slave, the Seam JMS support on the slave stops working. We get the following exception:
> 06-02 12:52:45.405 ERROR [seam.remoting.messaging.SubscriptionRegistry] (http-192.168.100.140-80-2:) org.jboss.mq.SpyJMSException: Cannot get the Topic from the provider; - nested throwable: (java.io.IOE
> xception: Client is not connected)
> 06-02 12:52:45.406 ERROR [jboss.seam.remoting.Remoting] (http-192.168.100.140-80-2:) Error
> java.lang.NullPointerException
> at org.jboss.seam.remoting.messaging.SubscriptionRequest.marshal(SubscriptionRequest.java:31)
> at org.jboss.seam.remoting.SubscriptionHandler.marshalResponse(SubscriptionHandler.java:107)
> at org.jboss.seam.remoting.SubscriptionHandler.handle(SubscriptionHandler.java:96)
> at org.jboss.seam.remoting.Remoting.getResource(Remoting.java:111)
> at org.jboss.seam.servlet.SeamResourceServlet.doGet(SeamResourceServlet.java:75)
> at org.jboss.seam.servlet.SeamResourceServlet.doPost(SeamResourceServlet.java:92)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
> at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:68)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
> at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
> at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
> at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
> at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
> at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
> at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
> at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
> at org.jboss.web.tomcat.service.session.ClusteredSessionValve.invoke(ClusteredSessionValve.java:97)
> at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
> at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
> at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
> at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
> at org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn.invoke(ClusteredSingleSignOn.java:677)
> at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
> at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
> at java.lang.Thread.run(Thread.java:595)
> We have diagnosed this issue and have developed a fix. The problem is as follows:
> - once failover occurs, the topicConnection field in the SubscriptionRegistry object becomes invalid, as the connection to the master server has died.
> - every subsequent call to SubscriptionRegistry.subscribe() will fail with SpyJMSException: Cannot get the Topic from the provider; Client is not connected.
> - even if the master server recovers, this connection is dead and all Seam JMS subscriptions will no longer work.
> The fix is to catch the Exception and retry with a new topicConnection if a subscribe request fails. The following patch on jboss-seam-2.0.2.SP1/src/remoting/org/jboss/seam/remoting/messaging/SubscriptionRegistry.java works for us:
> Index: SubscriptionRegistry.java
> ===================================================================
> --- SubscriptionRegistry.java (revision 5528)
> +++ SubscriptionRegistry.java (working copy)
> @@ -139,7 +139,21 @@
> RemoteSubscriber sub = new RemoteSubscriber(UUID.randomUUID().toString(), topicName);
>
> try {
> - sub.subscribe(getTopicConnection());
> + try {
> + sub.subscribe(getTopicConnection());
> + } catch (Exception e) {
> + // If we failed during the first attempt, we might have a dead JMS connection.
> + // Clear the topic connection and try again.
> + if (topicConnection != null) {
> + try {
> + topicConnection.close();
> + } catch (Exception e1) {
> + // Ignore any exception during the close, since this connection is probably dead anyway
> + }
> + }
> + topicConnection = null;
> + sub.subscribe(getTopicConnection());
> + }
> subscriptions.put(sub.getToken(), sub);
>
> // Save the client's token in their session context
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the seam-issues
mailing list