Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消消费者重新提交数据_Java_Message Passing_Disruptor Pattern - Fatal编程技术网

Java 取消消费者重新提交数据

Java 取消消费者重新提交数据,java,message-passing,disruptor-pattern,Java,Message Passing,Disruptor Pattern,我想使用LMAX的干扰器,但我不确定我的用例是否适合它。基本上有一个或两个生产者和n个消费者。诀窍在于,当消费者收到一个事件并检查其中的一些数据时,如果不能立即使用它,就必须重新发布数据,这基本上是一种轮询方案。我创建的环形缓冲区的容量不担心太小,但现在我的问题是:从事件处理程序请求新序列和发布是否安全,或者这会以某种方式破坏功能?通过一个小测试,我让它看起来足够安全,但我不知道它在我的特殊情况下会如何表现。我担心OneEvent方法可能会在我请求序列之后调用,但在我更新->发布新对象之前调用,

我想使用LMAX的干扰器,但我不确定我的用例是否适合它。基本上有一个或两个生产者和n个消费者。诀窍在于,当消费者收到一个事件并检查其中的一些数据时,如果不能立即使用它,就必须重新发布数据,这基本上是一种轮询方案。我创建的环形缓冲区的容量不担心太小,但现在我的问题是:从事件处理程序请求新序列和发布是否安全,或者这会以某种方式破坏功能?通过一个小测试,我让它看起来足够安全,但我不知道它在我的特殊情况下会如何表现。我担心OneEvent方法可能会在我请求序列之后调用,但在我更新->发布新对象之前调用,我真的不知道破坏者如何处理这些情况,如果不让EventHandler重新发布事件,一种方法是实现一个单独的重新发布破坏者。如果使用者线程发现它不能立即使用事件,它会将事件写入该缓冲区,然后单独的线程会将这些消息传递回主事件队列


这将增加主队列中写入程序的数量,但考虑到用例,这似乎是不可避免的。此解决方案的另一个潜在问题是,重新发布的事件必须在重新发布之前添加到主队列的任何新消息之后使用。

我希望在消息发布之前,您不能使用消息。在消息被消费之前,您不能重复使用它。破坏者的一个关键假设是生产者和消费者是非阻塞的。因此,基本上,如果我在消费者A中获得一个序列,然后在消费者B中获得一个序列,但我在A序列之前发布了B序列,那么即使序列号长得更高,也会首先可见,而在环缓冲区上对next的后续调用最终将返回A序列?事件,只有在所有之前的事件发布后,才会将其标记为对订阅者可见。i、 e插槽15仅在14标记为已发布后才标记为可见。