2 回答
TA贡献1852条经验 获得超7个赞
您需要使用java非阻塞IO,并且可能是一些支持通过java NIO进行高级通信的库(例如netty,它支持HTTP、websockets和redis等的NIO风格通信)。
以下是 NIO 工作原理的简短描述。你正在寻找的东西是Selector
. 它允许等待通道(这是文件或网络连接等的抽象)上的数据可用。此 wait(Selector.select
方法) 是阻塞的,当某些数据可供读取或要写入的输出缓冲区可以获得新数据时,操作系统会恢复该进程。
代码大致如下所示:
Selector selector = createSelector();
Channel channel = createChannelForSocket();
SelectionKey key = channel.register(selector);
while(true) {
int readyChannels = selector.select(TIMEOUT);
if(readyChannels == 0) continue;
Set<SelectionKey> selectedKeys = selector.selectedKeys();
for(SelectionKey key : selectedKeys) {
if (key.isReadable()) {
readDataFromChannel(key.channel())
} else if (key.isWritable()) {
writeDataToChannel(key.channel())
}
}
}
使用netty,您可以拥有更高级别的代码,您可以在其中定义一个Handlerwhich,它有一个类似于which的方法void channelRead(ChannelHandlerContext ctx, Object msg),它是一种读取事件侦听器,您可以实现它来侦听读取事件。
netty 有一个内置循环,看起来与上面的示例类似,但对于许多事件侦听器来说,它将这些事件传播到特定的侦听器。
TA贡献1847条经验 获得超7个赞
如果您有兴趣大规模使用事件驱动架构。您可能想要使用强大的“事件总线”,例如 Apache Kafka 或 AWS SNS+SQS。为了更简单,您可以使用 kalium.alkal.io。这将无缝处理 POJO 或 protobuf 对象的反/序列化。
kalium.on(Event.class, event -> {
//doSomething with the event
});
添加回答
举报