0

我在 JBoss 7 JMS 集群上运行 Spring webapp 时遇到问题。

我通过这篇文章设置了 JMS 集群- 集群正在使用共享日志。我正在使用示例中的 live1 和 backup1配置。例如,使用包含消息驱动 Bean 的应用程序在实时服务器和备份服务器之间切换是有效的。

我创建了注册 JMS 侦听器的简单 Spring Web 应用程序。

我的 jms-config.xml 在这里:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="ConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="ConnectionFactory" />
    </bean>

    <bean id="testQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jms/queue/test" />
    </bean>

    <bean id="listener" class="eu.cuptech.jms.ExampleListener" />

    <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="ConnectionFactory" />
        <property name="destination" ref="testQueue" />
        <property name="messageListener" ref="listener" />
    </bean>

</beans>

ExampleListener.java 看起来像这样:

package eu.cuptech.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class ExampleListener implements MessageListener {

    public void onMessage(Message message) {
        try {
            String msg = ((TextMessage) message).getText();
            System.out.println("MESSAGE TEXT: " + msg);
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }

}

当我启动实时服务器时,消息由 ExampleListener 处理 - 没关系。当我启动备份服务器时,我收到错误javax.naming.NameNotFoundException,因为ConnectionFactory没有在备份服务器的 JNDI 下公开 - 那么只有主服务器在工作,它不是集群。当实时服务器出现故障时,这里没有备份。

当我尝试为 ConnectionFactory 和 testQueue 设置lazy-init="true"loadOnStartup="false"(+代理接口)时,没有任何变化,因为 listenerContainer 将在备份服务器启动时创建它。我需要 listenerContainer 将等到备份服务器启用,然后连接到队列。

我也尝试过jms/RemoteConnectionFactory,但结果相同 - JNDI 名称下的资源在备份服务器上不可用。

这是一个使用 maven (Eclipse 项目)构建的webapp 源代码。mvn package这是一个简单的 JMS客户端源代码(Eclipse 项目)。

4

1 回答 1

0

注意,备份服务器是一个被动的 HornetQ 消息服务器,在故障转移之前不能有任何生产者或消费者。

HornetQ 文档(实时 - 备份组):http ://docs.jboss.org/hornetq/2.3.0.Final/docs/user-manual/html_single/#d0e11266

于 2013-07-30T20:09:10.763 回答