没有回复通道错误,即使它是在网关中定义的

时间:2015-11-17 16:44:54

标签: spring-integration

我创建了一个带有请求通道和回复通道的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方法并设置返回值吗?

1 个答案:

答案 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上流的门户,并丰富了该流程结果的结果。