【发布时间】:2015-09-02 19:05:10
【问题描述】:
我正在为某些业务逻辑使用中断器,该中断器发布到另一个处理 IO 的中断器。发布到 IO 中断器的事件可能到达太快,无法构建和验证 IO。嗯,这就是重点......
IO 中断器的设置如下:
disruptor = new Disruptor<>(factory, RING_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
disruptor.handleEventsWith(new Logic(disruptor, io));
然后逻辑事件处理程序是这样设置的:
public void onEvent(FixEvent event)
{
quickfix.Message ioMessage = event.message;
quickfix.SessionID receiver = event.session;
Log.debug("message: " + event.message.toString());
SessionID id = new SessionID(receiver.getBeginString(), "MYFX", receiver.getTargetCompID());
Session session = Session.lookupSession(id);
Log.debug("message: " + ioMessage.toString());
session.send (ioMessage);
}
当您发送 (ioMessage) 时,发生了一个新事件,它以某种方式覆盖了 ioMessage,因此重复的消息被发送出去。
你有什么建议?
【问题讨论】:
-
我认为您需要添加更多关于 send() 和“做一些工作”部分的详细信息。根据您上面显示的内容,您应该没有问题。 Disruptor 确保您只有一个线程处理 ioMessage,但如果您将该 ioMessage 发送到其他地方,您可能会看到问题。
-
@jasonk 好的,再填写一些。也许问题是日志,在第一个实例中我正在查看 event.message,在第二个实例中查看 ioMessage 变量。这就是我有时会在负载下看到不同的 FIX 事件消息的地方,但问题是有重复的 FIX 消息一个接一个地发送到接收器。当 2 个事件相继发布时,其中的第 2 个事件会以某种方式覆盖第一个事件并被发送两次……很奇怪。
标签: producer-consumer disruptor-pattern