В Corda, как я могу выполнять поток периодически / с фиксированным интервалом на узле? - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу, чтобы мой узел Corda запускал поток с фиксированным интервалом, например каждую секунду.Как мне этого добиться?

1 Ответ

0 голосов
/ 19 сентября 2018

Вам следует воспользоваться услугой.Сервис - это долгоживущий объект внутри вашего узла.В нашем сервисе мы определим метод kickOff, который запускает отдельный поток для запуска PeriodicFlow каждую секунду:

@CordaService
class PeriodicService(val services: AppServiceHub): SingletonSerializeAsToken() {
    fun kickOff() {
        Thread {
            while (true) {
                services.startFlow(PeriodicFlow())
                Thread.sleep(1000)
            }
        }.start()
    }
}

Вот поток, который вызывает метод kickOff.Обратите внимание на использование ServiceHub.cordaService для извлечения объекта службы.

@InitiatingFlow
@StartableByRPC
class KickOff : FlowLogic<Unit>() {
    override val progressTracker = ProgressTracker()

    @Suspendable
    override fun call() {
        serviceHub.cordaService(PeriodicService::class.java).kickOff()
    }
}

А вот простой поток, выполняемый вашим узлом.Обратите внимание на аннотацию @StartableByService, которая позволяет службе запускать поток.

@InitiatingFlow
@StartableByService
class PeriodicFlow : FlowLogic<String>() {
    @Suspendable
    override fun call(): String {
        return "Flow called."
    }
}
...