Я застрял на казалось бы простой задаче, но у меня нет идей.У меня есть TcpInboundGateway
, прикрепленный к TcpNetServerConnectionFactory
, который передает запросы активатору службы.Service Activator просто помещает сообщение обратно на канал ответа шлюза.Я хочу, чтобы шлюз возвращал это сообщение по соединению.
Когда я запускаю тест, сообщение успешно передается в Service Activator.Я знаю это, потому что Service Activator печатает полезные данные сообщения перед его возвратом.Я также знаю, что Service Activator помещает сообщение на правильный канал, потому что у меня есть перехватчик на этом канале, который также печатает сообщение.
Кажется, проблема в том, что шлюз не считывает данные с этого канала, хотя я установил его в setReplyChannel()
.Я также вижу это в журналах:
Adding {bridge:null} as a subscriber to the 'testResponseChannel' channel
, что заставляет меня подозревать, что сообщение просто отправляется на нулевой канал, а не перехватывается моим шлюзом.
Вот конфигурация:
@Bean
public TcpNetServerConnectionFactory testServerFactory() {
TcpNetServerConnectionFactory testServerFactory = new TcpNetServerConnectionFactory(0);
testServerFactory.setSerializer(TcpCodecs.lengthHeader2());
testServerFactory.setDeserializer(TcpCodecs.lengthHeader2());
return testServerFactory;
}
@Bean
public DirectChannel testRequestChannel() {
return new DirectChannel();
}
@Bean
public DirectChannel testResponseChannel() {
DirectChannel testResponseChannel = new DirectChannel();
testResponseChannel.addInterceptor(channelInterceptor());
return testResponseChannel;
}
@Bean
public TcpInboundGateway gateway() {
TcpInboundGateway gateway = new TcpInboundGateway();
gateway.setConnectionFactory(testServerFactory());
gateway.setRequestChannel(testRequestChannel());
gateway.setReplyChannel(testResponseChannel());
return gateway;
}
@Bean
@ServiceActivator(inputChannel = "testRequestChannel", outputChannel = "testResponseChannel")
public EchoHandler echoHandler() {
return new EchoHandler();
}
Вот мой активатор службы POJO:
public class EchoHandler {
public Message<String> echoMessage(Message<String> request) {
System.out.println(request.getPayload());
return request;
}
}
А вот ошибка, которая возникает сразу после того, как сообщение проходит через перехватчик:
Unexpected message - no endpoint registered with connection interceptor: localhost:6060:59848:3c6c3cff-c697-4fc9-b4e3-9ea14508cec7 - GenericMessage [payload=byte[3], headers={ip_tcp_remotePort=6060, ip_connectionId=localhost:6060:59848:3c6c3cff-c697-4fc9-b4e3-9ea14508cec7, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=93c75664-54db-c93e-ab3a-3e06b1e4b626, ip_hostname=localhost, timestamp=1556828832645}]