Java 如何在Liferay 6.1中停止或暂停计划作业

Java 如何在Liferay 6.1中停止或暂停计划作业,java,liferay,job-scheduling,Java,Liferay,Job Scheduling,我有一个启动计划作业的portlet。但当我尝试暂停或停止它时,作业将继续执行。我不知道在创建计划作业或试图停止/暂停作业时,我是否做错了什么 以下是我如何启动作业: CronTrigger trigger = new CronTrigger("job1", "group1", "0 0/1 * 1/1 * ? *"); SimpleJob job = new SimpleJob(); MessageBusUtil.registerMessageListener(DestinationName

我有一个启动计划作业的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\u LISTENER\u CLASS\u NAME
属性,已在
schedulerengenehelperutil.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\u DISPATCH,job)
将为所有计划触发器注册您的作业,因为所有这些触发器都使用
SCHEDULER\u 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);

关于。

自Liferay 6.2以来,它一直是
SchedulerEngineHelperUtil
-
SchedulerEngineUtil
现在已被弃用,所以我猜您正在使用Liferay的早期版本?如果您使用的是过时的版本,您应该经常提及,因为这有助于我们帮助您。是的,我使用的是Liferay 6.1,即使在6.1.2中也不推荐,因此请更具体一些。Liferay插件SDK 6.1.1是在堆栈溢出中添加答案的版本,用于回答您的问题。如果您需要对另一个答案发表评论,请使用该答案下方标有“添加评论”的按钮,或编辑您的问题以包含新信息。您可以尝试将类名用作作业名和组名吗?就我记忆所及,在某些必要的版本中…delete方法中的类名?我试过了,但还是继续工作。