java - 对从 websocket 接收的事件进行排队以进行异步处理的最佳方法

标签 java multithreading queue

我有一个java应用程序使用JDA从Discord的websocket接收事件,我的目标是将这些事件排队(我一直在使用LinkedBlockingQueues,但如果有更好的工具,非常欢迎建议)以处理多个对象异步实例(消费者),每个实例都有自己的队列。

请注意,可能并且将会有队列需要对同一元素进行操作,因此仅在线程之间共享队列是行不通的。

我尝试的第一件事是使用克隆阻塞队列

 BlockingQueue<T> original = new LinkedBlockingQueue<T>();
 BlockingQueue<T> clone = new LinkedBlockingQueue<T>(original);

但这只会复制当时队列中存在的事件,实际上不会将生产者与克隆绑定(bind)在一起,因此它不起作用。

我还尝试为每个消费者分配一个监听器,但这似乎在运行时使用 jda 效率较低。

我一直采用的方法是将所有事件提供给主队列并启动一个线程,该线程将所有这些事件传递到分布在所有实例中的并行队列中,但这看起来非常低效且不干净。

解决这个问题最好、最干净、最有效的方法是什么?

最佳答案

为什么不直接共享队列而不是跨多个线程克隆它?

 BlockingQueue<T> original = new LinkedBlockingQueue<T>();

Thread consumer1 = new Thread(new Consumer(original));
Thread consumer2 = new Thread(new Consumer(original));

consumer1.start();
consumer2.start();
或者,如果可以的话,使用消息代理(即 Rabbit MQ)类型的解决方案,其中生产者生成一个主题,并且您可以有多个订阅该主题的消费者,每个消费者都有自己的工作/业务流程。 如果您的虚拟机崩溃,这种方法还可以为您提供安全性,因为队列将存储在其他地方。

关于java - 对从 websocket 接收的事件进行排队以进行异步处理的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134161/

相关文章:

java - Hibernate - 保留可嵌入资源

Java启动、停止和恢复线程

java - 通过 Hibernate 框架学习数据访问对象的好资源

java - 如何阻止用户生成更多事件?

java - 如何通过 hibernate 验证组件实体的属性?

multithreading - 为什么我的应用程序没有使用 Mac OS X 上的所有内核?

c# - 编写报告进度的方法

GO lang NATS 队列与多个队列订阅

multithreading - 使用线程和队列时格式不正确

C++队列存储多种类型对象