2011-04-19 142 views
1

我使用BlazeDS的發佈/訂閱方法和flex_sdk_4.1開發顯示數據網格和圖表實時事件生成使用超能力Flex應用程序與客戶端連接的數量增加了兩倍。用actionscript編寫的messageHandler()檢索通過JMS傳遞的事件。當我在Tomcat服務器上運行此應用程序時,它對於一個連接運行良好,但是,如果我同時增加客戶端連接數,則事件會根據連接數量增加一倍或三倍。我需要顯示數據而不重複。任何人都可以幫助我解決這個錯誤。提前致謝。以下代碼是Flex配置文件供您參考。如何避免數據越來越一倍或

消息-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<service id="message-service" 
    class="flex.messaging.services.MessageService"> 
    <adapters> 
     <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" /> 
     <!-- <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> --> 
    </adapters> 
    <default-channels> 
     <channel ref="my-longpolling-amf"/> 
    </default-channels> 
    <destination id="sensordata"> 
    <properties>  
     <server> 
     <allow-subtopics>true</allow-subtopics>  
     </server> 
    </properties> 
    </destination> 
</service> 

的remoting-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<service id="remoting-service" 
    class="flex.messaging.services.RemotingService"> 
    <adapters> 
     <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/> 
    </adapters> 
    <default-channels> 
     <channel ref="my-amf"/> 
    </default-channels> 
<destination id="Esperjms"> 
    <properties> 
    <source>jmsesper.flexserver.jmsConsumer.jmsConsumer</source> 
    </properties>  
</destination> 

services.config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<services-config> 
    <services> 
     <service-include file-path="remoting-config.xml" /> 
     <service-include file-path="proxy-config.xml" />  
     <service-include file-path="messaging-config.xml" />   
    </services> 
    <security> 
     <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/> 
     <!-- Uncomment the correct app server 
     <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss"> 
     <login-command class="flex.messaging.security.JRunLoginCommand" server="JRun"/>   
     <login-command class="flex.messaging.security.WeblogicLoginCommand" server="Weblogic"/> 
     <login-command class="flex.messaging.security.WebSphereLoginCommand" server="WebSphere"/> 
     --> 
     <!-- 
     <security-constraint id="basic-read-access"> 
      <auth-method>Basic</auth-method> 
      <roles> 
       <role>guests</role> 
       <role>accountants</role> 
       <role>employees</role> 
       <role>managers</role> 
      </roles> 
     </security-constraint> 
     --> 
    </security> 
    <channels> 
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"> 
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> 
     </channel-definition> 
     <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel"> 
      <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/> 
      <properties> 
       <add-no-cache-headers>false</add-no-cache-headers> 
      </properties> 
     </channel-definition> 
     <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel"> 
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/> 
      <properties> 
       <polling-enabled>true</polling-enabled> 
       <polling-interval-seconds>1</polling-interval-seconds> 
      </properties> 
     </channel-definition> 
    <channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel"> 
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/>    
     <properties>    
     <user-agent-settings> 
        <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="1"/> 
        <user-agent match-on="Firefox" kickstart-bytes="0" max-streaming-connections-per-session="10"/> 
      <user-agent match-on="Chrome" max-streaming-connections-per-session="5"/> 
       </user-agent-settings> 
     </properties> 
     </channel-definition> 
    <channel-definition id="my-longpolling-amf" class="mx.messaging.channels.AMFChannel"> 
     <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amflongpolling" class="flex.messaging.endpoints.AMFEndpoint"/> 
     <properties> 
      <polling-enabled>true</polling-enabled> 
      <polling-interval-seconds>5</polling-interval-seconds> 
      <wait-interval-millis>60000</wait-interval-millis> 
      <client-wait-interval-millis>1</client-wait-interval-millis> 
      <max-waiting-poll-requests>200</max-waiting-poll-requests> 
        <user-agent-settings> 
       <user-agent match-on="Chrome" max-streaming-connections-per-session="5"/> 
        </user-agent-settings> 
     </properties> 
    </channel-definition> 
     <!-- 
     <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel"> 
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/> 
     </channel-definition> 
     <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel"> 
      <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/httpsecure" class="flex.messaging.endpoints.SecureHTTPEndpoint"/> 
      <properties> 
       <add-no-cache-headers>false</add-no-cache-headers> 
      </properties> 
     </channel-definition> 
     --> 
    </channels> 
    <logging> 
     <target class="flex.messaging.log.ConsoleTarget" level="Error"> 
      <properties> 
       <prefix>[BlazeDS] </prefix> 
       <includeDate>false</includeDate> 
       <includeTime>false</includeTime> 
       <includeLevel>false</includeLevel> 
       <includeCategory>false</includeCategory> 
      </properties> 
      <filters> 
       <pattern>Endpoint.*</pattern> 
       <pattern>Service.*</pattern> 
       <pattern>Configuration</pattern> 
      </filters> 
     </target> 
    </logging> 
    <system> 
     <redeploy> 
      <enabled>false</enabled> 
      <!-- 
      <watch-interval>20</watch-interval> 
      <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watch-file> 
      <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file> 
      <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file> 
      <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file> 
      <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file> 
      <touch-file>{context.root}/WEB-INF/web.xml</touch-file> 
      --> 
     </redeploy> 
    </system> 
</services-config> 

回答

0

該應用程序集成了實現pub/sub方法的ActiveMQ。在現有場景中,爲「主題」創建了會話,該事件根據消費者啓用的連接數排隊該事件並將其出隊兩倍或三倍。

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL); 
     javax.jms.Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     // Destination represents here our queue 'TESTQUEUE' 
     Destination destination = session.**createTopic("TESTQUEUE")**; 
     // MessageProducer is used for sending messages (as opposed to MessageConsumer which is used for receiving them) 
     producer = session.createProducer(destination); 

當爲Queue創建會話時,此錯誤已被清除,如下所示。變化在這兩個生產者和消費者的文件來完成

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL); 
     javax.jms.Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     // Destination represents here our queue 'TESTQUEUE' 
     Destination destination = session.**createQueue("TESTQUEUE")**; 
     // MessageProducer is used for sending messages (as opposed to MessageConsumer which is used for receiving them) 
     producer = session.createProducer(destination);