2017-08-16 9 views
1

コード内にスケジューリング可能な状態を実装するにはどうすればよいですか?私の場合、私は毎月の声明を出す必要があるので、これにはscheduleablestateを使うことができますか?コード内のスケジューリング可能な状態の実装

+0

これは興味深い質問ですが、同様の使用例については取り組んでいますが、実用的な実装ではありませんが、スケジューリング可能な状態が必要です。 –

答えて

4

多くのことを行う必要があります。

まず、あなたの状態オブジェクトはSchedulableStateインターフェイスを実装する必要があります。これは、追加のメソッドを追加します。

interface SchedulableState : ContractState { 
    /** 
    * Indicate whether there is some activity to be performed at some future point in time with respect to this 
    * [ContractState], what that activity is and at what point in time it should be initiated. 
    * This can be used to implement deadlines for payment or processing of financial instruments according to a schedule. 
    * 
    * The state has no reference to it's own StateRef, so supply that for use as input to any FlowLogic constructed. 
    * 
    * @return null if there is no activity to schedule. 
    */ 
    fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? 
} 

このインタフェースは、オプションのScheduledActivityインスタンスを返す実装するnextScheduledActivityという名前のメソッドが必要です。 ScheduledActivityは、アクティビティを実行するために各ノードが実行するFlowLogicインスタンスを取得し、実行するタイミングはjava.time.Instantとなります。状態がこのインタフェースを実装し、ボールトによって追跡されると、ボールトにコミットされたときに次のアクティビティを照会することが期待できます。例:

class ExampleState(val initiator: Party, 
        val requestTime: Instant, 
        val delay: Long) : SchedulableState { 
    override val contract: Contract get() = DUMMY_PROGRAM_ID 
    override val participants: List<AbstractParty> get() = listOf(initiator) 
    override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? { 
     val responseTime = requestTime.plusSeconds(delay) 
     val flowRef = flowLogicRefFactory.create(FlowToStart::class.java) 
     return ScheduledActivity(flowRef, responseTime) 
    } 
} 

第二に、(この場合FlowToStartで)開始するschedultedさFlowLogicクラスも@SchedulableFlow.例えばで注釈されなければなりません今

@InitiatingFlow 
@SchedulableFlow 
class FlowToStart : FlowLogic<Unit>() { 
    @Suspendable 
    override fun call() { 
     // Do stuff. 
    } 
} 

ExampleStateをボールトに格納されているときに、FlowToStartExampleStateで指定された時間オフセットで開始するschedultedします。

これだけです!

+0

私の場合は、プリンシパル親状態の金額。したがって、私の親の状態は毎月のステートメント(子ステート)を作成する毎月のフローをスケジューリングするschedulablestateになります。私は正しい? – Raghuram

+0

それはまさに正しいことです。あなたはスケジューリング可能な状態を実装し、1ヶ月の遅延を行います。ステートメントを発行するフローは、タイマーがトリガーされたときに実行されます。 Cheers –

+0

スケジューリング可能な状態は、2つのノード間のtxの一部であり、この状態は両方のノードのノードに存在します。そのような場合、スケジューラフローは両方のノードでトリガされます。しかし、私はそれが1つのノードでのみ起動されることを望みます。出来ますか? – Raghuram

関連する問題