繁体   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