场景描述: 我的程序是由flex + java + blazeDS + activeMQ实现的,它通过Flex Consumer订阅来自activeMQ的jms消息,目前我提供两个tomcat in 同一个服务器,它们都包含我的程序,而ActiveMQ在另一个服务器上,现在我在同一种浏览器中打开这两个应用程序,如 作为IE或Chrome,无论如何,网址就像 http:// localhost: 8080 /HelloWord/index.html , http:// localhost: 8181 /HelloWord/index.html
问题: 第一个应用程序网址是 http:// localhost: 8080 /HelloWord/index.html ,我在ie中打开它,它可以很好地订阅消息,但是当我打开第二个 第二个应用程序的网址为 http:// localhost: 8181 /HelloWord/index.html ,即发生意外,其中两个应用程序无法订阅消息。
错误日志 1.flex客户端日志(flash.log): 检测到基于HTTP的重复FlexSession,通常是由于远程主机禁用会话Cookie。必须启用会话cookie才能正确管理客户端连接 2.java控制台日志: flex.messaging.client.FlexClientNotSubscribedException:客户端没有有效的终端订阅' my-polling-amf'。 在flex.messaging.client.FlexClient.throwNotSubscribedException(FlexClient.java:1789) 在flex.messaging.client.FlexClient.pollWithWait(FlexClient.java:967) 在flex.messaging.endpoints.BasePollingHTTPEndpoint.handleFlexClientPoll(BasePollingHTTPEndpoint.java:538) 在flex.messaging.endpoints.AbstractEndpoint.handleFlexClientPollCommand(AbstractEndpoint.java:1151) 在flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:965) 在flex.messaging.endpoints.AbstractEndpoint $$ FastClassByCGLIB $$ 1a3ef066.invoke() 在net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 在org.springframework.aop.framework.Cglib2AopProxy $ CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692) 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 在org.springframework.flex.core.MessageInterceptionAdvice.invoke(MessageInterceptionAdvice.java:66) 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124) 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在org.springframework.aop.framework.Cglib2AopProxy $ FixedChainStaticTargetInterceptor.intercept(Cglib2AopProxy.java:576) 在flex.messaging.endpoints.AMFEndpoint $$ EnhancerByCGLIB $$ 3ae4b8ad.serviceMessage() 在flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103) 在flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158) 在flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44) 在flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67) 在flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166) 在flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291) 在flex.messaging.endpoints.AMFEndpoint $$ EnhancerByCGLIB $$ 3ae4b8ad.service() 在org.springframework.flex.servlet.MessageBrokerHandlerAdapter.handle(MessageBrokerHandlerAdapter.java:108) 在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) 在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 在org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403) 在org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:286) 在org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process(Http11AprProtocol.java:272) 在org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:1730) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)
我做过的测试: 1.FlexClient.getInstance()。id = UIDUtil.createUID();无效 2.FlexClient.getInstance()。id = null;无效 3.使用不同类型的浏览器,一个使用,另一个使用Chrome,打开两个应用程序,它们都可以; 4.一个服务器一个tomcat,使用同一种浏览器即打开它们,它们都可以; 5.在flex MXML中使用客户AMFChannel或在flex-config.xml中使用默认的AMFChannel定义,无效;
网络朋友的进步 1.http://blogs.adobe.com/lin/2011/05/duplication-session-error.html 2.http://stackoverflow.com/questions/7659775/duplicate-session-error-when-perform-proxy-lookup 这两个是无效的;
以前是否有人遇到过这种情况?任何建议,我将不胜感激。
答案 0 :(得分:3)
今天我遇到了一个Flex会话问题并遇到了这个问题。
嗯,这个问题已经很老了,所以我猜原版海报可能不再需要任何帮助了,但是对于那些偶然发现这篇文章的人来说,我可能以下信息可以帮助你。
Flex App需要Web应用程序容器(此处为tomcat)中的有效会话ID,并将实际AMF请求中找到的clientOID绑定到此sessionID。
所以原始海报的问题可能是他试图在两个tomcat实例上使用相同的会话ID,这是行不通的,因为每个tomcat实例都会为自己和内存保留会话。
我的问题是我有一个记录的jmeter测试,它不会接受记录的AMF消息中的clientID和URL中的sessionID的组合。 但是,返回的AMF错误消息在标题部分中包含有效的新会话ID。该错误消息的AMF标题看起来像那样(至少对我而言):
Version: 3
(Header #0 name=AppendToGatewayUrl, mustUnderstand=true)
";jsessionid=OLD_SESSION_ID;jsessionid=NEW_SESSION_ID"
所以我所做的就是从AMF头中提取新的会话ID,并将其用于其余的请求。
希望这对任何人都有用......