Saya menggunakan Liferay 6.2 CE GA4. Saya telah mencoba menjadwalkan eksekusi suatu metode di pengontrol portlet saya.
Saya menemukan banyak tutorial yang sebagian besar tutorialnya menyediakan kasus di mana kita dapat menyediakan waktu di liferay-portlet.xml, seperti tutorial ini. Tapi saya ingin waktu dikonfigurasi oleh pengguna di portal. Jadi apakah mungkin untuk mendapatkan waktu dan menerapkan pekerjaan penjadwalan sederhana di pengontrol saya.
EDIT: Saya memiliki pengontrol seperti berikut yang melakukan pekerjaan penjadwalan.
public class MyController {
@RenderMapping
public String defaultView() {
String cron = "0 0/1 * 1/1 * ? *";
Date dt = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dt);
calendar.add(Calendar.MINUTE, 2);
Trigger trigger = null;
try {
trigger = TriggerFactoryUtil.buildTrigger(TriggerType.CRON, Scheduler.class.getName(), Scheduler.class.getName(), calendar.getTime(), calendar.getTime(), cron);
} catch (SchedulerException e) {
e.printStackTrace();
}
Portlet portlet = PortletLocalServiceUtil.getPortletById("portlet_id");
Message message = new Message();
message.put("CONTEXT_PATH", portlet.getContextPath());
message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, Scheduler.class.getName());
message.put(SchedulerEngine.PORTLET_ID, portlet.getPortletId());
Scheduler scheduler = new Scheduler();
MessageBusUtil.registerMessageListener(DestinationNames.SCHEDULER_DISPATCH, scheduler);
try {
SchedulerEngineHelperUtil.schedule( trigger, StorageType.PERSISTED, "", DestinationNames.SCHEDULER_DISPATCH, message, 5);
} catch (SchedulerException e) {
e.printStackTrace();
}
return "view";
}
}
Kelas Scheduler
di atas didefinisikan seperti di bawah ini.
public class Scheduler implements MessageListener {
@Override
public void receive(Message message) throws MessageListenerException {
myMethodAtScheduledTime();
}
public void myMethodAtScheduledTime() {
System.out.println("Invoked at " + new Date());
}
}
Metode myMethodAtScheduledTime
dipanggil setiap 10 atau 20 detik. Bagaimana cara membatasi panggilan hanya sekali saja. yaitu tepat pada waktu contoh kalender waktu + 2 menit (calendar.add(Calendar.MINUTE, 2);
)