2012-11-28 69 views
2

我在JAX-WS中遇到了一些問題。我使用ActiveMQ作爲MOM和Spring。消息傳遞非常簡單:一個ja​​r應該發送帶有一些數據的soap消息給另一個。 我定義了客戶這樣在我sender_beans.xmlJAX-WS:連接不會關閉 - 在x消息後停止消息傳遞

<bean id="jmsConfig-Manager" class="org.apache.cxf.transport.jms.JMSConfiguration" 
    p:connectionFactory-ref="jmsConnectionFactory" 
    p:targetDestination="activemq:example.manager" 
    p:pubSubDomain="true" p:maxConcurrentConsumers="40" p:deliveryMode="1" 
    p:explicitQosEnabled="true" p:reconnectOnException="true" /> 

<bean id="jmsConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="sessionCacheSize" value="40" /> 

    <property name="targetConnectionFactory"> 
     <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
      <property name="brokerURL" 

       value="tcp://localhost:61616?jms.useAsyncSend=true" /> 
     </bean> 
    </property> 
</bean> 

這是我的終點:

<jaxws:endpoint id="ManagerService" implementor="#ManagerServ" 
    implementorClass="com.example.Service" 
    address="jms://"> 
    <jaxws:features> 
     <bean class="org.apache.cxf.transport.jms.JMSConfigFeature" 
      p:jmsConfig-ref="jmsConfig-Manager" /> 
    </jaxws:features> 
</jaxws:endpoint> 
<bean id="jmsConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="sessionCacheSize" value="40" /> 

    <property name="targetConnectionFactory"> 
     <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
      <property name="brokerURL" 

       value="tcp://localhost:61616?jms.useAsyncSend=true" /> 
     </bean> 
    </property> 
</bean> 

因此,消息的工作 - 但只有40倍! (這是有史以來p的值:maxConcurrentConsumers)。我認爲問題在於,每次發送消息時,都會創建一個新消費者,但不會銷燬。所以在40條消息之後,不能創建新的消費者並且消息停止工作。我必須重新啓動完整的消息傳遞。 我只能使用聲明的方式來解決這個問題,我從來沒有從我的代碼中調用jms中的任何東西。 有沒有人解決?這是真的急了,我希望有人能幫助我:-)

回答

0

默認CachingConnectionFactory將緩存信息消費者和生產者。您可以通過將cacheConsumers和cacheProducers屬性設置爲'false'來禁用此功能。

I.e.爲您的Spring XML:

<bean id="jmsConnectionFactory" 
class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="sessionCacheSize" value="40" /> 
    <property name="cacheConsumers" value="false" /> 
    <property name="targetConnectionFactory"> 
... 

我有一個最近的問題,即消費者對象上調用.close()(我仍然可以看到ActiveMQ的管理控制檯上的活動的消費者,當程序創建的消息使用者並沒有被破壞)。 cacheConsumers = false爲我解決了這個問題。

此外,讀取高速緩存和單連接工廠春節API,以確保您使用的是正確的爲您的方案 - 他們提到了這一切。