【发布时间】: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