Я пытаюсь создать длинную опрашивающую комету с помощью Jboss Netty.
Как настроить время из 30 секунд?После документа:
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", new HTTPRequestHandler());
Timer timer = new HashedWheelTimer();
pipeline.addLast("timeout", new IdleStateHandler(timer, 30, 30, 0));
return pipeline;
, но это не работает, и моя просьба длится вечно.Как это можно решить?
Означает ли это, что мне нужно реализовать Callable<T>
, затем вызвать Future.get
с параметром тайм-аута и завершить запрос, если TimeOutException
произойдет?Тогда я должен использовать Future<ChannelFuture>
?
Есть ли другой подход?
Код:
FutureExecutor executor = FutureExecutor.getInstance();
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
HttpRequest request = (HttpRequest) e.getMessage();
ChannelFuture channelFuture = null;
Callable<ChannelFuture> myRunnable = new MyCallable(e);
Future<ChannelFuture> future = executor.fireEvent(myRunnable);
try{
channelFuture = future.get(40,TimeUnit.SECONDS);
}catch (TimeoutException ex) {
channelFuture = e.getChannel(Response timeOutResponse);
// handle the timeout
} catch (InterruptedException ex) {
channelFuture = e.getChannel(Response interaptedResponse);
} catch (ExecutionException ex) {
channelFuture = e.getChannel(Response errorResponse);
}
finally{
future.cancel(true);
channelFuture.addListener(ChannelFutureListener.CLOSE);
}
}
и внутри Callable я просто отслеживаю BlockedQueue:
@Override
public ChannelFuture call() {
final BlockingQueue<String> queue =.....
while (true){
Message message = queue.take();
ChannelBuffer partialresponse = ChannelBuffers.buffer(message.toJson());
ChannelFuture future = e.getChannel().write(partialresponse);
return future;
}
}