破坏者生产者对消费者来说太快了

时间:2015-09-02 19:05:10

标签: producer-consumer disruptor-pattern

我正在使用一个破坏程序来处理某些业务逻辑,该逻辑会发布给另一个处理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,因此正在发送重复的消息。

你有什么建议?

1 个答案:

答案 0 :(得分:-1)

答案看起来像是最终确定事件处理程序变量并对事件使用同步最终锁定,如下所示:

private final Object lock = new Object();

public void onEvent(final FixEvent event, final long sequence, final boolean endOfBatch)
{   
    synchronized(lock)
    {
        ...

除非锁定是最终的,否则它不起作用。它没有使用静态最终锁定。它除了最终锁定之外没有其他任何工作同步,即同步final event没有工作。

然后它在乐队训练营工作了一次,然后停止了工作......