【问题标题】:Liferay - Scheduler not triggering at the given timeLiferay - 调度程序未在给定时间触发
【发布时间】:2016-06-27 15:26:06
【问题描述】:

我一直在尝试在 Liferay 中实现调度程序作业。我的控制器如下所示。

public class MyController {
@RenderMapping
    public String defaultView() {
        String cron = "0 0 11 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(), null, 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());
    }
}

我没有在liferay-portlet.xml 中提供 cron 时间,因为我需要用户配置它。所以为了测试,我将定时触发时间设置为每天 11 点。

但是,即使我将我的 cron 时间设置为上午 11 点,作业本身也会在下一秒开始(甚至在 11 点之前)并且它永远不会结束。它每 10-20 秒就会被调用一次。我想将作业调用完全限制为 11.00,它应该只运行一次。我在这里做错了什么?

【问题讨论】:

    标签: java cron liferay scheduler


    【解决方案1】:

    我已经解决了这个问题。我不确定错误在哪里。但是当我替换下面的代码而不是上面的控制器代码时,我能够在准确的时间触发调度程序。

    public class MyController {
    @RenderMapping
        public String defaultView() {
            try {
                String cron = "0 0 11 1/1 * ? *";
                String description = "";
                String destinationName = DestinationNames.SCHEDULER_DISPATCH;
                int exceptionsMaxSize = 0;
                String portletId = "portlet_id";
    
                Message message = new Message();
                message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, Scheduler.class.getName());            
                message.put(SchedulerEngine.PORTLET_ID, portletId);
    
                Trigger trigger = new CronTrigger(Scheduler.class.getName(), Scheduler.class.getName(), cron);
                SchedulerEngineHelperUtil.schedule(trigger, StorageType.PERSISTED, description, destinationName, message, exceptionsMaxSize);
    
            } catch (SchedulerException e) {
                  e.printStackTrace();
            }
            return "view";
        }
    }
    

    问题应该是我创建了错误的Trigger 对象或错误地调用了registerMessageListener 方法。

    【讨论】:

      【解决方案2】:

      也是这个url,可以得到更多调度器的详细信息

      http://liferaytutorial.blogspot.in/2014/07/creating-scheduler-dynamically-in.html

      【讨论】:

      • 这个博客下面的cmets是我写的:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多