千家信息网

dubbo中AllDispatcher的作用是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,dubbo中AllDispatcher的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Dispatcherdu
千家信息网最后更新 2026年11月02日dubbo中AllDispatcher的作用是什么

dubbo中AllDispatcher的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Dispatcher

dubbo-2.7.3/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Dispatcher.java

@SPI(AllDispatcher.NAME)public interface Dispatcher {    /**     * dispatch the message to threadpool.     *     * @param handler     * @param url     * @return channel handler     */    @Adaptive({Constants.DISPATCHER_KEY, "dispather", "channel.handler"})    // The last two parameters are reserved for compatibility with the old configuration    ChannelHandler dispatch(ChannelHandler handler, URL url);}
  • Dispatcher接口定义了dispatch方法,返回ChannelHandler

AllDispatcher

dubbo-2.7.3/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/all/AllDispatcher.java

public class AllDispatcher implements Dispatcher {    public static final String NAME = "all";    @Override    public ChannelHandler dispatch(ChannelHandler handler, URL url) {        return new AllChannelHandler(handler, url);    }}
  • AllDispatcher实现了Dispatcher接口,其dispatch方法返回的是AllChannelHandler

AllChannelHandler

dubbo-2.7.3/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/all/AllChannelHandler.java

public class AllChannelHandler extends WrappedChannelHandler {    public AllChannelHandler(ChannelHandler handler, URL url) {        super(handler, url);    }    @Override    public void connected(Channel channel) throws RemotingException {        ExecutorService executor = getExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CONNECTED));        } catch (Throwable t) {            throw new ExecutionException("connect event", channel, getClass() + " error when process connected event .", t);        }    }    @Override    public void disconnected(Channel channel) throws RemotingException {        ExecutorService executor = getExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.DISCONNECTED));        } catch (Throwable t) {            throw new ExecutionException("disconnect event", channel, getClass() + " error when process disconnected event .", t);        }    }    @Override    public void received(Channel channel, Object message) throws RemotingException {        ExecutorService executor = getExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));        } catch (Throwable t) {            //TODO A temporary solution to the problem that the exception information can not be sent to the opposite end after the thread pool is full. Need a refactoring            //fix The thread pool is full, refuses to call, does not return, and causes the consumer to wait for time out                if(message instanceof Request && t instanceof RejectedExecutionException){                        Request request = (Request)message;                        if(request.isTwoWay()){                                String msg = "Server side(" + url.getIp() + "," + url.getPort() + ") threadpool is exhausted ,detail msg:" + t.getMessage();                                Response response = new Response(request.getId(), request.getVersion());                                response.setStatus(Response.SERVER_THREADPOOL_EXHAUSTED_ERROR);                                response.setErrorMessage(msg);                                channel.send(response);                                return;                        }                }            throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);        }    }    @Override    public void caught(Channel channel, Throwable exception) throws RemotingException {        ExecutorService executor = getExecutorService();        try {            executor.execute(new ChannelEventRunnable(channel, handler, ChannelState.CAUGHT, exception));        } catch (Throwable t) {            throw new ExecutionException("caught event", channel, getClass() + " error when process caught event .", t);        }    }}
  • AllChannelHandler继承了WrappedChannelHandler,其connected、disconnected、received、caught均是通过父类的getExecutorService获取线程池,然后执行创建的ChannelEventRunnable;received方法在捕获到异常时RejectedExecutionException且message是Request,而且request是twoWay的时候会返回SERVER_THREADPOOL_EXHAUSTED_ERROR

小结

  • Dispatcher接口定义了dispatch方法,返回ChannelHandler

  • AllChannelHandler继承了WrappedChannelHandler,其connected、disconnected、received、caught均是通过父类的getExecutorService获取线程池,然后执行创建的ChannelEventRunnable

  • AllChannelHandler的received方法在捕获到异常时RejectedExecutionException且message是Request,而且request是twoWay的时候会返回SERVER_THREADPOOL_EXHAUSTED_ERROR

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

方法 接口 时候 线程 帮助 作用 清楚 内容 对此 小结 文章 新手 更多 知识 行业 资讯 资讯频道 难题 需求 频道 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 什么是科技互联网 西安纸贵互联网科技有限公司 科技赋能下的互联网金融 互联网养老 桔豆科技 无锡溥仪互联网科技有限公司 杭州壁岐互联网科技有限公司 广州市恰铎互联网科技有限公司 中国互联网十大科技股排名 科技互联网海报 2021互联网科技公司排名 互联网科技实习生岗位 互联网科技快讯热点 上海互联网科技公司ppt 东营紫格互联网科技 福州德业互联网科技 北京互联网科技类企业分布 同城互联网络科技 互联网科技博主张洲 小牛互联网科技有限公司地址 互联网科技公司简介 互联网科技论坛 滨湖区互联网智能科技产品供应 哈尔滨秒房互联网科技有限公司 互联网公司会议桌创意科技软装饰 中国最先进互联网科技公司 老年人脱离互联网科技的作文 宝灵互联网科技有限公司 华夏恒生互联网科技013171 长沙茂晟互联网科技有限公司
0