0

IO を処理する別のディスラプターにパブリッシュするビジネス ロジックにディスラプターを使用しています。IO ディスラプターにパブリッシュされたイベントは、IO を構築して検証するにはあまりにも早く到着する可能性があります。まあ、それは一種のポイントです...

IO ディスラプターは次のようにセットアップされます。

disruptor = new Disruptor<>(factory, RING_SIZE, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
disruptor.handleEventsWith(new Logic(disruptor, io));

次に、Logic イベント ハンドラーを次のように設定します。

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 を上書きする新しいイベントが発生したため、重複したメッセージが送信されています。

何を提案できますか?

4

1 に答える 1

-1

答えは、次のように、イベント ハンドラー変数をファイナライズし、イベントで同期最終ロックを使用することのように見えました。

private final Object lock = new Object();

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

ロックが最終的なものでない限り、機能しませんでした。静的な最終ロックでは機能しませんでした。最終ロック以外の同期では機能しませんでした。つまり、同期はfinal event機能しませんでした。

その後、バンドキャンプで1回機能し、その後機能しなくなりました...

于 2015-09-14T14:07:54.800 に答える