2012-08-08 109 views
2

我是Spring Integration和JMS的新手,我开始使用它。在这里我想通过activemq创建简单的jms消息并通过弹簧入站适配器(消息驱动)接收它。通过Spring集成入站适配器接收JMS消息随机失败

以下是我的Spring配置文件

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

<!-- jms beans --> 
<beans:bean id="jms.msgQueue" class="org.apache.activemq.command.ActiveMQQueue"> 
    <beans:constructor-arg value="MSG_QUEUE" /> 
</beans:bean> 

<beans:bean name="jms.connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <beans:property name="brokerURL" value="tcp://localhost:61616" /> 
</beans:bean> 


<!-- spring integration beans --> 
<channel id="channels.jms.allMessages"> 
    <queue capacity="1000" /> 
</channel> 

<jms:message-driven-channel-adapter id="adapters.jms.msgAdapter" 
      connection-factory="jms.connectionFactory" 
      destination="jms.msgQueue" 
      channel="channels.jms.allMessages" /> 

,这是我的测试类

package com.bst.jms; 

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.integration.Message; 
import org.springframework.integration.core.PollableChannel; 

public class TestActiveMQ { 

public static void main(String[] args){ 

    try{ 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-context.xml"); 
     ConnectionFactory connectionFactory = (ConnectionFactory)context.getBean("jms.connectionFactory"); 
     Destination destination = (Destination)context.getBean("jms.msgQueue"); 
     PollableChannel msgChannel = (PollableChannel) context.getBean("channels.jms.allMessages", PollableChannel.class); 

     Connection connection = connectionFactory.createConnection(); 
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 


     MessageProducer producer = session.createProducer(destination); 

     TextMessage textMessage = session.createTextMessage(); 
     textMessage.setText("Message from JMS"); 
     producer.send(textMessage); 


     System.out.println("--------------- Message Sending ------------------------"); 

     Message<?> received = msgChannel.receive(); 
     String payload = (String) received.getPayload(); 

     System.out.println("Receving message = " + payload); 
    }catch(JMSException ex){ 
     System.out.println("----------- JMS Exception --------------"); 
    } 

} 

}

但这事我不能保证交货。在5000毫秒重试 - :有时程序无法接收消息和一些大部头它有一些警告成功象

Setup of JMS message listener invoker failed for destination 'queue://MSG_QUEUE' - trying to recover. Cause: Connection reset 
Could not refresh JMS Connection for destination 'queue://MSG_QUEUE' - retrying in 5000 ms. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect 

无法刷新JMS连接的目标“// MSG_QUEUE队列”。原因:无法连接到代理URL:tcp:// localhost:61616。原因:java.net.ConnectException:连接被拒绝:连接

发生这种情况几次才成功。

你们对此有什么想法。

感谢您的帮助。

感谢, keth

回答

3

这只是意味着经纪人没有运行监听器容器启动时。在使用tcp:// URL时,您应该在创建此上下文之前在其自己的上下文(或另一个JVM)中运行代理。

2

我测试了这些代码在我的STS工作正常。

你身边唯一的问题是,首先启动消息代理(比如说ActiveMQ)然后运行你的项目,你可以得到你需要的输出。

谢谢。

相关问题