Tôi đang sử dụng Netty 3.2.7. Tôi đang cố gắng viết chức năng trong ứng dụng khách của mình sao cho nếu không có thông báo nào được viết sau một khoảng thời gian nhất định (ví dụ, 30 giây), một thông báo "tiếp tục sống" được gửi đến máy chủ.Thực hiện các tin nhắn lưu giữ trong Netty bằng cách sử dụng WriteTimeoutHandler
Sau một số lần đào, tôi thấy rằng WriteTimeoutHandler sẽ cho phép tôi thực hiện việc này. Tôi đã tìm thấy giải thích này tại đây: https://issues.jboss.org/browse/NETTY-79.
Ví dụ được đưa ra trong các tài liệu Netty là:
public ChannelPipeline getPipeline() {
// An example configuration that implements 30-second write timeout:
return Channels.pipeline(
new WriteTimeoutHandler(timer, 30), // timer must be shared.
new MyHandler());
}
Trong khách hàng thử nghiệm của tôi, tôi đã làm chỉ này. Trong myhandler, tôi cũng overrided phương pháp exceptionCaught():
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
if (e.getCause() instanceof WriteTimeoutException) {
log.info("Client sending keep alive!");
ChannelBuffer keepAlive = ChannelBuffers.buffer(KEEP_ALIVE_MSG_STR.length());
keepAlive.writeBytes(KEEP_ALIVE_MSG_STR.getBytes());
Channels.write(ctx, Channels.future(e.getChannel()), keepAlive);
}
}
Không có vấn đề gì thời gian khách hàng không viết bất cứ điều gì để các kênh, các exceptionCaught() phương pháp tôi đã ghi đè không bao giờ được gọi.
Nhìn vào nguồn gốc của WriteTimeoutHandler, writeRequested() thực hiện của nó là:
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
long timeoutMillis = getTimeoutMillis(e);
if (timeoutMillis > 0) {
// Set timeout only when getTimeoutMillis() returns a positive value.
ChannelFuture future = e.getFuture();
final Timeout timeout = timer.newTimeout(
new WriteTimeoutTask(ctx, future),
timeoutMillis, TimeUnit.MILLISECONDS);
future.addListener(new TimeoutCanceller(timeout));
}
super.writeRequested(ctx, e);
}
Ở đây, có vẻ như rằng việc thực hiện này cho biết: "Khi một ghi được yêu cầu, làm một thời gian chờ mới Khi ghi thành công. , hủy thời gian chờ. "
Sử dụng trình gỡ lỗi, có vẻ như đây là những gì đang xảy ra. Ngay khi ghi xong, thời gian chờ sẽ bị hủy. Đây không phải là hành vi tôi muốn. Hành vi mà tôi muốn là: "Nếu khách hàng chưa viết bất kỳ thông tin nào cho kênh trong 30 giây, hãy ném một WriteTimeoutException".
Vì vậy, đây không phải là những gì WriteTimeoutHandler là dành cho? Đây là cách tôi giải thích nó từ những gì tôi đã đọc trực tuyến, nhưng việc thực hiện dường như không hoạt động theo cách này. Tôi có sử dụng sai không? Tôi có nên sử dụng cái gì khác không? Trong phiên bản Mina của cùng một máy khách tôi đang cố gắng viết lại, tôi thấy rằng phương thức sessionIdle() bị ghi đè để đạt được hành vi mà tôi muốn, nhưng phương thức này không có sẵn trong Netty.
Tôi có thể triển khai các thay đổi bạn đã đề xuất trong chưa đầy 10 phút và nó hoạt động hoàn hảo. Cảm ơn ngài! – ImmuneEntity
Tài liệu đã chuyển sang [IdleStateHandler.html] (http://static.netty.io/3.6/api/org/jboss/netty/handler/timeout/IdleStateHandler.html), [IdleStateAwareChannelHandler.html] (http: // static.netty.io/3.6/api/org/jboss/netty/handler/timeout/IdleStateAwareChannelHandler.html) – mxro