3

最初に、ブローカ接続がシャットダウンされて再起動されたときにアプリケーションに再接続するように JMS MQ を構成する方法について質問があります。

以下は私が試したものです、

これは、最初に spring-mq-jms-connections.xml にあった構成です

<!-- Spring JMS Queue Connection Factory -->
        <!--
        <bean id="jmsQueueConnectionFactory.7"
            class="org.springframework.jms.connection.SingleConnectionFactory"  >
            <property name="targetConnectionFactory">
                <ref bean="internalJmsQueueConnectionFactory.7"/>
            </property>
        </bean> -->

これを、「SingleConnectionFactory」をラップする「DefaultMessageListenerContainer」を導入した以下の構成に置き換えました。

<bean id="jmsQueueConnectionFactory.7" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory">
            <ref bean="single.connection.factory.7"/>
        </property>

        <property name="recoveryInterval" value="5000"/>

    </bean>

    <bean id="single.connection.factory.7" class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory">
        <ref bean="internalJmsQueueConnectionFactory.7"/>
    </property>
    </bean>

しかし、この構成の変更後、以下の例外が発生し始めました。

Failed to configure emapi:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'senderAgent.7' defined in URL 
[file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Cannot resolve reference to bean 'jmsQueueTemplate.7' while setting bean property 'jmsTemplate';
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'jmsQueueTemplate.7' defined in URL 
[file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Cannot resolve reference to bean 'jmsQueueConnectionFactory.7' while setting bean property 'connectionFactory'; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'jmsQueueConnectionFactory.7' defined in URL [file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
Property 'destination' or 'destinationName' is required
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1244)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1008)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)

'destination' または 'destinationName' が必要であると表示されます。レガシー コードを扱っています。これを探す場所がわからないか、構成を変更したときに正しいことを行っています。

例外が原因でブローカー接続がダウンしたとき、または再起動したときに OpenMQ をアプリケーションに再接続するためのより良い方法があるかどうかを提案してください。例外リスナーを使用してSpring JMS接続ファクトリーも調べましたが、わかりませんでした。

4

1 に答える 1

1

ADefaultMessageListenerContainerはリスナー コンテナー (ブローカーからメッセージを受信するために使用) であり、接続ファクトリーではありません。

再接続する手段としてのみ使用している場合は、「リッスン」するためのダミー キューが必要です。

編集:以下のコメントに応じて更新されました。

Spring Integration の使用を検討してください。自動的にフェイルオーバーするように構成できます。何かのようなもの

<int:gateway service interface="foo.Bar" default-request-channel="foo" />

<int:channel id="foo">
    <int:dispatcher load-balancer="false"/>
<int:channel/>

<int-jms:outbound-channel-adapter channel="foo" order="1" ... />

<int-file:outbound-channel-adapter channel="foo" order="2" mode="APPEND" ... />

デフォルトでは、ディスパッチャはロード バランシングをオフにして 2 つのアダプタにロード バランシング (ラウンド ロビン) し、常に JMS に送信してファイルにフェイルオーバーします。

Spring Integrationには、エラー処理、アダプターへの再試行アドバイスの追加などのための多くの機能もあります。

Spring Integration を使用したくない場合は、単に次のようなことを行うことができます...

try {
    this.jmsTemplate.send(...);
}
catch (Exception e) {
    writeToFile(...);
}
于 2013-07-18T17:12:58.727 に答える