【问题标题】:JMS Message was not receving using spring JMSTemplate?JMS 消息没有使用 spring JMSTemplate 接收?
【发布时间】:2014-01-29 06:55:06
【问题描述】:

最近两天我正在为简单的任务而苦苦挣扎。我已经在 J​​boss6.x 中配置了 jms 消息队列。我在 spring 中使用 applicationcontext.xml 文件中的 jmstemplate 配置了 jndi、jms MQ,

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

    <bean id="messageListener" class="com.test.QueuereceiverDB" /> 

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

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

    <bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="cache">
            <value>true</value>
        </property>
    </bean>

    <bean id="QueueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <ref bean="queueConnectionFactory" />
        </property>
        <property name="destinationResolver">
            <ref bean="jmsDestinationResolver" />
        </property>
    </bean>

    <bean id="jmsSender" class="com.test.MessageSender">
        <property name="jmsTemplate"> <ref bean="QueueTemplate" />
        </property>
    </bean>
    <bean id="Queue" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate"> <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>queue/MyQueue</value>
        </property>
    </bean>
    <bean id="jmscontainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="5" />
        <property name="connectionFactory" ref="queueConnectionFactory" />
        <property name="destination" ref="Queue" />
        <property name="messageListener" ref="messageListener" />
    </bean>

下面是发件人

package com.test;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
public class MessageSender {
    private JmsTemplate jmsTemplate;
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void sendMesage() {
        MessageCreator messageCreator=new MessageCreator() {
        public Message createMessage(Session session) throws
        JMSException {
        return session.createTextMessage("I am sending Invoice message");}
        };

        jmsTemplate.send("queue/MyQueue", messageCreator);
    }
}

Finally 消息接收器类

public class QueuereceiverDB implements MessageListener {

    /**
     * Default constructor. 
     */
    public QueuereceiverDB() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see MessageListener#onMessage(Message)
     */

    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                System.out.println("Queue: I received a TextMessage at "
                        + new Date());
                TextMessage msg = (TextMessage) message;
                System.out.println("Message is : " + msg.getText());
            } else {
                System.out.println("Not valid message for this Queue MDB");
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }

    }

我已经在 web.xml 文件中加载了 applicationcontext.xml 文件。 之后在jboss中部署war文件没有错误,也没有收到消息。我不知道为什么没有收到消息。有人可以帮我。

添加资源引用标签后显示以下错误

Caused by: java.lang.RuntimeException: Neither any mapped-name/lookup/jndi-name specified nor any ResourceProvider could process resource-ref named env/ConnectionFactory of type javax.jms.QueueConnectionFactory
    at org.jboss.switchboard.mc.resource.provider.ResourceRefResourceProviderDelegator.provide(ResourceRefResourceProviderDelegator.java:125) [:1.0.0-alpha-15]
    at org.jboss.switchboard.mc.resource.provider.ResourceRefResourceProviderDelegator.provide(ResourceRefResourceProviderDelegator.java:44) [:1.0.0-alpha-15]
    at org.jboss.switchboard.mc.JndiEnvironmentProcessor.process(JndiEnvironmentProcessor.java:68) [:1.0.0-alpha-15]
    at org.jboss.switchboard.mc.deployer.AbstractSwitchBoardDeployer.process(AbstractSwitchBoardDeployer.java:119) [:1.0.0-alpha-15]
    at org.jboss.switchboard.mc.deployer.WebEnvironmentSwitchBoardDeployer.internalDeploy(WebEnvironmentSwitchBoardDeployer.java:66) [:1.0.0-alpha-15]
    at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:55) [:2.2.0.GA]
    at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:179) [:2.2.0.GA]

以下包含队列名称详细信息并部署在 jboss/server/default/deploy mdb-hornetq.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:hornetq"
    xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd" >

    <queue name="MyQueue2" >
        <entry name="/queue/MyQueue" />
    </queue>

</configuration>

【问题讨论】:

  • 您能否提供您实际附加已定义的 MessageListener 的接收器的代码或配置?
  • 谢谢 aniket。我没明白你到底在问什么?我已经在 applicationContext.xml 文件中定义了 MessageListener,例如 。我已经粘贴了所有源代码。你能解释一下吗?
  • 它只是一个消息监听器(异步接收消息)。你需要有一个 QueueReceiver 对象,它调用 setMessageListener() 函数来注册一个 MessageListener 是 QueuereceiverDB 是你的情况。我对 spring 不太熟悉,但你需要一个接收器/消费者对象/bean 来实际接收消息。
  • 好的,这部分由 DefaultMessageListenerContainer(DMLC) 完成。该 bean 用作接收器。我错过了。您的代码看起来与我搜索的配置一致。你真的在发送任何要接收的消息吗?
  • 是 aniket。发送方向接收方发送简单的文本消息(我正在发送 Invoice 消息)。我还在 xml 文件 (mdb.hornetq.xml) 中配置了队列名称(queue/MyQueue) 和将此文件放在 jboss/server/default/deploy 文件夹中。还有什么我错过的吗?

标签: java spring jms


【解决方案1】:

一切都正确,您能否验证在您的 web.xml 中声明了资源:

<resource-ref>
   <res-ref-name>ConnectionFactory</res-ref-name>
   <res-type>javax.jms.QueueConnectionFactory</res-type>
   <res-auth>Container</res-auth>
   <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
   <res-ref-name>queue/MyQueue</res-ref-name>
   <res-type>javax.jms.Queue</res-type>
   <res-auth>Container</res-auth>
   <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

【讨论】:

  • 谢谢 Nabil。我已经添加了这些行并运行了 jboss。它显示了一些错误。我在问题中添加了这些错误。请在上面检查。我还添加了包含队列详细信息并部署在 jboss/server/default/deploy 文件夹中的配置文件
  • 尝试在 JMS connectionFactory 的 JNDI 名称中输入一个不同的名称。示例:jms/ConnectionFactory 并将 web.xml 中的行更改为 jms/ConnectionFactory
  • 对不起 Nabil。如果我再次更改 jms/ConnectionFactory 只会显示相同的错误。知道吗?请帮帮我。
  • 您是否也更改了 JNDI 名称:ConnectionFactory 必须是 jms /ConnectionFactory
  • 是的。我已经改变了两个地方 applicationContxt.xml 和 web.xml.but 没有运气。任何想法?
猜你喜欢
  • 2011-12-12
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多