2

我对 Spring JMS 还很陌生,我在 Spring 站点和其他地方找到了很多文档和示例,但我的用例似乎没有在任何地方描述,或者至少以我能理解的方式描述。我希望你能提供帮助。

我想创建一个主题的发布者和该主题的几个持久订阅者。我现在正在处理第一个订阅者,它打算每小时运行一次(在计时器上)并耗尽消息的主题并一次处理它们(即发送一封总结所有消息的电子邮件)。

我不知道如何在 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 回答