繁体   English   中英

Java:具有长期使用者的并发队列以及短期生产者的处理保证

[英]Java: Concurrent queue with long-lived consumers and processing guarantees for short-lived producers

我正在寻找一个并发队列的现有实现,可以用来实现典型的生产者 - 消费者模式,但需要注意以下几点。 每个生产者都是短暂的,但在退出之前必须阻止,直到它放入队列的所有消息都被消费者处理。 消费者和队列是长寿的。

我所拥有的一些想法是使用单个分区队列,其中每个分区都分配给生产者,或者为每个生产者设置专用队列,并在生产者队列之上构建一种复合队列,供消费者使用。

这似乎是http服务器的常见模式,它有许多http线程,它们就像队列的生产者一样,以及固定数量的工作线程,它们就像队列的消费者一样。 然后,在将http响应返回到http客户端之前,http威胁将阻塞,直到它排队的工作完全由消费者处理。

每个生产者都是短暂的,但在退出之前必须阻止,直到它放入队列的所有消息都被消费者处理。 消费者和队列是长寿的。

Stream.parallelStream()执行此操作。 这是一种常见的模式,可以通过几种方式解决,例如ExecutorService.submit(task)+ Future.get()。

在生成器队列之上构建一种复合队列

我会尽量让它变得简单。

最有效的方法取决于您的任务的工作量。 例如,它是CPU还是IO绑定。

从队列中拉出1000条消息,处理消息,通知生产者成功处理的消息;

List<Message> toProcess = someSourceOfMessages(1000);
toProcess.parallelStream().forEach(m -> process(m));
// do something after all tasks are complete.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM