3

ActiveMQ 5.7.0を使用していて、再配信ポリシーを実装しようとしています。再配信ポリシーを設定する必要がある2つのキューがあります。ただし、テストでは、私のポリシーは適用されません。以下の構成に従う代わりに、1秒間隔で7回再試行します(私が指定したものではありません)。

  <!--  ActiveMQ destinations to use  -->
  <amq:queue id="destinationOne" physicalName="${activemq.one.queuename}">
    <amq:properties>
        <amq:redeliveryPolicy destination="One.DLQ" maximumRedeliveries="5" initialRedeliveryDelay="300000" useExponentialBackOff="true" backOffMultiplier="2" maximumRedeliveryDelay="3600000"/>
    </amq:properties>
  </amq:queue>
  <amq:queue id="destinationTwo" physicalName="${activemq.two.queuename}">
    <amq:properties>
        <amq:redeliveryPolicy destination="Two.DLQ" maximumRedeliveries="5" initialRedeliveryDelay="300000" useExponentialBackOff="true" backOffMultiplier="2" maximumRedeliveryDelay="3600000"/>
    </amq:properties>
  </amq:queue>

2つのリスナーを定義し、次のようにキューを適用しています。

  <bean id="oneMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="destination" ref="destinationOne"/>
    <property name="messageListener" ref="jmsOneListener" />
    <property name="autoStartup" value="false" />    
    <property name="sessionTransacted" value="true"/>
    <property name="concurrentConsumers" value="2" />
  </bean>
  <bean id="twoMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="destination" ref="destinationTwo"/>
    <property name="messageListener" ref="jmsTwoListener" />
    <property name="autoStartup" value="false" />    
    <property name="sessionTransacted" value="true"/>
    <property name="concurrentConsumers" value="2" />
  </bean>
4

4 に答える 4

4

Tim の答えに同意します。ポリシーは、基になる接続ファクトリ オブジェクトで定義されます。あなたのシナリオでは、2 つの個別の ActiveMQ 接続ファクトリを独自のポリシーで定義し、それぞれに個別の Spring 接続ファクトリを定義して、適切に使用する必要があると思います。

以前に ActiveMQ v5.5 で使用した例を次に示します。

<bean id="rawConnectionFactory1" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${broker.url}" />
    <property name="redeliveryPolicy" ref="policy1" />
    <property name="useCompression" value="true" />
</bean>
<bean id="rawConnectionFactory2" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${broker.url}" />
    <property name="redeliveryPolicy" ref="policy2" />
    <property name="useCompression" value="true" />
</bean>


<bean id="policy1" class="org.apache.activemq.RedeliveryPolicy">
    <property name="initialRedeliveryDelay" value="20000" />
    <property name="useExponentialBackOff" value="false" />
    <property name="useCollisionAvoidance" value="false" />
    <property name="maximumRedeliveries" value="0" />
</bean>
<bean id="policy2" class="org.apache.activemq.RedeliveryPolicy">
    <property name="initialRedeliveryDelay" value="60000" />
    <property name="useExponentialBackOff" value="false" />
    <property name="useCollisionAvoidance" value="false" />
    <property name="maximumRedeliveries" value="5" />
</bean>


<bean id="connectionFactory1" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="rawConnectionFactory1" />
    <property name="sessionCacheSize" value="30" />
</bean>
<bean id="connectionFactory2" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="rawConnectionFactory2" />
    <property name="sessionCacheSize" value="10" />
</bean>
于 2012-12-18T08:54:59.820 に答える
3

再配信ポリシー インスタンスは、ActiveMQConnectionFactory RedeliveryPolicy プロパティ設定を介して MessageConsumers に設定されます。スニペットからは、構成が何をしているのかよくわかりませんが、正しく見えません。

于 2012-12-13T23:51:18.017 に答える
3

何度か再試行した後、amq 名前空間を使用して動作するバージョンを取得しました。

<amq:connectionFactory brokerURL="..." id="connectionFactory">
    <amq:redeliveryPolicyMap>
        <amq:redeliveryPolicyMap><!-- Don't know why a double nesting -->
            <amq:defaultEntry>
                <!-- default policy, 5 times with 10s delay each -->
                <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="10000" />
            </amq:defaultEntry>
            <amq:redeliveryPolicyEntries>
                <!-- three times with exponential back-off, that is, 1s, 2s, 4s, 8s. "queue" references to the "physicalName" defined in amq:queue -->
                <amq:redeliveryPolicy queue="queue.thread.autopay" maximumRedeliveries="3" initialRedeliveryDelay="1000" backOffMultiplier="2" useExponentialBackOff="true" />
                <!-- another policy mapping -->
                <amq:redeliveryPolicy queue="queue.thread.doc" maximumRedeliveries="2" initialRedeliveryDelay="4000" />
            </amq:redeliveryPolicyEntries>
        </amq:redeliveryPolicyMap>
    </amq:redeliveryPolicyMap>
</amq:connectionFactory>
于 2013-12-04T11:35:56.307 に答える