use of pers.cy.iris.commons.exception.ServiceTooBusyException in project iris by chicc999.
the class DefaultDispatcherHandler method processResponse.
private void processResponse(final ChannelHandlerContext ctx, final Command command) {
Header header = command.getHeader();
// 超时被删除了
final ResponseFuture responseFuture = futures.remove(header.getRequestId());
if (responseFuture == null) {
logger.info("ack type:" + header.getTypeString() + " requestId:" + header.getRequestId() + " but responseFuture is null");
return;
}
responseFuture.setResponse(command);
//回调交给线程池,避免回调任务阻塞IO线程
try {
serviceExecutor.submit(new Runnable() {
@Override
public void run() {
responseFuture.done();
}
});
} catch (RejectedExecutionException e) {
//队列已满,拒绝执行回调
responseFuture.cancel(new ServiceTooBusyException("请求成功,但没有足够的资源执行回调", e));
}
}
use of pers.cy.iris.commons.exception.ServiceTooBusyException in project iris by chicc999.
the class DefaultDispatcherHandler method processRequest.
private void processRequest(ChannelHandlerContext ctx, Command command) throws Exception {
int type = command.getHeader().getType();
if (Command.HEARTBEAT == type) {
//双向心跳,无需处理
return;
}
Header header = command.getHeader();
CommandHandler handler = handlerFactory.getHandler(header.getType());
if (handler == null) {
throw new UnknowCommandException("处理" + header.getTypeString() + "的handler不存在");
}
try {
HandlerTask task = new HandlerTask(ctx, command, handler);
ExecutorService commandExecutor = handler.getExecutorService(command);
if (commandExecutor == null) {
// 如果没用指定处理该命令专用的线程池,则在普通业务线程池执行
this.serviceExecutor.submit(task);
} else {
commandExecutor.submit(task);
}
} catch (RejectedExecutionException e) {
throw new ServiceTooBusyException("too many requests and thread pool is busy, reject request %d from %s ", e);
}
}
Aggregations