0

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);
    }
}
4

1 に答える 1

0

onEventリングバッファ内の各シーケンスに対してのみ、eventHandler ごとに 1ずつ呼び出されます。

プロデューサー コードを見ないと、なぜそのような動作を観察しているのかを判断することはできません。

特定のシーケンス番号ごとにどのイベントが発生したかを確認するために、ログを追加する価値があるかもしれません。

于 2015-09-15T03:15:02.543 に答える