Перезагрузите сервер без потери соединения JMS - PullRequest
1 голос
/ 23 января 2011

У меня есть два сервера приложений.Один отправляет сообщения другому, используя JMS.Отправитель работает в Tomcat, а ActiveMQ используется внутри вызова метода Spring Framework.Приемник работает на 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>

1 Ответ

3 голосов
/ 23 января 2011

Это потому, что вы используете SingleConnectionFactory. каждый раз, когда вызывается SingleConnectionFactory.createConnection(), он возвращает одно и то же соединение, даже после того, как оно было закрыто при перезапуске вашего принимающего сервера. Может быть, CachingConnectionFactory подойдет для ваших нужд, поскольку у него есть механизм восстановления по исключению.

...