jraft_异步处理器
异步处理器
几个核心的方法
- handleRequest 处理请求的业务逻辑
- interest 声明及定义请求报文类的类型,如果这个写错会报Caused by: com.alipay.remoting.rpc.exception.RpcServerException: No user processor found for request 即要这样写 请求报文类.class.getName();
异步处理器的例子
package com.qbsea.dbmanager.rpc;
public class DmAsyncUserProcessor extends AsyncUserProcessor<DmRequest> {
private static final Logger LOG = LoggerFactory.getLogger(DmAsyncUserProcessor.class);
private DbManagerServer dbManagerServer;
public DmAsyncUserProcessor(DbManagerServer dbManagerServer) {
super();
this.dbManagerServer = dbManagerServer;
}
@Override
public void handleRequest(final BizContext bizCtx,final AsyncContext asyncCtx,final DmRequest request) {
if (!this.dbManagerServer.getFsm().isLeader()) {
DmResponse dmResponse = new DmResponse();
dmResponse.setResult("0001");
dmResponse.setRedirect("redirect");
asyncCtx.sendResponse(dmResponse);
return;
}
final DmResponse dmResponse = new DmResponse();
DmClosure dmClosure = new DmClosure(request, dmResponse, new Closure() {
@Override
public void run(Status status) {
if (status.isOk()) {
dmResponse.setResult("0000");
asyncCtx.sendResponse(dmResponse);
} else {
dmResponse.setResult("9999");
dmResponse.setErrorMsg(status.getErrorMsg());
asyncCtx.sendResponse(dmResponse);
}
}
});
try {
final Task task = new Task();
task.setDone(dmClosure);
task.setData(ByteBuffer
.wrap(SerializerManager.getSerializer(SerializerManager.Hessian2).serialize(request)));
dbManagerServer.getNode().apply(task);
} catch (final CodecException e) {
dmResponse.setResult("9999");
dmResponse.setErrorMsg(e.getMessage());
asyncCtx.sendResponse(dmResponse);
}
}
@Override
public String interest() {
return DmRequest.class.getName();
}
}
interest产生的异常
No user processor found for request
12:07:50.443 [main] ERROR com.alipay.sofa.common.log - Sofa-Middleware-Log SLF4J Error: Build ILoggerFactory error! Default app logger will be used.
Leader is 127.0.0.1:8081
com.alipay.remoting.rpc.exception.InvokeServerException: Server exception when invoke with callback.Please check the server log! The address is 127.0.0.1:8081
at com.alipay.remoting.rpc.RpcInvokeCallbackListener$CallbackTask.run(RpcInvokeCallbackListener.java:138)
at com.alipay.remoting.rpc.RpcInvokeCallbackListener.onResponse(RpcInvokeCallbackListener.java:72)
at com.alipay.remoting.rpc.DefaultInvokeFuture.executeInvokeCallback(DefaultInvokeFuture.java:164)
at com.alipay.remoting.rpc.protocol.RpcResponseProcessor.doProcess(RpcResponseProcessor.java:73)
at com.alipay.remoting.AbstractRemotingProcessor$ProcessTask.run(AbstractRemotingProcessor.java:148)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.alipay.remoting.rpc.exception.RpcServerException: No user processor found for request: com.qbsea.dbmanager.rpc.DmRequest
at com.alipay.remoting.rpc.RpcCommandFactory.createServerException(RpcCommandFactory.java:124)
at com.alipay.remoting.rpc.RpcCommandFactory.createExceptionResponse(RpcCommandFactory.java:64)
at com.alipay.remoting.rpc.RpcCommandFactory.createExceptionResponse(RpcCommandFactory.java:57)
at com.alipay.remoting.rpc.RpcCommandFactory.createExceptionResponse(RpcCommandFactory.java:34)
at com.alipay.remoting.rpc.protocol.RpcRequestProcessor.process(RpcRequestProcessor.java:86)
at com.alipay.remoting.rpc.protocol.RpcRequestProcessor.process(RpcRequestProcessor.java:48)
at com.alipay.remoting.rpc.protocol.RpcCommandHandler.process(RpcCommandHandler.java:132)
at com.alipay.remoting.rpc.protocol.RpcCommandHandler.handle(RpcCommandHandler.java:120)
at com.alipay.remoting.rpc.protocol.RpcCommandHandler.handleCommand(RpcCommandHandler.java:92)
at com.alipay.remoting.rpc.RpcHandler.channelRead(RpcHandler.java:63)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at com.alipay.remoting.codec.AbstractBatchDecoder.channelRead(AbstractBatchDecoder.java:271)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:647)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:582)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:499)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:461)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
... 1 more