ActiveMQ配置Camel + Spring空闲超时设置不起作用

时间:2014-07-31 00:35:06

标签: spring websocket apache-camel activemq stomp

我正在尝试配置一个稳定的连接,该连接不会因嵌入的ActiveMQ代理而超时。我在服务器端使用Camel + ActiveMQ + Spring进行配置。在我的代理配置中,我有以下配置,我已经尝试在传输连接器上设置connectionTimeOut,wireFormat.maxInactivityDuration = 0但是没有用,我在客户端使用StompClient连接ws://localhost:61614/stomp?useInactivityMonitor=false。连接已建立,但它在300000ms之后超时,这似乎是默认空闲时间但无法将其关闭,请帮助在哪个级别配置以确保连接不会被丢弃:

<broker id="broker" brokerName="myBroker" useShutdownHook="false" useJmx="true" dataDirectory="activemq-data"
               xmlns="http://activemq.apache.org/schema/core">
    <transportConnectors>
        <!-- vm transport for intra-jvm communication-->
        <transportConnector name="vm" uri="vm://myBroker?transport.useInactivityMonitor=false"/>
        <!-- tcp for external communication -->
        <transportConnector name="tcp" uri="tcp://localhost:61616?transport.useInactivityMonitor=false"/>
        <transportConnector name="ws" uri="ws://localhost:61614??transport.useInactivityMonitor=false"/>
        <transportConnector name="stomp" uri="stomp://localhost:61613?transport.useInactivityMonitor=false"/>
    </transportConnectors>

</broker>

<bean id="jmsConnectionFactory" 
   class="org.apache.activemq.ActiveMQConnectionFactory">
   <property name="brokerURL" value="vm://myBroker?create=false&amp;waitForStart=5000" />
</bean>

<bean id="pooledConnectionFactory" 
   class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
   <property name="maxConnections" value="12" />
   <property name="connectionFactory" ref="jmsConnectionFactory" />
   <property name="idleTimeout" value="120000" />
</bean>

<bean id="jmsConfig" 
   class="org.apache.camel.component.jms.JmsConfiguration">
   <property name="connectionFactory" ref="pooledConnectionFactory"/>
   <property name="concurrentConsumers" value="12"/>
   <property name="idleConsumerLimit" value="120000"/>
</bean>

<bean id="activemq" 
    class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig"/>
</bean>

在断开连接时将其记录在日志中:

WebSocketConnectionRFC6455     DEBUG ClosedOut WebSocketServletConnectionRFC6455 p=WebSocketParserRFC6455@3565d22 state=OPCODE buffer=null g=WebSocketGeneratorRFC6455@309b59a6 closed=false buffer=-1 1000 Idle for 300074ms > 300000ms

1 个答案:

答案 0 :(得分:1)

原来是ActiveMQ下的Jetty造成了这个问题。它有一个默认的空闲时间超过300000ms,设置传输连接器如下将时间增加到设定值,将其设置为'0'不会禁用不活动监视器,因为它建议用于“wireFormat.maxInactivityDuration = 0”,单独使用“wireFormat.maxInactivityDuration = 0”也不起作用:

<transportConnectors>
    <!-- vm transport for intra-jvm communication-->
    <transportConnector name="vm" uri="vm://myBroker"/>
    <transportConnector name="ws" uri="ws://localhost:61614?websocket.maxIdleTime=7200000"/>
</transportConnectors>

在客户端,我有匹配的URL以防万一:“ws:// localhost:61614?maxIdleTime = 7200000”。 无法在常规ActiveMQ文档或其他任何地方找到此信息。很高兴看到为这种情况更新了文档。