package com.netty; import com.haobang.dispatch.DeviceContextResolver; import com.haobang.diagnostics.SyslogIpMetricsRegistry; import com.haobang.wal.SyslogWalService; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.DatagramChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import java.nio.charset.Charset; /** * UDP 通道初始化器 */ public class SyslogUdpChannelInitializer extends ChannelInitializer { private final Charset syslogCharset; private final SyslogWalService walService; private final DeviceContextResolver deviceResolver; private final boolean dropInvalidBeforeWal; private final SyslogIpMetricsRegistry ipMetrics; SyslogUdpChannelInitializer(Charset syslogCharset, SyslogWalService walService, DeviceContextResolver deviceResolver, boolean dropInvalidBeforeWal, SyslogIpMetricsRegistry ipMetrics) { this.syslogCharset = java.util.Objects.requireNonNull(syslogCharset, "syslogCharset"); this.walService = java.util.Objects.requireNonNull(walService, "walService"); this.deviceResolver = java.util.Objects.requireNonNull(deviceResolver, "deviceResolver"); this.dropInvalidBeforeWal = dropInvalidBeforeWal; this.ipMetrics = java.util.Objects.requireNonNull(ipMetrics, "ipMetrics"); } @Override protected void initChannel(DatagramChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加字符串解码器和编码器(使用可配置的字符集) pipeline.addLast("decoder", new StringDecoder(syslogCharset)); pipeline.addLast("encoder", new StringEncoder(syslogCharset)); // 添加业务处理器 pipeline.addLast("handler", new SyslogMessageHandler( syslogCharset, walService, deviceResolver, dropInvalidBeforeWal, ipMetrics)); } }