Это вариант моего вопроса Как реализовать простой сервис эхо-сокетов в Spring Integration DSL . Были представлены хорошие рабочие решения, но я хотел бы изучить альтернативы. В частности, меня интересует решение, основанное на явном использовании входящих и исходящих каналов, в реализациях клиента и сервера. Это возможно?
Пока я смог придумать:
HeartbeatClientConfig
...
@Bean
public IntegrationFlow heartbeatClientFlow(
TcpNetClientConnectionFactory clientConnectionFactory,
MessageChannel outboundChannel,
PollableChannel inboundChannel) {
return IntegrationFlows
.from(outboundChannel)
.handle(Tcp.outboundGateway(clientConnectionFactory))
.channel(inboundChannel)
.get();
}
...
HeartbeatClient
public HeartbeatClient(MessageChannel outboudChannel, PollableChannel inboundChannel) {
this.inboundChannel = inboundChannel;
this.outboudChannel = outboudChannel;
}
...
void run() {
// ..in scheduled intervals in loop
outboudChannel.send(new GenericMessage<String>("status"));
Message<?> message = inboundChannel.receive(1000);
}
Клиентская часть работает нормально. Проблема на стороне сервера.
HeartbeatServer
public HeartbeatServer(PollableChannel inboundChannel, MessageChannel outboudChannel) {
this.inboundChannel = inboundChannel;
this.outboudChannel = outboudChannel;
}
...
void run() {
// ..in some kind of loop
Message<?> message = inboundChannel.receive(1000); // presumably a blocking call
...
outboudChannel.send(new GenericMessage<>("OK"));
...
}
HeartbeatServerConfig
Здесь идет самая сложная часть, где я уверен, что я не прав. Я просто не знаю, что мне делать. Здесь я наивно использую обратный подход из клиентской реализации, где он работает; обратный в смысле переключения входящих и исходящих каналов в определении потока.
...
@Bean
public IntegrationFlow heartbeatServerFlow(
MessageChannel outboundChannel,
PollableChannel inboundChannel) {
return IntegrationFlows
.from(inboundChannel)
.handle(Tcp.inboundGateway(Tcp.netServer(7777)))
.channel(outboundChannel)
.get();
}
...
Сервер не работает, выбрасывает загадочное исключение около Found ambiguous parameter type [class java.lang.Boolean] for method match ...
, за которым следует длинный список методов Spring и Spring Integration.
Полный исходный код можно найти здесь .