Liferay - Планирование задания на время, установленное пользователем на портале

Я использую 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);)


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