gpt4 book ai didi

java - 在不丢失 JMS 连接的情况下重新启动服务器

转载 作者:行者123 更新时间:2023-11-29 06:16:57 25 4
gpt4 key购买 nike

我有两个应用服务器。一个使用 JMS 向另一个发送消息。发送方在 Tomcat 上运行,在 Spring Framework 模板方法调用中使用 ActiveMQ。接收器在 Jetty 上运行。

问题是,当我重新启动其中一台服务器(消息的接收方)时,它在重新启动后不会再收到任何 JMS 消息,直到另一台服务器也重新启动。我不确定为什么会这样。有没有办法只需要重启一台服务器?

发件人 XML 配置:

<bean id="producerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<bean
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="jmsFactory"/>
</bean>
</property>
</bean>

<bean id="simulationMessageSender" class="com.forio.simulate.activemq.SimulationMessageSenderImpl">
<constructor-arg ref="producerJmsTemplate"/>
</bean>

<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"
autowire="constructor">
<constructor-arg value="com.forio.simulate.activemq"/>
</bean>

发送者java代码:

public void send(final SimulationMessage simulationMessage) throws JMSException
{
jmsTemplate.send(destination, new MessageCreator()
{
public Message createMessage(Session session) throws JMSException
{
Log.debug("Sending message: " + simulationMessage);
ObjectMessage message = session.createObjectMessage(simulationMessage);
message.setStringProperty("simulationMessage", "true");
return message;
}
});
}

接收器 XML 配置:

<bean id="brokerContainer" class="org.apache.activemq.xbean.BrokerFactoryBean">
<property name="config" value="classpath:activemq.xml" />
</bean>

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.url}" />
</bean>

<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"
autowire="constructor">
<constructor-arg>
<value>com.forio.simulate.activemq</value>
</constructor-arg>
</bean>

<bean id="messageListener"
class="com.forio.simulate.activemq.SimulationMessageListener">
<property name="messageConverter">
<bean
class="com.forio.simulate.activemq.converter.SimulationMessageConverter" />
</property>
<property name="simulationMessageService" ref="simulationMessageService"/>
</bean>

<bean
class="org.springframework.jms.listener.SimpleMessageListenerContainer" init-method="start">
<property name="connectionFactory" ref="jmsFactory" />
<property name="destination" ref="destination" />
<property name="concurrentConsumers" value="3" />
<property name="messageListener" ref="messageListener" />
</bean>

<bean id="consumerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory" />
</bean>

最佳答案

这是因为您正在使用 SingleConnectionFactory。每次调用 SingleConnectionFactory.createConnection() 时,它都会返回相同的连接,即使它已通过重新启动接收服务器关闭。也许 CachingConnectionFactory 会满足您的需求,因为它有一些异常恢复机制。

关于java - 在不丢失 JMS 连接的情况下重新启动服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com