В настоящее время у меня есть TcpInboundGateway
, который принимает сообщения, выполняет некоторую обработку сообщения и затем возвращает соответствующий ответ, все как TcpInboundGateway
.
Однако мне любопытно, если это TcpInboundGateway
можно настроить таким образом, чтобы он отправлял немедленный ответ на исходящий запрос, но продолжал обрабатывать запрос и также отправлять ответ на постобработку?
Думайте об этом немедленном ответе как о подтверждении отправителю, что сообщение было получено.
Возможное решение:
Изучив эту публикацию , я пришел к тому, что считаю жизнеспособным решением этой проблемы.
@Configuration
@EnableIntegration
public class Configuration {
@Bean
public AbstractServerConnectionFactory serverConnectionFactory() {
return new TcpNetServerConnectionFactory(2002);
}
@Bean
public TcpReceivingChannelAdapter inboundAdapter(AbstractServerConnectionFactory serverConnectionFactory) {
TcpReceivingChannelAdapter inboundAdapter = new TcpReceivingChannelAdapter();
inboundAdapter.setConnectionFactory(serverConnectionFactory);
inboundAdapter.setOutputChannelName("sendAcknowledgement");
return inboundAdapter;
}
@MessageEndpoint
public class InboundMessageHandler {
@Autowired
private OutboundMessageGateway gateway;
@ServiceActivator(inputChannel="sendAcknowledgement", outputChannel="doProcessing")
public Message<String> initialAck(Message<String> message) {
gateway.send("ACK", message.getHeaders().get(IpHeaders.CONNECTION_ID).toString());
return message;
}
@ServiceActivator(inputChannel="doProcessing", outputChannel="sendResponse")
public Message<String> mockDelay(Message<String> message) throws InterruptedException {
return message;
}
}
@MessagingGateway(defaultRequestChannel="sendResponse")
public interface OutboundMessageGateway {
void send(@Payload String message, @Header(IpHeaders.CONNECTION_ID) String connectionId);
}
@Bean
@ServiceActivator(inputChannel="sendResponse")
public TcpSendingMessageHandler outboundAdapter(AbstractServerConnectionFactory serverConnectionFactory) {
TcpSendingMessageHandler outboundAdapter = new TcpSendingMessageHandler();
outboundAdapter.setConnectionFactory(serverConnectionFactory);
return outboundAdapter;
}
}