簡體   English   中英

如何在Liferay 6.1中停止或暫停計划的作業

[英]How to stop or pause a scheduled job in Liferay 6.1

我有一個Portlet可以啟動預定的工作 但是當我嘗試暫停或停止它時,作業將繼續執行。 我不知道在創建計划作業時還是在嘗試停止/暫停它時是否做錯了什么。

這是我啟動工作的方式:

CronTrigger trigger = new CronTrigger("job1", "group1", "0 0/1 * 1/1 * ? *");

SimpleJob job = new SimpleJob();
MessageBusUtil.registerMessageListener(DestinationNames.SCHEDULER_DISPATCH, job);

Message message = new Message();
message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, SimpleJob.class.getName());
SchedulerEngineUtil.schedule(trigger, StorageType.PERSISTED, 
    "Scheduled Job", DestinationNames.SCHEDULER_DISPATCH, message, 0);

這是工作:

public class SimpleJob implements  MessageListener {
    private static Log log = LogFactoryUtil.getLog(SimpleJob.class);

    @Override
    public void receive(Message message) throws MessageListenerException {
        log.debug(" ... SimpleJob executed ... ");      
    }

}

這是試圖停止的功能:

public void stopCron(ActionRequest request, ActionResponse response)throws Exception{
    SimpleJob job = new SimpleJob();

    MessageBusUtil.unregisterMessageListener(DestinationNames.SCHEDULER_DISPATCH, job);
    SchedulerEngineUtil.pause("job1", "group1", StorageType.PERSISTED);
    SchedulerEngineUtil.delete("job1", "group1", StorageType.PERSISTED);
    SchedulerEngineUtil.unschedule("job1", "group1", StorageType.PERSISTED);

}

如何停止工作?

首先:您正在注銷錯誤的工作實例:

SimpleJob job = new SimpleJob();
MessageBusUtil.unregisterMessageListener(DestinationNames.SCHEDULER_DISPATCH, job);

給定的工作不是您已注冊的實例

 MessageBusUtil.registerMessageListener(DestinationNames.SCHEDULER_DISPATCH, job);

結果, unregisterMessageListener將不執行任何操作。

第二:您根本不需要注冊任何消息偵聽器。 使用消息中的MESSAGE_LISTENER_CLASS_NAME屬性,在SchedulerEngineHelperUtil.schedule()已經為您注冊了一個。 但是要正確使用它,您還必須定義portlet或Web上下文的ID:

String simpleJobClass = SimpleJob.class.getName();
message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, simpleJobClass);
message.put(SchedulerEngine.PORTLET_ID, "my-web-context or my-portlet-id");
message.put(SchedulerEngine.DESTINATION_NAME, DestinationNames.SCHEDULER_DISPATCH);

現在應該可以如示例中所示暫停/取消您的工作:

SchedulerEngineUtil.delete("job1", "group1", StorageType.PERSISTED);

順便說一句: MessageBusUtil.registerMessageListener(DestinationNames.SCHEDULER_DISPATCH, job)將為所有計划的觸發器注冊您的作業,因為它們都使用SCHEDULER_DISPATCH作為目的地名稱。

首先感謝您的回答! 我用您的代碼嘗試了此操作,沒有注冊消息偵聽器,並且該作業沒有觸發。 但是,使用MessageBusUtil.registerMessageListener可以啟動作業,但是使用

SchedulerEngineUtil.pause("work1", "grupo1", StorageType.PERSISTED);

工作不會停止。

發射代碼:

String cron = "0 0/1 * 1/1 * ? *";
    CronTrigger trigger = null;
    trigger = new CronTrigger("work1", "grupo1", cron); 

    SimpleJob job = new SimpleJob();

    Message message = new Message();
    message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, SimpleJob.class);
    message.put(SchedulerEngine.PORTLET_ID, td.getPortletDisplay().getId());
    message.put(SchedulerEngine.DESTINATION_NAME, DestinationNames.SCHEDULER_DISPATCH);



    MessageBusUtil.registerMessageListener(DestinationNames.SCHEDULER_DISPATCH, job);
    SchedulerEngineUtil.schedule(trigger, StorageType.PERSISTED, "Scheduled Job", DestinationNames.SCHEDULER_DISPATCH, message, 0);

並停止其他功能:

SchedulerEngineUtil.delete("work1", "grupo1", StorageType.PERSISTED);

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM