Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
这是博主在开发过程中发现的报错。
关于这个问题,关键在于服务端在每次连客户端是都会新一个SocketChannel通道来区分多个客户端,因为博主之前是每生成一个Channel就存到了socketChannelMaps中,代码如下:
@Override
protected void initChannel(SocketChannel ch) throws Exception {
if (!socketChannelMaps.containsKey(String.valueOf(ch.remoteAddress().getAddress()).replace("/",""))) {
socketChannelMaps.put(String.valueOf(ch.remoteAddress().getAddress()).replace("/",""), ch);
}
initHandler(ch.pipeline());
// channelHandlers.forEach(ch.pipeline()::addLast);
}
因为连接的channel一直都是同一个没有改变,所以不管是服务端向客户端发命令还是客户端给服务端发命令都没问题,但是当关闭了采集通道后,重新打开,这个时候要命了,因为重新生成了一个channel,而本人又是用客户端的ip做map的key,所以逻辑就会跳过。
而当自己想让服务端向客户端发命令时,识别到这个通道(channel)后,用它发命令,因为通道重新生成的channel并不是这个socketChannelMaps中存的channel,所以导致报错。
我的解决办法是:
每当发现map中存在相同远程ip一样的channel,就把旧的删除,换上新的。
代码如下:
protected void initChannel(SocketChannel ch) throws Exception {
String remoteAddress = String.valueOf(ch.remoteAddress().getAddress()).replace("/","");
if (!socketChannelMaps.containsKey(remoteAddress)) {
socketChannelMaps.put(remoteAddress, ch);
} else {
socketChannelMaps.remove(remoteAddress);
socketChannelMaps.put(remoteAddress, ch);
}
initHandler(ch.pipeline());
}
本人还在思考一个问题,因为本人socketChannelMaps结构的问题,该netty连接只能做到一对一(一个服务端端口接一个客户端ip)和一对多(一个服务端端口接多个客户端ip),或者去实现多对多呢?把服务端端口和客户端ip结合起来行不行,后面慢慢去修改把。