java开发,在服务端使用netty的channel.writeAndFlush时,如果在新建的一个线程中执行时,客户端没有收到响应;在正常的方法内执行就可以收到
private READER_ERR initReader() {
//无法收到
new Thread(new Runnable() {
@Override
public void run() {
Channel channel = NettyChannelMap.get(clientId);
if (channel != null) {
ChatDto returnDto = new ChatDto();
returnDto.setClientId(clientId).setMsgType("READ").setMsg("返回数据");
channel.writeAndFlush(JSON.toJSONString(returnDto));
}
}
});
//可以收到
Channel channel = NettyChannelMap.get(clientId);
if (channel != null) {
ChatDto returnDto = new ChatDto();
returnDto.setClientId(clientId).setMsgType("READ").setMsg("返回数据");
channel.writeAndFlush(JSON.toJSONString(returnDto));
}
}
客户端没有收到响应
//添加ChannelFutureListener以便在写操作完成后接收通知
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
//写操作完成,并没有错误发生
if (future.isSuccess()){
System.out.println("successful");
}else{
//记录错误
System.out.println("error");
future.cause().printStackTrace();
}
}
});
使用接收通知,发现一直没有进入到这里面
现在需要在一个回调方法里面对客户端发送多次消息,所以服务端在新建线程内如何主动给客户端发消息
你这个线程有启动吗
经过源码级调试,发现new Thread()方式发送的时候,netty认为其不属于eventLoop,会按顺序把消息放入一个队列,等待执行。等到当一个eventLoop里的消息执行后,貌似会激活消息发送的线程(或者说机制),随后会从之前存放消息的队列中依次获取消息进行发送。
ps:平台已死,大概15年的时候我就开始用CSDN。那时候的学术氛围多浓厚,现在都没了,散场,结!