2

私は Spring JMS にかなり慣れていないので、Spring サイトや他の場所で多くのドキュメントと例を見つけましたが、私の使用例はどこにも説明されていないようです。少なくとも、私が理解できる方法では説明されていません。お役に立てれば幸いです。

トピックのパブリッシャーと、そのトピックに対するいくつかの永続的なサブスクライバーを作成したいと考えています。私は現在、最初のサブスクライバーに取り組んでおり、1 時間ごとに (タイマーで) 実行し、メッセージのトピックを排出して一度にすべて処理する (つまり、すべてのメッセージを要約した電子メールを送信する) ことを目的としています。

これは簡単だと思いますが、Spring でこのセットアップを構成する方法がわかりません。アドバイスは大変参考になります。

私の計画は、タイマーが「processBatch」メソッドを呼び出し、タイムアウトになるまでループで receiveAndConvert() を呼び出し、メッセージのリストを作成することでした。

ただし、消費者は実際にはトピックにサブスクライブしていないため、これはうまくいかないようです。確かに、実行前ではなく、実行後でもない可能性があります。

Spring および/またはダイレクト ActiveMQ を使用してこれを構成するにはどうすればよいですか?

XML をどこで作成したかは、このディスカッションを開始するのに役立つ場所かどうかはわかりませんが、役立つ場合に備えて提供します。

<beans>
    <!-- some unrelated beans -->

    <!-- my Active MQ connection factory -->
    <bean id="mqConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://broker"/>
            </bean>
        </property>
    </bean>

    <!-- my topic -->
    <amq:topic id="completionsTopic" physicalName="completions.topic"/>

    <!-- my subscriber -->
    <bean id="emailer" class="com.j128.Emailer">
        <property name="jmsTemplate">
            <bean class="org.springframework.jms.core.JmsTemplate">
                <property name="connectionFactory" ref="mqConnectionFactory"/>
                <property name="defaultDestination" ref="completionsTopic"/>
                <property name="receiveTimeout" value="2000"/>
            </bean>
        </property>
    </bean>

    <!-- my scheduler and periodic call to the topic drainer -->
    <task:scheduler id="taskScheduler" pool-size="10"/>
    <task:scheduled-tasks>
        <!-- send emails hourly -->
        <task:scheduled ref="emailer" method="processBatch" cron="0 * * * *"/>
    </task:scheduled-tasks>

</beans>

しかし、私は根本的に間違った戦略を持っていると確信しており、これを構成する簡単な方法があると確信しています。

ご協力いただきありがとうございます。

4

1 に答える 1

0

how-does-a-queue-compare-to-a-topic をご覧ください。「ブローカーがメッセージを受信した時点でアクティブなサブスクリプションを持っていたサブスクライバーのみが、メッセージのコピーを取得します。」

また、耐久性のあるトピックの場合、how-do-durable-queues-and-topics-work : 「しかし、耐久性のあるトピックは異なります。それぞれの耐久性のあるコンシューマーがそれぞれ独自のコピーを取得するため、すべての耐久性のあるコンシューマーに適した各メッセージのインスタンスを論理的に永続化する必要があるためです。メッセージ"

したがって、持続性のないトピックでは、メッセージが発行されたときに実行されていないため、時間単位のジョブがメッセージを取得しないため、計画は機能しません。永続的なトピックを設定するとうまくいくかもしれませんが、サブスクライバーが「メッセージのトピックを排出す​​る」と言ったときに何が起こるかによって異なります。最後の実行以降にパブリッシュされたメッセージを読み取ることができるだけであり、他のサブスクライバーに送信されるメッセージに影響を与えることはできません。

永続的なサブスクライバーに関する議論については (私は ActiveMQ でそれらを使用していません)、これを参照してください。

于 2013-06-27T19:40:14.387 に答える