Skip to content

[请求适配] XXL-JOB < 2.2.0 NettyHandler 马 #151

Description

@fasnow

适配范围

XXL-JOB < 2.2.0 执行器的NettyHandler

目前的XXL-JOB NettyHandler 只适用于XXL-JOB ≥ 2.2.0

Image 而 XXL-JOB < 2.2.0 是没有com.xxl.job.core.server.EmbedServer这个类的,使用的是 com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServerHandler Image 为了增加通用性很简单,只需修改注入函数一点点即可,以下是我测试写的代码,只需要先保存原来的handler插入到指定handler之后即可
   private void inject(DefaultChannelPipeline pipeline) throws Exception {
    Object tail = getFieldValue(pipeline, "tail");
    Object prevContext = getFieldValue(tail, "prev");
    Object acceptor = getFieldValue(prevContext, "handler");
    if (acceptor == null || !acceptor.getClass().getName().contains("ServerBootstrapAcceptor")) {
        return;
    }

    Field childHandlerField = getField(acceptor.getClass(), "childHandler");
    if (childHandlerField == null) return;
    childHandlerField.setAccessible(true);
    final ChannelHandler originalChildHandler = (ChannelHandler) childHandlerField.get(acceptor);

    if (originalChildHandler.getClass().getName().contains("WrappedChannelInitializer")) {
        return;
    }

    ChannelInitializer<Channel> wrapped = new ChannelInitializer<Channel>() {
        @Override
        protected void initChannel(Channel ch) throws Exception {
            String handlerName = UUID.randomUUID().toString();
            // 没有这个判断服务会被打崩
            if (ch.pipeline().get(handlerName) != null) {
                return;
            }
            ch.pipeline().addLast(originalChildHandler);

            String httpCodecName = null;
            for (String name : ch.pipeline().names()) {
                if (name.contains("HttpObjectAggregator")) {
                    httpCodecName = name;
                    break;
                }
            }

            if (httpCodecName != null) {
                ch.pipeline().addAfter(httpCodecName, handlerName, new h());
            } else {
                ch.pipeline().addFirst(handlerName, new h());
            }
        }
    };

    childHandlerField.set(acceptor, wrapped);
}

相关资料

Please list some useful links

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions