首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring3.05和JBoss 5.1 (JBossMQ)实现JMS本地队列?

如何使用Spring3.05和JBoss 5.1 (JBossMQ)实现JMS本地队列?
EN

Stack Overflow用户
提问于 2016-08-24 17:58:12
回答 1查看 1.4K关注 0票数 0

有一个基于Spring3.0.5框架的应用程序,运行在JBoss 5.1服务器上。

我试着遵循这个教程,但是它使用ActiveMQ broker而不是JBossMQ (默认的JBoss 5.1 broker)。

我已经在一个名为MyQueue的JBoss配置中设置了一个队列(目的-service.xml):

代码语言:javascript
复制
<mbean code="org.jboss.jms.server.destination.QueueService"
  name="jboss.messaging.destination:service=Queue,name=MyQueue"
  xmbean-dd="xmdesc/Queue-xmbean.xml">
  <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  <depends>jboss.messaging:service=PostOffice</depends>

您可以在下面看到我配置的其余部分。我遗漏了什么?如何指定队列和连接工厂的JNDI名称?那么服务器地址(ConnectionFactory Connector ://localhost:4457)呢?

我在applicationContext.xml中的配置如下:

代码语言:javascript
复制
<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" />

<bean id="messageDestination" class="javax.jms.Queue" />

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="receiveTimeout" value="10000" />
</bean>

<bean id="springJmsProducer" class="myPackage.QueueProducer">
    <property name="destination" ref="messageDestination" />
    <property name="jmsTemplate" ref="jmsTemplate" />
</bean> 

<bean id="messageListener" class="myPackage.QueueConsumer" />

我的制片人

代码语言:javascript
复制
 public class QueueProducer {

    private JmsTemplate jmsTemplate;

    private Queue queue;

    public void setConnectionFactory(ConnectionFactory cf) {
        this.jmsTemplate = new JmsTemplate(cf);
    }

    public void setQueue(Queue queue) {     
        this.queue = queue;
    }

    public void send(Object object) {
        this.jmsTemplate.send(this.queue, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
              return session.createTextMessage("my text to send");
            }
        });
    }
}

我的消费者

代码语言:javascript
复制
public class QueueConsumer implements MessageListener {

    @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                System.out.println(((TextMessage) message).getText());
            }catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
        else {
            throw new IllegalArgumentException("Message must be of type TextMessage");
        }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 20:20:31

您最想要的是jndiTemplate。而且,您没有完全正确地将jmsTemplate bean连接在一起。下面是一个接一个的解释,说明您在中需要什么。

您需要设置一个jndiTemplate来注入JBoss JNDI实现:

代码语言:javascript
复制
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">
                org.jnp.interfaces.NamingContextFactory
            </prop>
            <prop key="java.naming.provider.url">
                jnp://localhost:1099
            </prop>
            <prop key="java.naming.factory.url.pkgs">
                org.jboss.naming:org.jnp.interfaces
            </prop>
        </props>
    </property>
</bean>

然后,将ConnectionFactory配置为指向上述JNDI配置:

代码语言:javascript
复制
<!-- spring JMS definition -->
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="ConnectionFactory" />
</bean>

使用上面的ConnectionFactory配置事务管理器:

代码语言:javascript
复制
<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

将目标与jndiTemplate和jndiName相关联:

代码语言:javascript
复制
<!-- jms destination already defined in jboss -->
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="queue/MyQueue" />
</bean>

最后,将jmsTemplate本身配置为指向ConnectionFactory,并准备在代码中使用JmsTemplate:

代码语言:javascript
复制
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
</bean>

您还需要消息侦听器容器配置来运行您的使用者。将"jmsexample.ExampleListener“替换为包含MessageListener的类的名称:

代码语言:javascript
复制
<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="jmsexample.ExampleListener" />

<!-- and this is the message listener container -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destination" ref="myQueue"/>
    <property name="messageListener" ref="messageListener" />
</bean>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39130069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档