当前位置: 首页 > 面试题库 >

如何在其他课程中阅读Netty中的消息

毋澄邈
2023-03-14
问题内容

我想在班级以外的特定位置阅读消息InboundHandler。我找不到channelRead0在netty框架中调用的方法中读取期望值的方法。

例如:

context.writeMessage("message");
String msg = context.readMessage;

如果不可能,如何将channelRead0方法中得到的结果映射到在另一个类中进行的特定调用?


问题答案:

Netty框架设计为异步驱动。使用这种类比,它可以以最少的线程使用量处理大量连接。如果您要创建一个使用netty框架将调用分派到远程位置的api,则应该对调用使用相同的类比。

而不是让api直接返回值,而是使其返回a
Future<?>或a
Promise<?>。在您的应用程序中有多种实现此系统的方法,最简单的方法是创建一个自定义处理程序,该处理程序将传入的请求映射到PromiseFIFO队列中的。

例如:

这在很大程度上基于这样的回答,我在过去的提交。

我们从out处理程序开始,该处理程序将请求映射到管道中的请求:

public class MyLastHandler extends SimpleInboundHandler<String> {
    private final SynchronousQueue<Promise<String>> queue;

    public MyLastHandler (SynchronousQueue<Promise<String>> queue) {
        super();
        this.queue = queue;
    }

    // The following is called messageReceived(ChannelHandlerContext, String) in 5.0.
    @Override
    public void channelRead0(ChannelHandlerContext ctx, String msg) {
        this.queue.remove().setSuccss(msg); 
        // Or setFailure(Throwable)
    }
}

然后,我们需要一种将命令发送到远程服务器的方法:

Channel channel = ....;
SynchronousQueue<Promise<String>> queue = ....;

public Future<String> sendCommandAsync(String command) {
    return sendCommandAsync(command, new DefaultPromise<>());
}

public Future<String> sendCommandAsync(String command, Promise<String> promise) {
    synchronized(channel) {
        queue.offer(promise);
        channel.write(command);
    }
    channel.flush();
}

完成方法之后,我们需要一种方法来调用它:

sendCommandAsync("USER anonymous", 
    new DefaultPromise<>().addListener(
        (Future<String> f) -> {
            String response = f.get();
            if (response.startWidth("331")) {
                // do something
            }
            // etc
        }
    )
);

如果被叫者想使用我们的api作为阻塞调用,他也可以这样做:

String response = sendCommandAsync("USER anonymous").get();
if (response.startWidth("331")) {
    // do something
}
// etc

请注意,如果Thread状态被中断,则Future.get()可能抛出InterruptedException,这与套接字读取操作不同,套接字读取操作只能通过套接字上的某些交互来取消。在中,此异常应该不是问题FutureListener



 类似资料:
  • 我想在入以外的类中的特定位置读取消息。我无法在 方法中找到读取预期内容的方法,该方法从 netty 框架调用。 例如: 如果这是不可能的,我如何将我在方法中获得的结果映射到我在另一个类中进行的特定调用?

  • 因此,我有一个扫描仪,它可以使用while(file.hasNext())读取多行的文本文件,但是在它到达文本文件的末尾之后,我该如何制作它,以便在单独的while循环中重新开始读取行?

  • 在我的服务器处理程序中;-channelRead()总是以HTTPRequest的形式获取msg,在那里我找不到任何获取POST请求有效负载的地方。 null 在我的服务器管道中,我只有HttpServerCodec和一个自定义处理程序。

  • 问题内容: 我想阅读我的申请。如何找到其文件名? 问题答案: 如何找到其文件名? 您已经拥有了。也许您想找到绝对文件位置?您可以为此使用。 或者,如果您想直接获得它,请使用。

  • https://outlook.office.com/api/v1.0/Users/me/calendars 我用这个来获取我所有的日历。我有除其他人与我共享的日历之外的所有日历。我只想阅读这些日历。我的问题是:Office 365 Rest API 是否支持我的方案 - 阅读其他人与我共享的日历?如何?

  • 问题内容: 在JavaScript中有很多方法可以完成相同的操作。但是,我已经掌握了一些方式,但坦率地说,有些方式我不理解。有人可以帮我澄清一些事情吗?(我首先在PHP中学习了OOP。) 所以可以这样制作一个类: 到目前为止,这一切正确吗? 然后有人喜欢使用自执行匿名函数方法来创建名称空间。这样做的目的是什么,当您在上面做同样的事情时,提供了一个命名空间? 最后,您有一个我不理解的对象文字符号。