2012-08-08 106 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)然後運行你的項目,你可以得到你需要的輸出。

謝謝。

相關問題