如何将响应发送回网关接口?
How do i send response back to Gateway interface?
我目前收到此错误:
DestinationResolutionException:
no output-channel or replyChannel header available .
我有一个注入控制器的文件网关
@MessagingGateway
public interface FileGateway {
@Gateway(requestChannel = "router.input", replyChannel = "output")
FileRequestResponse requestFile(FileRequestRequest fileFetchRequest);
}
和一个向各个频道发送消息的路由器
@Bean
IntegrationFlow routeFileRequest() {
return IntegrationFlows.from("router.input")
.<FileRequestRequest, FileType>route(m -> m.getParameters().getFileType(), m -> m
.channelMapping(FileType.CONTRACT, "contract.transform")
.channelMapping(FileType.INVOICE, "invoice.tranform"))
// .channelMapping(FileType.USAGE, "usageChannel"))
.get();
}
这里是我的转换器 bean,将消息转换为字符串并发送到 contract.input 通道,我可以在我的日志中看到消息到达合同,输入通道,但是在处理程序方法中响应后我得到:
org.springframework.messaging.core.DestinationResolutionException:
no output-channel or replyChannel header available.
变形金刚:
@Transformer(inputChannel = "contract.transform", outputChannel = "contract.input")
public Message<String> transformContractMessage(Message<FileRequestRequest> request) {
/**
*
* @param request
* @return contractId
*/
FileRequestRequest frr = request.getPayload();
return MessageBuilder.
withPayload(request.
getPayload().getContractId()).
setHeader("fileType", "CONTRACT").build();
}
下面是将消息发送回 router.output 的服务激活器,但是我遇到了上面的异常。
@ServiceActivator(inputChannel = "contract.input" ,outputChannel = "output")
public FileRequestResponse res(Message<String> message){
log.info(" Retrieving File With Contract ID {} ",message.getPayload());
ContractRsp contractResponse = contractFetchService.retrieveContract(message.getPayload());
log.info(" Contract File Received {} ",contractResponse);
return FileRequestResponse.builder().build();
}
@Bean
public DirectChannel output(){
DirectChannel channel = new DirectChannel();
return channel;
}
我的目的是在响应后将消息返回到 FileGateway 接口。
网关是一个 request-reply 组件,为了它们之间的关联,在将消息发送到 [=13= 期间填充 replyChannel
header 和 TemporaryReplyChannel
].
这在Reference Manual中有清楚的解释。
因此,即使您提供 replyChannel = "output"
并在下游某处使用它,replyChannel
也必须保留在 header 中。
您的问题代码在 @Transformer
:
return MessageBuilder.
withPayload(request.
getPayload().getContractId()).
setHeader("fileType", "CONTRACT").build();
您创建了一条新消息,但没有复制请求 header 来咖喱那个 replyChannel
。
与许多其他组件(例如 @ServiceActivator
)不同,如果从转换函数返回 Message
实例,转换器不会将 header 复制到回复消息中。
因此,您需要考虑在您的代码中添加以下内容:copyHeaders(request.getHeaders())
我目前收到此错误:
DestinationResolutionException:
no output-channel or replyChannel header available .
我有一个注入控制器的文件网关
@MessagingGateway
public interface FileGateway {
@Gateway(requestChannel = "router.input", replyChannel = "output")
FileRequestResponse requestFile(FileRequestRequest fileFetchRequest);
}
和一个向各个频道发送消息的路由器
@Bean
IntegrationFlow routeFileRequest() {
return IntegrationFlows.from("router.input")
.<FileRequestRequest, FileType>route(m -> m.getParameters().getFileType(), m -> m
.channelMapping(FileType.CONTRACT, "contract.transform")
.channelMapping(FileType.INVOICE, "invoice.tranform"))
// .channelMapping(FileType.USAGE, "usageChannel"))
.get();
}
这里是我的转换器 bean,将消息转换为字符串并发送到 contract.input 通道,我可以在我的日志中看到消息到达合同,输入通道,但是在处理程序方法中响应后我得到:
org.springframework.messaging.core.DestinationResolutionException:
no output-channel or replyChannel header available.
变形金刚:
@Transformer(inputChannel = "contract.transform", outputChannel = "contract.input")
public Message<String> transformContractMessage(Message<FileRequestRequest> request) {
/**
*
* @param request
* @return contractId
*/
FileRequestRequest frr = request.getPayload();
return MessageBuilder.
withPayload(request.
getPayload().getContractId()).
setHeader("fileType", "CONTRACT").build();
}
下面是将消息发送回 router.output 的服务激活器,但是我遇到了上面的异常。
@ServiceActivator(inputChannel = "contract.input" ,outputChannel = "output")
public FileRequestResponse res(Message<String> message){
log.info(" Retrieving File With Contract ID {} ",message.getPayload());
ContractRsp contractResponse = contractFetchService.retrieveContract(message.getPayload());
log.info(" Contract File Received {} ",contractResponse);
return FileRequestResponse.builder().build();
}
@Bean
public DirectChannel output(){
DirectChannel channel = new DirectChannel();
return channel;
}
我的目的是在响应后将消息返回到 FileGateway 接口。
网关是一个 request-reply 组件,为了它们之间的关联,在将消息发送到 [=13= 期间填充 replyChannel
header 和 TemporaryReplyChannel
].
这在Reference Manual中有清楚的解释。
因此,即使您提供 replyChannel = "output"
并在下游某处使用它,replyChannel
也必须保留在 header 中。
您的问题代码在 @Transformer
:
return MessageBuilder.
withPayload(request.
getPayload().getContractId()).
setHeader("fileType", "CONTRACT").build();
您创建了一条新消息,但没有复制请求 header 来咖喱那个 replyChannel
。
与许多其他组件(例如 @ServiceActivator
)不同,如果从转换函数返回 Message
实例,转换器不会将 header 复制到回复消息中。
因此,您需要考虑在您的代码中添加以下内容:copyHeaders(request.getHeaders())