2

场景描述: 我的程序是flex+java+blazeDS+activeMQ实现的,它通过Flex Consumer从activeMQ订阅jms消息,目前我在同一个服务器上交付了两个tomcat,它们都包含我的程序,而ActiveMQ在另一个服务器,现在我在同一种浏览器中打开这两个应用程序,例如 IE 或 Chrome,无论如何,url 就像http://localhost: 8080 /HelloWord/index.html , http://localhost: 8181 / HelloWord/index.html

问题: 第一个应用程序 url 是http://localhost: 8080 /HelloWord/index.html,我在 ie 中打开它,它可以很好地订阅消息,但是当我打开第二个 url 是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。在 org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692) 在 org.springframework.aop 的 net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 的 invoke()。框架.ReflectiveMethodInvocation。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() at org.springframework.flex.servlet.MessageBrokerHandlerAdapter.handle(MessageBrokerHandlerAdapter.java:108) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) at org.springframework.web.servlet .DispatcherServlet.doService(DispatcherServlet.java:716) 在 org.springframework.web.servlet。FrameworkServlet.processRequest(FrameworkServlet.java:647) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at 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.authenticator.AuthenticatorBase 的 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 的 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)。在 org.apache.catalina.core.StandardHostValve 调用(AuthenticatorBase.java:462)。调用(StandardHostValve.java:164)在 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) 在 java。 util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker。运行(ThreadPoolExecutor.java:908)

我所做的测试: 1.FlexClient.getInstance().id = UIDUtil.createUID(); 无效 2.FlexClient.getInstance().id = null; 无效 3.使用不同的浏览器,一个用ie,一个用chrome,打开两个应用,都可以;4.一个服务器一个tomcat,用同类型的浏览器ie打开就可以了;5.使用flex MXML中的customer 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 这两项无效;

以前有人遇到过这种情况吗?任何建议我都会感激。

4

1 回答 1

3

今天我也遇到了一个 Flex Session Problem 并遇到了这个 SO question。

好吧,这个问题已经很老了,所以我想原始海报可能不再需要任何帮助,但是对于偶然发现这篇文章的人,我也许以下信息可以帮助你。

Flex 应用程序需要来自 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,并将其用于其余请求。

希望这对任何人都有用...

于 2015-04-27T17:06:40.193 回答