Я использую Liferay 6.2 CE GA4. Я пытался запланировать выполнение метода в контроллере моего портлета.
Я наткнулся на множество руководств, в которых в большинстве руководств описаны случаи, когда мы могли указать время в файле liferay-portlet.xml, например это руководство. Но я хотел бы, чтобы время настраивалось пользователем на портале. Так можно ли найти время и реализовать простую работу по планированию в моем контроллере.
EDIT: у меня есть контроллер, подобный следующему, который выполняет задание по планированию.
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);
)