2011-12-13 52 views
5

Tôi đang cố gắng ghép nối với một khách hàng Netty. Tôi cần phải gửi một yêu cầu đến một máy chủ (mà tôi không kiểm soát) và tôi đang mong đợi một phản ứng trở lại.Máy khách Netty, cách nhận phản hồi từ yêu cầu được gửi tới máy chủ

Tôi không chắc chắn cách nhận phản hồi.

Vì vậy, nếu tôi đã có:

ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654)); 
Channel connector = future.awaitUninterruptibly().getChannel(); 
ChannelFuture response = connector.write(query); 

Làm thế nào để tôi nhận được các dữ liệu phản ứng ra của phản ứng ChannelFuture? Tôi có cần thêm ChannelHandler vào đường dẫn khởi động không? Nếu vậy, làm cách nào để tôi liên kết phản hồi với yêu cầu?

Xin cảm ơn,

+0

Bạn cuối cùng đã tìm thấy câu trả lời cho câu hỏi của mình vì tôi có câu hỏi này rất giống nhau ... –

Trả lời

2

Bạn cần thêm ChannelHandler. Cách đơn giản nhất trong trường hợp của bạn là mở rộng SimpleChannelUpstreamHandler và ghi đè phương thức channelConnected(…) và phương pháp messageReceived(…). Trong channelConnected bạn sẽ kích hoạt Channel.write(…) và trong messageReceived bạn nhận được phản hồi. Nếu các câu trả lời có thể đến theo thứ tự khác nhau thì ghi bạn cần phải viết mã xử lý của riêng bạn.

Một giải pháp khác là thêm SimpleChannelUpstreamHandler vào đường ống trước khi bạn gọi. Một cái gì đó như thế này:

channel.getPipeline().addLast("yourHandlerName", new SimpleChannelUpstreamHandler()) { 
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
     // remove handler after receiving response 
     ctx.getPipeline().remove(this); 

     // do logic 
     ... 
     } 
}); 
+2

Cảm ơn bạn đã trả lời câu hỏi này; thật khó để tin rằng 'ChannelFuture' không hoạt động như ... một 'Tương lai'. Tôi googled trong một giờ trong sự hoài nghi và cuối cùng tìm thấy bài viết của bạn ở đây sẽ thông qua những thứ được gắn thẻ với 'netty'. Tôi nhận thấy bạn đang tham gia với một vấn đề cho 4,0 alpha liên quan đến điều này - bất kỳ chuyển động? Vì tôi đã thực hiện giao diện 'Response ' mà lớp con 'ChannelHandler' của tôi thực hiện. Tôi chuyển nó và 'ChannelFuture' tới hàm tạo của một lớp thực hiện' Future 'và hoạt động như một trình bao bọc. Tôi muốn treo bản thân mình. –

2

Thứ nhất, bạn có thể tham khảo mẫu giờ địa phương. Trong trình xử lý "LocalTimeClientHandler", bạn có thể tìm thấy thủ thuật chặn yêu cầu/phản hồi.

Nhưng đây vẫn là một "hello world" dự án giới thiệu, vì vậy vẫn còn 2 vấn đề chúng ta cần phải xem xét:

  1. Ý tưởng trong mẫu này là để gửi một lô một lần và lấy lại một phản ứng Một lần. Vì vậy, nó không phù hợp cho mô hình sản xuất để gửi liên tục bằng cách tái sử dụng cùng một kênh.

  2. Nếu bạn muốn gửi yêu cầu và nhận lại phản hồi đúng càng sớm càng tốt với tải nặng, bạn cần phải cấu trúc lại hàng đợi nhiều hơn một chút nếu không hiệu suất thực sự kém.

Các vấn đề liên quan