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
});
添加回答
舉報