2016-03-21 4 views
1

ReceiveTimeoutにパラメータを渡すことは可能ですか?私は次のコードを持っています:Scala Actor:ReceiveTimeout with Param

case ReceiveTimeout => 
     self ! BuildJobEvents(asperaClient.getWorkOrder(workOrderID), dateTime) 

私はパラメータを渡そうとしましたが、それは無効です。私はdocumentation hereを見て、パラメータの使用については何も見ていませんでした。 ReceiveTimeoutにパラメータを渡すことは可能ですか?そうでない場合、どうすればこの問題を回避できますか?

編集

私はテーブルにイベントをログに記録する俳優のシステムを持っています。各イベントには、発生時に注目するタイムスタンプがあります。私はチェーンに沿ってこのタイムスタンプを渡す必要があるので、データ(updated_atタイムスタンプを持つ)が実際に変更されたかどうかを判断するために使用することができます。

例:私はAPIサービスを呼び出すと 、私はこのようなイベントを取得すると言う:

Item { 
    event1 { 
    stated: 5:00pm, 
    completed: 5:10pm 
    }, 
    event1 { 
    stated: 5:10pm 
    } 
    data: data 
    updated_at: 5:11pm 
} 

私はここにEVENT1とイベント2を記録したいです。私も、メッセージ中の5時11分午後のdateTime値を渡したいので、私たちは、次の呼び出しのためにそれを使用することができます。タイムスタンプがあるので、この場合は

Item { 
    event1 { 
    stated: 5:00pm, 
    completed: 5:10pm 
    }, 
    event1 { 
    stated: 5:10pm, 
    completed: 5:12pm 
    } 
    data: data 
    updated_at: 5:12pm 
} 

、私は、EVENT1をログに記録しません5:11の前に、俳優はすでにそれを記録しています。私は再びイベント2をログに記録します。

+0

あなたのユースケースについて説明できますか?私はここでXYの問題を感じています –

+0

なぜ 'context.system.scheduleOnce(...)'あなたが実際に望むメッセージですか?あなたが以前に何か他のものを受け取ったら、あなたは 'scheduleOnce'から得た' Cancellable'を単に 'キャンセル'することができます。 – ale64bit

+0

私はscheduleOnceがメッセージを1回だけ送ると思っていました。「遅く、つまりメッセージが送信されるまでに経過しなければならない時間を使ってメッセージを1回送るようにスケジュールします。これを複数回実行する必要があります –

答えて

1

軽量ステートマシンの実装に使用できるcontext.becomeを探している可能性があります。

class MyActor extends Actor { 

    override def receive: Receive = { 
    case something => 
     context.setReceiveTimeout(5.seconds) 
     context.become(waitForTimeout(something)) 
    } 

    private[this] def waitForTimeout(param: Any): Receive = { 
    case ReceiveTimeout => 
     // do something with something 
    } 
} 

FSM形質をミックスすると、さらに多くの可能性があります。多分、このような何かを、あなたのイベントの例を読む

EDIT

private def receiveNextEvent(lastTimestamp: DateTime): Receive = { 
    case event => 
    if (event.stated > lastTimestamp) { 
    logEvent(event) 
    context.become(receiveNextEvent(event.stated) 
    } 
}