Liferay - 在用户从门户

时间:2015-11-16 11:22:45

标签: java liferay scheduler

我正在使用Liferay 6.2 CE GA4。我一直在尝试安排在我的portlet的控制器中执行一个方法。

我遇到了许多教程,其中大多数教程都提供了我们可以在liferay-portlet.xml中提供时间的案例,例如this tutorial。但是我希望用户在门户中配置时间。那么是否有可能在我的constroller中获得时间并实现一个简单的调度工作。

编辑:我有一个类似于控制器的控制器来执行调度工作。

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());
    }
}

每10或20秒调用一次方法myMethodAtScheduledTime。如何将呼叫限制为一次。即恰好在日历实例时间+ 2分钟(calendar.add(Calendar.MINUTE, 2);

1 个答案:

答案 0 :(得分:2)

可以动态创建调度程序。

  1. 您要运行的任务必须实现MessageListener - 只有一个double R = 200; double R2 = 1000; oTheta += 0.1; // depending on your framerate, the more you add, the faster it will orbit for (double t = 0; t < 2 * Math.PI; t += 0.01) { x = R * Math.cos(t) + 0 + R2 * Math.cos(oTheta); y = R * Math.sin(t) + 0 + R2 * Math.sin(oTheta); revalidate(); repaint(); } 方法的界面。
  2. 可以通过SchedulerEngineHelperUtil#schedule方法注册可配置的触发器。触发器将消息侦听器类和调用时间作为参数(等等)。
  3. 请参阅Creating the scheduler dynamically in liferay博文或this forum post以查找一些示例。