IMO 最简单的方法是使用具有Gateways 概念的Spring Integration(另请参阅Enterprise Integration Patterns)。你可以只指定一个service-interface,它有一个带有返回值的方法。类似的东西
public interface MessageProducer {
@Gateway
public String sendMessageAndGetReply(String name);
}
将创建接口的代理。当您从 <int:gateway> 元素引用它时。类似的东西
<int:channel id="requestChannel"/>
<int:channel id="replyChannel"/>
<int:gateway id="messageProducerGateway" default-request-channel="requestChannel"
default-reply-channel="replyChannel"
service-interface="demo.MessageProducer">
</int:gateway>
<int-jms:outbound-gateway id="outboundJmsGateway"
connection-factory="connectionFactory" reply-channel="replyChannel"
request-channel="requestChannel" reply-destination-name="reply.queue"
request-destination-name="request.queue">
</int-jms:outbound-gateway>
<int-jms:outbound-gateway> 会将消息发送到 jms 队列并接收回复。 connectionFactory 只是你常用的ConnectionFactory 实例(即ActiveMQConnectionFactory、CachingConnectionFactory)
在 jms 交互的“服务器”端,您将使用 <int-jms:inbound-gateway>,类似
<int-jms:inbound-gateway id="inboundJmsGateway"
request-channel="requestChannel" acknowledge="client"
connection-factory="connectionFactory" request-destination-name="request.queue" />
<int:service-activator id="messageHandler" ref="serverMessageHandler"
input-channel="requestChannel">
</int:service-activator>
serverMessageHandler 只是一个简单的组件,它有一个方法来处理并向网关返回回复。
@Component
public class ServerMessageHandler {
@ServiceActivator
public String handleMessage(String message) {
return "Hello, " + message;
}
}
运行一个简单的演示
AbstractApplicationContext client = new ClassPathXmlApplicationContext("demo-gateway.xml");
AbstractApplicationContext server = new ClassPathXmlApplicationContext("demo-gateway-server.xml");
MessageProducer producer = client.getBean(MessageProducer.class);
String returnedMessage = producer.sendMessageAndGetReply("StackOverflow");
System.out.println(returnedMessage);
你会得到"Hello, StackOverflow"。一旦您对框架有了基本的了解,就没有太多的东西了。这个例子我给出了一个同步的例子。您可以在 github 的 spring-integration-samples 上查看完整示例(以及其他示例)。我会花一些时间阅读参考指南以熟悉基础知识。