【发布时间】:2012-06-26 04:22:30
【问题描述】:
我正在尝试为 JMS 队列编写通道适配器。我想向 JMS 队列发送消息并在 Spring Integration 的频道上接收它。
当我使用纯 JMS(带有 ActiveMQ)时,一切正常,所以我认为错误在我的 Spring 代码中。
这是我的 Spring 配置文件:
<?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:int="http://www.springframework.org/schema/integration"
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/jms
http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd">
<!-- jms beans -->
<bean id="jms.msgQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="MSG_QUEUE" />
</bean>
<bean name="jms.connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<!-- spring integration beans -->
<int:channel id="channels.jms.allMessages">
<int:queue capacity="1000" />
</int:channel>
<jms:inbound-channel-adapter id="adapters.jms.msgAdapter"
connection-factory="jms.connectionFactory"
destination="jms.msgQueue"
channel="channels.jms.allMessages">
<int:poller fixed-rate="500" />
</jms:inbound-channel-adapter>
</beans>
这里是简单的 JMS 发送-接收代码,可以正常工作:
@Test
public void testPlainJms() throws JMSException {
MessageProducer producer = session.createProducer(msgQueue);
MessageConsumer consumer = session.createConsumer(msgQueue);
// send to JMS queue
TextMessage textMessage = session.createTextMessage();
textMessage.setText("Message from JMS");
producer.send(textMessage);
connection.start();
javax.jms.Message message = consumer.receive(TIMEOUT);
assertEquals("Message from JMS", ((TextMessage) message).getText());
connection.stop();
}
这里是使用 Spring 的 MessageChannel 的代码,它通常不起作用(有时会起作用,但我无法确定何时):
@Test
public void testInboundAdapter() throws JMSException {
MessageProducer producer = session.createProducer(msgQueue);
// send to JMS queue
TextMessage textMessage = session.createTextMessage();
textMessage.setText("Message from JMS");
producer.send(textMessage);
// receive in local channel (using inbound adapter)
Message<?> received = ((PollableChannel) msgChannel).receive(TIMEOUT);
String payload = (String) received.getPayload();
assertEquals("Message from JMS", payload);
}
我收到来自可轮询 msgChannel 的消息时收到 NullPointerException。以下是我如何将 Spring 配置中的 bean 自动装配到我的测试类:
@Autowired @Qualifier("jms.msgQueue")
Queue msgQueue;
@Autowired @Qualifier("channels.jms.allMessages")
MessageChannel msgChannel;
@Autowired
ConnectionFactory connectionFactory;
【问题讨论】:
-
你是如何注入会话的?该文档仅讨论基于 FTP 的会话。 static.springsource.org/spring-integration/docs/latest-ga/…
标签: spring jms activemq spring-integration