Liferay - การจัดกำหนดการงานในเวลาที่กำหนดโดยผู้ใช้จากพอร์ทัล

ฉันใช้ Liferay 6.2 CE GA4 ฉันพยายามกำหนดเวลาการดำเนินการของเมธอดในคอนโทรลเลอร์ของพอร์ตเล็ตของฉัน

ฉันเจอบทช่วยสอนมากมายซึ่งบทช่วยสอนส่วนใหญ่จะให้กรณีที่เราสามารถระบุเวลาใน liferay-portlet.xml เช่น บทช่วยสอนนี้ แต่ฉันต้องการให้ผู้ใช้กำหนดค่าเวลาในพอร์ทัล เป็นไปได้ไหมที่จะได้เวลาและใช้งานการตั้งเวลาแบบง่ายๆ ในตัวควบคุมของฉัน

แก้ไข: ฉันมีคอนโทรลเลอร์ดังต่อไปนี้ซึ่งทำหน้าที่กำหนดเวลา

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";
    }
}

คลาส Scheduler ด้านบนมีการกำหนดไว้ด้านล่าง

public class Scheduler implements MessageListener {
    @Override
    public void receive(Message message) throws MessageListenerException {
        myMethodAtScheduledTime();
    }

    public void myMethodAtScheduledTime() {
        System.out.println("Invoked at " + new Date());
    }
}

เมธอด myMethodAtScheduledTime ถูกเรียกใช้ทุกๆ 10 หรือ 20 วินาที ฉันจะจำกัดการโทรเพียงครั้งเดียวได้อย่างไร กล่าวคือ ณ เวลานั้น เวลาอินสแตนซ์ของปฏิทิน + 2 นาที (calendar.add(Calendar.MINUTE, 2);)


person Philip John    schedule 16.11.2015    source แหล่งที่มา


คำตอบ (1)


สามารถสร้างตัวกำหนดเวลาได้แบบไดนามิก

  1. งานที่คุณต้องการรันต้องใช้ MessageListener - อินเทอร์เฟซที่มีเพียง receive(Message) วิธีเดียว
  2. สามารถลงทะเบียนทริกเกอร์ที่กำหนดค่าได้ผ่าน SchedulerEngineHelperUtil#schedule ทริกเกอร์ใช้คลาสผู้ฟังข้อความและเวลาการเรียกใช้เป็นพารามิเตอร์ (อื่นๆ)

ดูโพสต์บล็อก การสร้างตัวกำหนดเวลาแบบไดนามิกใน liferay หรือ โพสต์ในฟอรัมนี้ เพื่อดูตัวอย่าง

person Tomas Pinos    schedule 16.11.2015
comment
คุณช่วยตรวจสอบโพสต์ที่อัปเดตตอนนี้ได้ไหม ตัวกำหนดเวลาจะถูกทริกเกอร์ทุก ๆ 10-20 วินาทีและไม่หยุด - person Philip John; 16.11.2015