我怀疑我和你一样是 spring-integration 和 spring-integration-amqp 的菜鸟,但我确实在部分基于一个示例项目的基础上得到了一些东西。
对于rabbitmq基础设施,我有以下内容:
<rabbit:connection-factory id="rabbitConnectionFactory"/>
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory"/>
<rabbit:admin connection-factory="rabbitConnectionFactory"/>
<!-- some attributes seemed to be ok with queue name, others required id
-- so I used both with the same value -->
<rabbit:queue id='test.queue' name='test.queue'/>
<rabbit:direct-exchange name:"my.exchange">
<rabbit:bindings>
<rabbit:binding queue="test.queue" key="test.binding"/>
</rabbit:bindings>
</rabbit:direct-exchange>
要向rabbitmq发送消息,我有以下内容:
<!-- This is just an interface definition, no implementation required
-- spring will generate an implementation which puts a message on the channel -->
<int:gateway id="backgroundService",
service-interface="com.company.BackgroundService"
default-request-channel="toRabbit"
<int:channel id:"toRabbit"/>
<!-- used amqpTemplate to send messages on toRabbit channel to rabbitmq -->
<int-amqp:outbound-channel-adapter channel:"toRabbit"
amqp-template="amqpTemplate"
exchange-name="my.exchange"
routing-key="test.binding"/>
为了接收消息,我有以下内容:
<int:service-activator input-channel="fromRabbit"
ref="testService"
method="serviceMethod"/>
// from rabbitmq to local channel
<int-amqp:inbound-channel-adapter channel="fromRabbit"
queue-names="test.queue"
connection-factory="rabbitConnectionFactory"/>
<int:channel id="fromRabbit"/>
一些警告 - spring-integration 中 amqp 集成的文档说可以同步发送和接收返回值,但我还没有弄清楚。当我的服务激活器方法返回一个值时,它会引发一个异常,将消息放回rabbitmq(并生成一个无限循环,因为它会再次接收消息并再次抛出异常)。
我的BackgroundService 界面如下所示:
package com.company
import org.springframework.integration.annotation.Gateway
public interface BackgroundService {
//@Gateway(requestChannel="someOtherMessageChannel")
public String sayHello(String toWho)
}
如果您不希望使用 spring bean 中配置的默认通道,则可以通过注释在每个方法上指定通道。
附加到服务激活器的服务如下所示:
package com.company;
class TestService {
public void serviceMethod(String param) {
log.info("serviceMethod received: " + param");
//return "hello, " + param;
}
}
当我在本地连接所有东西而不涉及rabbitmq时,调用者正确接收了返回值。当我进入rabbitmq通道时,当返回值后抛出异常时,我得到了前面提到的无限循环。这肯定是可能的,否则在不修改代码的情况下就不可能在不同的通道中连接,但我还不确定技巧是什么。如果您解决了,请回复并提供解决方案。显然,您可以根据需要在端点之间放置任何您喜欢的路由、转换和过滤。
如果我上面的 XML 摘录中有拼写错误,请不要感到惊讶。我必须从 groovy DSL 转换回 xml,所以我可能会犯错误。但意图应该足够明确。