2

JAX-WSに少し問題があります。ActiveMQをMOMおよびSpringとして使用しています。メッセージングは​​非常に単純です。1つのjarが、データを含むsoapメッセージを別のjarに送信する必要があります。

私はsender_beans.xmlでこのようにクライアントを定義しました。

<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から何も呼び出さないでください。

4

1 に答える 1

0

CachingConnectionFactoryは、デフォルトでメッセージのコンシューマーとプロデューサーをキャッシュします。これを無効にするには、cacheConsumersプロパティとcacheProducersプロパティを「false」に設定します。

つまり、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は私のためにこれを解決しました。

さらに、キャッシングファクトリとシングル接続ファクトリのSpring APIを読んで、シナリオに適したものを使用していることを確認してください。これらすべてに言及しています。

于 2012-12-06T08:55:42.713 に答える