2014-01-10 111 views
2

我最近两天在简单的任务中挣扎。我已经在Jboss6.x中配置了jms消息队列。我已经配置JNDI,JMS MQ在applicationContext.xml文件使用JmsTemplate的弹簧,JMS消息未使用spring JMSTemplate接收?

<?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); 
    } 
} 

最后消息接收器类

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文件中的.xml文件。 在jboss中部署war文件后,没有错误,也没有收到消息。我不知道为什么没有收到消息。可以有人帮助我。

加入resourc-REF标签后,它显示了以下错误

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 /服务器/ 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> 
+0

你能提供代码或接收到你真正重视了MessageListener的配置您已经定义? –

+0

谢谢aniket.I不知道你到底在问什么?我在applicationContext.xml文件中定义了MessageListener,比如。我粘贴了所有的源代码。你能解释一下吗? – Ami

+0

这仅仅是一个消息监听器(用来接收消息异步)。你需要有它调用调用setMessageListener()函数来注册一个MessageListener是QueuereceiverDB是你的情况下的QueueReceiver对象。我对春天不太了解,但你需要一个接收器/消费者对象/ bean来实际接收消息。 –

回答

0

所有是正确的,你可以验证在web.xml你有ressources声明:

<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> 
+0

谢谢Nabil.I已经添加了这些行并运行jboss.It显示了一些错误。我在问题中添加了这些错误。请在上面进行检查。我还增加了配置包含队列的详细文件,并部署在JBoss中/服务器/ default/deploy目录文件夹 – Ami

+0

尝试把在JMS连接不同名称的JNDI名称。例如:JMS/ConnectionFactory和改变在web.xml至 JMS/ConnectionFactory的 Nabil

+0

对不起Nabil.If变i JMS/ConnectionFactory的行再次显示同样的错误。任何想法?请帮帮我。 – Ami

相关问题