2 Replies Latest reply on Sep 1, 2006 4:53 PM by shane.bryzak

    Seam remoting poll failover

    dave_cawthorn

      Hi All,

      I have a seam page that is acting as a remote event log viewer by subscribing to a topic and then appending the topic message descriptions to the page as they come in. This all works beautifully until I kill the server the web page was connected to and try to fail over to the backup node. The web page doesn't error (like when there is only a single node that dies) but no new messages are recieved.

      I turned on seam debugging in the page and here is the output of debug window. I kill the primary server just after the second poll request. As you can see there is a response from the node that takes over (i checked this with ethereal) but its just a http 200 ok with no data.

      Fri Sep 1 15:21:55 UTC+0800 2006: Request packet:



      Fri Sep 1 15:21:55 UTC+0800 2006: Response packet:



      Fri Sep 1 15:21:55 UTC+0800 2006: Request packet:



      Fri Sep 1 15:22:25 UTC+0800 2006: Response packet:



      Fri Sep 1 15:22:26 UTC+0800 2006: Request packet:



      Fri Sep 1 15:22:59 UTC+0800 2006: Response packet:


      And on the server that takes over I get the following error trace:

      2006-09-01 15:17:53,299 1449788 ERROR [org.jboss.seam.servlet.SeamServletFilter] (http-0.0.0.0-8080-1:) Error
      org.dom4j.DocumentException: Read timed out Nested exception: Read timed out
      at org.dom4j.io.SAXReader.read(SAXReader.java:484)
      at org.dom4j.io.SAXReader.read(SAXReader.java:343)
      at org.jboss.seam.remoting.PollHandler.handle(PollHandler.java:50)
      at org.jboss.seam.remoting.SeamRemotingServlet.doPost(SeamRemotingServlet.java:56)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
      at org.jboss.web.tomcat.tc5.session.ClusteredSessionValve.invoke(ClusteredSessionValve.java:95)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
      at org.jboss.web.tomcat.tc5.sso.ClusteredSingleSignOn.invoke(ClusteredSingleSignOn.java:461)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
      at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
      at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
      at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
      at java.lang.Thread.run(Thread.java:595)
      Nested exception:
      java.net.SocketTimeoutException: Read timed out
      at java.net.SocketInputStream.socketRead0(Native Method)
      at java.net.SocketInputStream.read(SocketInputStream.java:129)
      at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:747)
      at org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:777)
      at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:115)
      at org.apache.coyote.http11.InternalInputBuffer.doRead(InternalInputBuffer.java:712)
      at org.apache.coyote.Request.doRead(Request.java:418)
      at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:284)
      at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:371)
      at org.apache.catalina.connector.InputBuffer.readByte(InputBuffer.java:293)
      at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:104)
      at org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
      at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
      at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
      at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
      at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
      at org.dom4j.io.SAXReader.read(SAXReader.java:465)
      at org.dom4j.io.SAXReader.read(SAXReader.java:343)
      at org.jboss.seam.remoting.PollHandler.handle(PollHandler.java:50)
      at org.jboss.seam.remoting.SeamRemotingServlet.doPost(SeamRemotingServlet.java:56)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
      at org.jboss.web.tomcat.tc5.session.ClusteredSessionValve.invoke(ClusteredSessionValve.java:95)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
      at org.jboss.web.tomcat.tc5.sso.ClusteredSingleSignOn.invoke(ClusteredSingleSignOn.java:461)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
      at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
      at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
      at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
      at java.lang.Thread.run(Thread.java:595)

      I went through the steps outlined in the clustered DVD demo and believe I have adapted it to my situation.

      I haven't had a real good look into remote.js yet (next point of call) but I wan't try and avoid hacking this so that if it it gets a blank response it will refresh the subscriptions on the new server.

      Any help appreiciated...
      Dave

        • 1. Re: Seam remoting poll failover
          dave_cawthorn

          sorry the debug output should have looked like this

          Fri Sep 1 15:21:55 UTC+0800 2006: Request packet:
          <envelope><body><subscribe topic="ProcessLogTopic"/></body></envelope>
          
          
          Fri Sep 1 15:21:55 UTC+0800 2006: Request packet:
          envelope><body><subscribe topic="ProcessLogTopic"/></body></envelope>
          
          
          Fri Sep 1 15:21:55 UTC+0800 2006: Response packet:
          <envelope><body><subscription topic="ProcessLogTopic" token="d1eccc87-d5a5-477a-bd21-0bcd67c3101f"/></body></envelope>
          
          
          Fri Sep 1 15:21:55 UTC+0800 2006: Request packet:
          <envelope><body><poll token="d1eccc87-d5a5-477a-bd21-0bcd67c3101f" timeout="30"/></body></envelope>
          
          
          Fri Sep 1 15:22:25 UTC+0800 2006: Response packet:
          <envelope><body></body></envelope>
          
          
          Fri Sep 1 15:22:26 UTC+0800 2006: Request packet:
          <envelope><body><poll token="d1eccc87-d5a5-477a-bd21-0bcd67c3101f" timeout="30"/></body></envelope>
          
          
          Fri Sep 1 15:22:59 UTC+0800 2006: Response packet:
          
          


          • 2. Re: Seam remoting poll failover
            shane.bryzak

            I'll try to find some time to look at this today. I guess you need the following two things to fix your issue:

            1. Poll Handler correctly returning an error when the token doesn't exist.
            2. Some way of handling a polling error in the client so you can re-establish the subscription, e.g. Seam.Remoting.onPollError = MyPollErrorMethod.