适配范围
XXL-JOB < 2.2.0 执行器的NettyHandler
目前的XXL-JOB NettyHandler 只适用于XXL-JOB ≥ 2.2.0

而 XXL-JOB < 2.2.0 是没有com.xxl.job.core.server.EmbedServer这个类的,使用的是 com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServerHandler

为了增加通用性很简单,只需修改注入函数一点点即可,以下是我测试写的代码,只需要先保存原来的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
适配范围
目前的XXL-JOB NettyHandler 只适用于XXL-JOB ≥ 2.2.0
相关资料