java - Spring - JMS,如何在应用程序启动后启动 JMS 并在应用程序关闭时不断尝试重新连接

标签 java spring spring-jms

我有一个 spring 应用程序,我试图在其中连接到 JMS activemq 服务器。我的上下文文件内容如下所示:

<bean id="amqPowerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <constructor-arg index="0" value="${power.messagebrokerurl}"/>
</bean>

<bean id="powerConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqPowerConnectionFactory"/>
</bean>

<bean id="timeSeriesChangesContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="powerConnectionFactory"/>
    <property name="destination" ref="powerEventQueue"/>
    <property name="messageListener" ref="timeSeriesDataAdapter"/>
</bean>

但如果 JMS 服务器宕机,则服务器不会在启动时初始化 spring 上下文。

我可以将 autoStartup 设置为 false,然后 spring 初始化上下文,但是我该如何手动启动这个监听器呢?

<bean id="timeSeriesChangesContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="powerConnectionFactory"/>
    <property name="destination" ref="powerEventQueue"/>
    <property name="messageListener" ref="timeSeriesDataAdapter"/>
    <property name="autoStartup" value="false"/>
</bean>

我还需要编写一个连续的循环,如果它出现故障,它将尝试重新连接到该 JMS 服务器。

最佳答案

消息监听器有一个函数 start()。 使用该函数,您可以在程序中手动启动监听器。

至于循环:我们有一个类似的问题,由于系统组件不可用,我们不得不在给定时间启动和停止监听器,我们通过计划作业实现了这一点。

下面是一个通过预定作业启动监听器的例子:

更新:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class StartStopJmsBatch {

private static final Logger LOG = LoggerFactory.getLogger(StartStopJmsBatch.class);

@Autowired
private DefaultMessageListenerContainer messageListenerContainer;

@Scheduled(cron = "0 0 * * * *")
public void startJmsConsumer() {
    if (!messageListenerContainer.isRunning()) {
        LOG.info("Started JmsListenerContainer");
        messageListenerContainer.start();
    }
}
}

我添加了类(class)的其余部分。 它使用 spring 的调度机制进行调度(特别是第 28.4 章的 take a look here) 至于 cron 表达式语法 take a look here

备选

另一种方法是使用 Spring 的 DefaultMessageListenerContainer ( take a look here ),它内置了 self 恢复功能,即使 JMS 服务器在应用程序启动时不可用,它也应该初始化 spring 上下文。

关于java - Spring - JMS,如何在应用程序启动后启动 JMS 并在应用程序关闭时不断尝试重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31535204/

相关文章:

java - Spring 是如何解析 View 的?

java - 在 MAPPER XML 中的 SELECT 语句中传递多个参数

java - 如何避免在循环中使用多个 "break"语句?

java - 使用 Grails/Java 获取 404 的正文

java - interrupt() 空闲线程而不是 wait()/notify() 会更好吗?

java - 我们应该在连接工厂上调用 setClientId() 吗?

java - Spring : JMS Consumer Sessions/Connections not removed on Message Broker post Batch Job Completion

java - Spring JMSListener - 它应该如何处理空负载?

java - 多个 QueueConnectionFactory 上的异常

java - Mysql 5.5 访问被拒绝 <-- Jboss 7