Я пишу приложение JavaFX, используя Netty для реализации настраиваемого протокола. Нет состояния сеанса, но я хотел бы сопоставить ответ сервера с конкретным исходящим запросом (и вернуть результат в правильный JavaFX Task
.) До сих пор я не смог сделать это в клиентском коде, потому что ответ Future это ChannelFuture<Void>
.Обработка ответа от сервера в клиенте Netty
future = tcpBoostrap.connect(address, 3333).sync();
final Channel channel = future.awaitUninterruptibly().channel();
ChannelFuture responseFuture = channel.writeAndFlush(requestBuilder.build());
responseFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (channelFuture.isSuccess()) {
logger.debug("completed operation: {}", channelFuture.toString());
}
}
});
Я попытался глядя том, как настроить PipeLine
каким-то образом установить ChannelHandlers
, что бы поделиться информацией в общей переменной контекста, но я не мог найти что-нибудь существенное.
Может ли кто-нибудь предложить идиоматическое место, где я могу заполнить задачу пользовательского интерфейса, которую я могу «заполнить» ответом в Netty?
Итак, в основном что-то вроде [этого ответа] (http://stackoverflow.com/a/9048781/261984). Удерживайте конвейер, используемый в инициализаторе, и 'addLast' clientHandler, который содержит ссылку на задачу – Eddy
@Eddy: Частично да, в том, как они создают обработчик. Но учтите, что обработчик создан для соединения (или может быть даже разделен), поэтому невозможно дать ему ссылку на Request/Future, если вы повторно используете одно и то же соединение для многих запросов. Вам необходимо сохранить карту идентификаторов запроса в SettableFuture или обратном вызове, которые вы затем завершите, получив соответствующий ответ. –