Ana içeriğe geç

4.4. Scheduler#

Zamanlamalı işlerin yapılabilmesi için tabanında BPMN kullanılan özelliktir.

Yetenekleri#

  • Verilen unique key ile zamanlamalı işlem başlatma.
  • Zamanlama formatı için cron(Ör. 0 0/1 * * * *) ve ISO 8601(Ör. PT1M) desteği.
  • Async desteği ile belirtilen kafka topic'e istek yollama.
  • Sync desteği ile belirtilen rest ucuna çağrı yapma.
  • Güvenliği geçebilmek için arka planda çalışacak servislere async token üretme. Async Token

Client#

Gradle Dependencies

compile (
    [group: 'tr.com.havelsan.framework.bpmn.cloud' , name: 'hvl-bpmn-scheduler-cloud-client']
)

Rest Servis Tanımı#

Feign client uçlarını kullanabilmek için configurasyon bean'ine @HvlEnableBpmnSchedulerClient annotasyonu eklenmelidir.

Rest Client Kullanımı

@Autowired
private HvlBpmnSchedulerRestService bpmnSchedulerRestService;

HvlBpmnSchedulerRestService.java

/**
 * A restful service which provides specific methods for bpmn engine scheduler.
 *
 * @author acuhadaroglu
 */
@Validated
@HvlPublicFeignRestService
@FeignClient(name = "bpmnSchedulerRestService",
        path = "${hvl.bpmn.service.scheduler.path:/scheduler}",
        url = "${hvl.bpmn.service.scheduler.url:${hvl.bpmn.service.url}}")
public interface HvlBpmnSchedulerRestService {

    /**
     * Starts sync scheduler job.
     *
     * @param schedulerModel the scheduler model
     * @param overrideJob    the override job
     * @return the hvl response
     */
    @Validated(value = {HvlBpmnSchedulerModel.SyncScheduler.class})
    @PostMapping(path = "/start/sync/{overrideJob}",
            consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    HvlResponse<HvlBpmnProcessInstanceModel> startSyncScheduler(
            @NotNull @RequestBody HvlBpmnSchedulerModel schedulerModel,
            @NotNull @PathVariable("overrideJob") boolean overrideJob);

    /**
     * Starts async scheduler job.
     *
     * @param schedulerModel the scheduler model
     * @param overrideJob    the override job
     * @return the hvl response
     */
    @Validated(value = {HvlBpmnSchedulerModel.AsyncScheduler.class})
    @PostMapping(path = "/start/async/{overrideJob}",
            consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    HvlResponse<HvlBpmnProcessInstanceModel> startAsyncScheduler(
            @NotNull @RequestBody HvlBpmnSchedulerModel schedulerModel,
            @NotNull @PathVariable("overrideJob") boolean overrideJob);

    /**
     * Restarts scheduler hvl response.
     *
     * @param processInstanceId the process instance id
     * @return the hvl response
     */
    @GetMapping(path = "/restart/{processInstanceId}", produces = MediaType.APPLICATION_JSON_VALUE)
    HvlResponse<HvlBpmnProcessInstanceModel> restartScheduler(@NotBlank @PathVariable("processInstanceId") String processInstanceId);

    /**
     * Finishs scheduler job.
     *
     * @param businessKeyList the business key list
     * @return the hvl response
     */
    @PostMapping(path = "/finish/by-business-key-list", consumes = MediaType.APPLICATION_JSON_VALUE)
    HvlResponse<Void> finishScheduler(@NotEmpty @RequestBody List<String> businessKeyList);

}

Rest service kullanımı için Application Yml'a eklenmesi gerekenler:

Konfigürasyonlar ile ilgili detaylara BPMN sayfasından Bpmn Uygulaması Konfigürasyonları başlığı altından ulaşılabilir.

Scheduler Rest Service Kullanımı#

Async scheduler kullanmak için kafka entregrasyonu olmalıdır. Kafka altyapısını kullanmak ve incelemek için bu sayfadan bilgi alınabilir.

Sync scheduler kullanmak için ise HvlBpmnSchedulerCallbackCloudRestService servisini implement eden bir controller yazılmalıdır. Detayları aşağıda mevcuttur.

Ortak Alanlar#

Scheduler job başlatmak için kullanılacak ortak alanlar aşağıdaki gibidir.

overrideJob → true verilirse, verilen businessKey ile mevcut çalışan bir job varsa onu öldürüp yenisini oluşturmayı sağlar.

businessKey → Scheduler job'ına ait key bilgisi. Bu bilgi job'ı durdurmak için kullanılacak bilgidir.

duration → ISO 8601 formatında zamanlama değeri. Örnekteki PT10S değeri 10 saniye sonra çalışacağı anlamına gelir.

cycle → ISO 8601 formatı yerine cron expression kullanılmak istenirse duration alanı yerine cycle alanı kullanılmalıdır. Ör. "cycle": "0 0/1 * * * ?" değeri her dakika çalışması anlamına gelir.

singleExecution → [true, false] değerlerini alır. True ise job sadece 1 kere çalışıp durur. False ise finish methodu ile durdurulana kadar çalışır.

payload → Tetikleme yapıldığı zaman taşınmak istenen payload bilgisidir.

Not: duration ve cycle alanları aynı anda kullanılamaz.

Async Alanları ve Kullanımı#

Aysnc scheduler job başlatmak için ortak alanlara ek olarak kullanılacak alanlar aşağıdaki gibidir.

eventTopic → Tetikleme yapıldığı zaman hangi kafka topic'ine mesaj yollayacağı bilgisidir.

Async bir scheduler job'ı başlatmak için startAsyncScheduler methodu kullanılmalıdır. Örnek request aşağıdaki gibidir.

Async request

{
    "businessKey": "myBusinessKey",
    "duration": "PT10S",
    "eventTopic": "myTopic",
    "payload": {"name":"arda"},
    "singleExecution": false
}

Sync Alanları ve Kullanımı#

Sync scheduler job başlatmak için ortak alanlara ek olarak kullanılacak alanlar aşağıdaki gibidir.

url → Tetikleme yapıldığı zaman hangi rest ucuna gidileceği bilgisidir.

Sync bir scheduler job'ı başlatmak için startSyncScheduler methodu kullanılmalıdır. Örnek request aşağıdaki gibidir.

Sync request

{
    "businessKey": "myBusinessKey",
    "cycle": "0 0/10 * * * ?",
    "payload": {"name":"arda"},
    "singleExecution": false,
    "url": "[http://ip](http://ip):port/mySchedulerCallbackService"
}

Tetikleme yapılması için yazılacak rest controller, HvlBpmnSchedulerCallbackRestService arayüzünü implement etmelidir.

Örnek Controller sınıfı

/**
* @author acuhadaroglu
*/

@RestController
@RequestMapping("mySchedulerCallbackService")

public class MyCallbackRestController implements HvlBpmnIntegrationRestService {

    @Override
    public void integrate(@RequestBody Map<String, Object> payload, @RequestParam("type") String type) {
        System.out.println("myScheduler payload: " + payload);
    }

}
Yazılacak rest service'e BPMN Admin uygulaması tarafından async token kullanılarak erişilebilmesi için, rest service sınıfı available feign target olarak aşağıdaki gibi environment'lara eklenmelidir.

hvl:
  oauth:
    auth:
      async-token:
        available-feign-target:
          - mySchedulerCallbackService

Server#

Server ile ilgili detaylara BPMN sayfasından ulaşılabilir.