Liferay - 调度程序未在给定时间触发
Liferay - Scheduler not triggering at the given time
我一直在尝试在 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
class定义如下
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 时间,因为我需要它由用户配置。因此为了测试,我将 cron 时间设置为每天 11:00 触发。
但是,即使我将 cron 时间设置为上午 11 点,作业会在下一秒开始(甚至在 11 点之前)并且永远不会结束。它每隔 10-20 秒就会被调用一次。我想将作业调用限制在 11.00,它应该 运行 只有一次。我在这里做错了什么?
我已经解决了这个问题。我不太确定错误在哪里。但是当我替换下面的代码而不是上面的控制器代码时,我能够在准确的时间触发调度程序。
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
方法。
还有这个url,可以获得更多关于调度器的细节
http://liferaytutorial.blogspot.in/2014/07/creating-scheduler-dynamically-in.html
我一直在尝试在 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
class定义如下
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 时间,因为我需要它由用户配置。因此为了测试,我将 cron 时间设置为每天 11:00 触发。
但是,即使我将 cron 时间设置为上午 11 点,作业会在下一秒开始(甚至在 11 点之前)并且永远不会结束。它每隔 10-20 秒就会被调用一次。我想将作业调用限制在 11.00,它应该 运行 只有一次。我在这里做错了什么?
我已经解决了这个问题。我不太确定错误在哪里。但是当我替换下面的代码而不是上面的控制器代码时,我能够在准确的时间触发调度程序。
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
方法。
还有这个url,可以获得更多关于调度器的细节
http://liferaytutorial.blogspot.in/2014/07/creating-scheduler-dynamically-in.html