我正在同时向一个输出中断器发布2个或更多不同的事件(一个接着一个),并且disventor 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);
}
}
答案 0 :(得分:0)
onEvent
将仅针对ringbuffer中的每个序列称为一次每个eventHandler。
如果没有看到生产者代码,就不可能说出为什么要观察这种行为。
可能值得添加一些日志记录来确认每个给定序列号的事件。