【问题标题】:disruptor onEvent handler appears to be too fast for java synchronized lock对于 java 同步锁来说,disruptor onEvent 处理程序似乎太快了
【发布时间】:2015-09-14 13:59:34
【问题描述】:

我同时向输出中断器发布 2 个或更多不同的事件(一个接一个),并且中断器 onEvent 通常只将最后一个要发布的事件发送到 IO 会话。基本上,事件数据被覆盖。而我想在会话层上查看每个事件的副本。我尝试过在锁上同步会话层,但即使锁上发布者通常仍然太快(有时它正在工作,但大多数时候它不是)。

这里有一些代码:

private final Object lock = new Object();

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

这是否发生在其他人身上?除了发布者的减速带之外,还有其他解决方案吗?

这里是生产者代码:

public void onData(Message message, SessionID s)
{
    long sequence = ringBuffer.next();  // Grab the next sequence
    try
    {
        FixEvent event = ringBuffer.get(sequence);
        event.set(message, s);
    }
    finally
    {
        ringBuffer.publish(sequence);
    }
}

【问题讨论】:

  • onData 之后的消息是否发生了变异?因为您只是在环形缓冲区中存储对它的引用。拨打event.set时尝试克隆消息

标签: java synchronized disruptor-pattern


【解决方案1】:

onEvent 将在每个 eventHandler 中调用 一次,仅针对 ringbuffer 中的每个序列。

如果没有看到生产者代码,就不可能说出你为什么会观察到这种行为。

可能值得添加一些日志记录来确认每个给定序列号的事件。

【讨论】:

  • 这里是生产者代码:RingBuffer<FixEvent> ringBuffer = disruptor.getRingBuffer(); FixEventProducer producer = new FixEventProducer(ringBuffer); producer.onData(m, s);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2013-05-01
相关资源
最近更新 更多