我创建了一个带有请求通道和回复通道的spring dsl网关。该网关产生输出。
@MessaginGateway
public interface Gateway{
@Gateway(requestChannel="reqChannel", replyChannel="replyChannel")
String sayHello(String name);
}
我正在尝试在单元测试中测试输出。所以我在单元测试环境中创建了一个桥梁。当我尝试从桥接通道接收它时,它给了我“没有输出通道或回复通道标头可用”错误。
我已经创建了如下的桥梁。
@Bean
@BridgeFrom("replyChannel")
public QueueChannel bridgeOutput(){
return MessageChannels.queue.get();
}
在我的测试中,我正在向请求频道reqChannel.send(MessageBuilder.withPayload("Name").build());
发送消息,并且我已尝试通过bridgeOutput.receive(0)
收到回复。它给了我上面的错误。
如果我直接调用sayHello()方法,它工作正常。我只是试图通过直接将消息放入频道来测试网关。
我缺少什么?
更新
<int-enricher request-channel="gatewayRequestChannel" >
<int-property name="name" expression="payload" />
</int-enricher>
在上面,我将消息放入requestChannel并设置属性。而不是'gatewayRequestChannel',我可以在那里调用java方法并设置返回值吗?
答案 0 :(得分:1)
你做不到;回复频道由网关插入标题。
您的网桥正在回复频道上创建第二个消费者。
如果要模拟网关在单元测试中执行的操作,请删除该网桥并使用:
QueueChannel replyChannel = new QueueChannel();
reqChannel.send(MessageBuilder.withPayload("Name")
.setReplyChannel(replyChannel)
.build());
Message<?> reply = replyChannel.receive(10000);
在网关内部,reply-channel
桥接到邮件头;那座桥是一个消费者,你的桥是另一个。
修改强>
你绕过了浓缩器 - 你似乎误解了浓缩器的配置。浓缩器本身就是一种特殊的网关。
使用:
<int-enricher input-channel="enricherChannel"
request-channel="gatewayRequestChannel" >
<int-property name="name" expression="payload" />
</int-enricher>
并将测试邮件发送至enricherChannel
。富集程序充当gatewayRequestChannel
上流的门户,并丰富了该流程结果的结果。