Even though the MessageExchangeTemplate
is fairly straightforward, it does not hide the
details of messaging from your application code. To support working with plain Objects instead of messages,
Spring Integration provides SimpleMessagingGateway
with the following methods:
public void send(Object object) { ... } public Object receive() { ... } public Object sendAndReceive(Object object) { ... } public void receiveAndForward() { ... }
It enables configuration of a request and/or reply channel and delegates to an instance of the
MessageMapper
and MessageCreator
strategy
interfaces.
SimpleMessagingGateway gateway = new SimpleMessagingGateway(); gateway.setRequestChannel(requestChannel); gateway.setReplyChannel(replyChannel); gateway.setMessageCreator(messageCreator); gateway.setMessageMapper(messageMapper); Object result = gateway.sendAndReceive("test");
Working with Objects instead of Messages is an improvement. However, it would be even better to have no
dependency on the Spring Integration API at all - including the gateway class. For that reason, Spring
Integration also provides a GatewayProxyFactoryBean
that generates a proxy for
any interface and internally invokes the gateway methods shown above. Namespace support is also
provided as demonstrated by the following example.
<gateway id="fooService" service-interface="org.example.FooService" request-channel="requestChannel" reply-channel="replyChannel" message-creator="messageCreator" message-mapper="messageMapper"/>
Then, the "fooService" can be injected into other beans, and the code that invokes the methods on that proxied instance of the FooService interface has no awareness of the Spring Integration API. The general approach is similar to that of Spring Remoting (RMI, HttpInvoker, etc.).