From 6e906c619286ecd6d00a4ea1b9d2ca03903d3e5c Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Fri, 31 Dec 2021 09:33:17 +0700 Subject: [PATCH] Add Async target skor dokter Pembuatan service generating target skor dokter dan pembuatan timer setiap awal tahun --- .../asynctask/TargetSkorDokterGenerating.java | 61 ++++++++++++++ .../timer/TargetSkorDokterTimer.java | 84 +++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/TargetSkorDokterGenerating.java create mode 100644 jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/timer/TargetSkorDokterTimer.java diff --git a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/TargetSkorDokterGenerating.java b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/TargetSkorDokterGenerating.java new file mode 100644 index 00000000..bb850c78 --- /dev/null +++ b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/TargetSkorDokterGenerating.java @@ -0,0 +1,61 @@ +package com.jasamedika.medifirst2000.asynctask; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import com.jasamedika.medifirst2000.asynctask.timer.TargetSkorDokterTimer; +import com.jasamedika.medifirst2000.controller.base.LocaleController; +import com.jasamedika.medifirst2000.service.IkiDanRemunerasiService; +import com.jasamedika.medifirst2000.util.CommonUtil; +import com.jasamedika.medifirst2000.vo.TargetSkorDokterVO; + +/** + * @author salmanoe + * @since Dec 29, 2021 + */ +@Component +public class TargetSkorDokterGenerating extends LocaleController { + + private final static Logger LOGGER = LoggerFactory.getLogger(TargetSkorDokterGenerating.class); + + @Autowired + private IkiDanRemunerasiService remunerasiService; + + public TargetSkorDokterGenerating() { + int the1st = 1; + int at0hrs = 0; + TargetSkorDokterTimer.schedule(new Runnable() { + @Override + public void run() { + try { + LOGGER.info("Task Target Skor Dokter : Running Task Target Skor Dokter"); + generateTargetSkorDokter(); + } catch (Exception ex) { + LOGGER.error("Task Target Skor Dokter : Task Target Skor Dokter " + ex.getMessage()); + } finally { + LOGGER.info("Task Target Skor Dokter : Finishing Target Skor Dokter"); + } + } + }, the1st, at0hrs); + } + + @Async + public void generateTargetSkorDokter() { + try { + if (CommonUtil.isNotNullOrEmpty(remunerasiService)) { + LOGGER.info("Task Target Skor Dokter : Running Check/Generate Target Skor Dokter"); + remunerasiService.autoSaveTargetCapaianLayananJamKerja(); + } else { + LOGGER.warn("Task Target Skor Dokter : Undefined service"); + } + } catch (Exception ex) { + LOGGER.error("Task Target Skor Dokter : Check/Generate Target Skor Dokter " + ex.getMessage()); + } finally { + LOGGER.info("Task Target Skor Dokter : Finishing Check/Generate Target Skor Dokter"); + } + } + +} diff --git a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/timer/TargetSkorDokterTimer.java b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/timer/TargetSkorDokterTimer.java new file mode 100644 index 00000000..4f5759bc --- /dev/null +++ b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/asynctask/timer/TargetSkorDokterTimer.java @@ -0,0 +1,84 @@ +package com.jasamedika.medifirst2000.asynctask.timer; + +import java.util.Calendar; +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author salmanoe + * @since Dec 29, 2021 + */ +public class TargetSkorDokterTimer { + + private final static Logger LOGGER = LoggerFactory.getLogger(TargetSkorDokterTimer.class); + + // What to do + private final Runnable whatToDo; + + // when + private final int dayOfMonth; + private final int hourOfDay; + + // The current timer + private Timer current = new Timer(); + + public void cancelCurrent() { + LOGGER.info("TargetSkorDokterTimer : Cancel current execution"); + current.cancel(); + + LOGGER.info("TargetSkorDokterTimer : Removes the timertask so it can be garbage collected"); + current.purge(); + } + + public static TargetSkorDokterTimer schedule(Runnable runnable, int dayOfMonth, int hourOfDay) { + LOGGER.info("TargetSkorDokterTimer : Create a new instance"); + return new TargetSkorDokterTimer(runnable, dayOfMonth, hourOfDay); + } + + private TargetSkorDokterTimer(Runnable runnable, int day, int hour) { + this.whatToDo = runnable; + this.dayOfMonth = day; + this.hourOfDay = hour; + + schedule(); + } + + private void schedule() { + cancelCurrent(); + + LOGGER.info( + "TargetSkorDokterTimer : Assigning a new instance of Timer, allow the previous Timer to be garbage collected"); + current = new Timer(); + current.schedule(new TimerTask() { + public void run() { + try { + LOGGER.info("TargetSkorDokterTimer : Running schedule"); + whatToDo.run(); + } finally { + LOGGER.info("TargetSkorDokterTimer : Schedule for the next year"); + schedule(); + } + } + }, nextDate()); + } + + private Date nextDate() { + Calendar runDate = Calendar.getInstance(); + runDate.set(Calendar.MONTH, 0); + runDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + runDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + runDate.set(Calendar.MINUTE, 0); + runDate.set(Calendar.SECOND, 0); + runDate.set(Calendar.MILLISECOND, 0); + runDate.add(Calendar.YEAR, 1); + + LOGGER.info("TargetSkorDokterTimer : Set to next year " + runDate.getTime()); + + return runDate.getTime(); + } + +}