Undertow:在Http处理程序中使用Hystrix Observable

时间:2017-04-04 09:11:32

标签: asynchronous rx-java hystrix undertow

我设法设置了一个从Undertow HTTP处理程序调用的Hystrix命令:

public void handleRequest(HttpServerExchange exchange) throws Exception {
    if (exchange.isInIoThread()) {
        exchange.dispatch(this);
        return;
    }
    RpcClient rpcClient = new RpcClient(/* ... */);
    try {
        byte[] response = new RpcCommand(rpcClient).execute();
        // send the response
    } catch (Exception e) {
        // send an error
    }
}

这很好用。但现在,我想使用Hystrix的可观察功能,调用observe而不是execute,使代码无阻塞。

public void handleRequest(HttpServerExchange exchange) throws Exception {
    RpcClient rpcClient = new RpcClient(/* ... */);
    new RpcCommand(rpcClient).observe().subscribe(new Observer<byte[]>(){
        @Override
        public void onCompleted() {
        }
        @Override
        public void onError(Throwable throwable) {
            exchange.setStatusCode(StatusCodes.INTERNAL_SERVER_ERROR);
            exchange.endExchange();
        }
        @Override
        public void onNext(byte[] body) {
            exchange.getResponseHeaders().add(Headers.CONTENT_TYPE, "text/plain");
            exchange.getResponseSender().send(ByteBuffer.wrap(body));

        }
    });
}

正如预期的那样(阅读文档),处理程序立即返回,结果交换结束;执行onNext回调时,它失败并出现异常:

Caused by: java.lang.IllegalStateException: UT000127: Response has already been sent
at io.undertow.io.AsyncSenderImpl.send(AsyncSenderImpl.java:122)
at io.undertow.io.AsyncSenderImpl.send(AsyncSenderImpl.java:272)
at com.xxx.poc.undertow.DiyServerBootstrap$1$1.onNext(DiyServerBootstrap.java:141)
at com.xxx.poc.undertow.DiyServerBootstrap$1$1.onNext(DiyServerBootstrap.java:115)
at rx.internal.util.ObserverSubscriber.onNext(ObserverSubscriber.java:34)

有没有办法告诉Undertow处理程序是异步执行IO?我希望使用大量非阻塞代码来访问数据库和其他服务。

提前致谢!

0 个答案:

没有答案