Вам следует воспользоваться услугой.Сервис - это долгоживущий объект внутри вашего узла.В нашем сервисе мы определим метод 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."
}
}