Java Netty—写入通道,直到其可写入
根据,要确定通道的可写性,我们可以调用Java Netty—写入通道,直到其可写入,java,networking,netty,nio,Java,Networking,Netty,Nio,根据,要确定通道的可写性,我们可以调用channel.isWritable,然后如果通道是可写的,则写入通道 i、 e: 但是,这个呢: private void writeIfPossible(ChannelHandlerContext ctx) { Channel channel = ctx.channel(); channel.eventLoop().execute(() -> { while (needsToWrite && chan
channel.isWritable
,然后如果通道是可写的,则写入通道
i、 e:
但是,这个呢:
private void writeIfPossible(ChannelHandlerContext ctx) {
Channel channel = ctx.channel();
channel.eventLoop().execute(() -> {
while (needsToWrite && channel.isWritable()) {
ctx.write(createMessage(), ctx.voidPromise());
}
ctx.flush();
});
}
这是正确的吗?我的意思是,channel.write
(或ctx.write
)对频道的可写性有任何影响吗?或者我们必须在每次写入后调用channel.flush
谢谢。只有在调用flush()时,数据才会真正写入底层套接字。因此,如果您从未调用flush(),则isWritable()将继续返回false,直到您看到OOME为止。无论何时调用flush()都由您决定,这取决于在尝试刷新之前要缓冲多少。只有在调用flush()时,数据才会真正写入底层套接字。因此,如果您从未调用flush(),则isWritable()将继续返回false,直到您看到OOME为止。无论何时调用flush()都取决于您自己,这取决于您在尝试刷新之前要缓冲多少。非常感谢您,毛勒先生 我的结论是:
public void sendMessages(ChannelHandlerContext ctx, RecyclableArrayList messages) {
Channel channel = ctx.channel();
channel.eventLoop().execute(() -> {
int i = 0;
while (channel.isActive() && channel.isWritable() && i < messages.size()) {
for (int j = 0; j < 5 && i < messages.size(); j++, i++) {
ctx.write(messages.get(i), ctx.voidPromise());
}
ctx.flush();
}
if (i < messages.size()) {
messages.subList(0, i).clear();
storeMessages(ctx.name(), messages);
} else {
messages.recycle();
}
});
}
public void sendMessages(ChannelHandlerContext ctx、RecyclableArrayList消息){
Channel=ctx.Channel();
channel.eventLoop().execute(()->{
int i=0;
while(channel.isActive()&&channel.isWritable()&&i
如果还有其他建议,我将不胜感激。非常感谢毛勒先生 我的结论是:
public void sendMessages(ChannelHandlerContext ctx, RecyclableArrayList messages) {
Channel channel = ctx.channel();
channel.eventLoop().execute(() -> {
int i = 0;
while (channel.isActive() && channel.isWritable() && i < messages.size()) {
for (int j = 0; j < 5 && i < messages.size(); j++, i++) {
ctx.write(messages.get(i), ctx.voidPromise());
}
ctx.flush();
}
if (i < messages.size()) {
messages.subList(0, i).clear();
storeMessages(ctx.name(), messages);
} else {
messages.recycle();
}
});
}
public void sendMessages(ChannelHandlerContext ctx、RecyclableArrayList消息){
Channel=ctx.Channel();
channel.eventLoop().execute(()->{
int i=0;
while(channel.isActive()&&channel.isWritable()&&i
如果还有其他建议,我将不胜感激