Liferay 7.1 - 从调度程序作业中终止线程执行

Liferay 7.1 - Kill a thread execution from scheduler jobs

我在 Liferay 7.1 中有以下工作:

@Component(
        immediate = true, property = {"cron.expression=0 5 10 * * ? *"},
        service = CustomJob.class
)
public class CustomJob extends BaseMessageListener {

....

    @Override
    protected void doReceive(Message message) throws Exception {
           // HERE I CALL A SERVICE FUNCTION TO INACTIVATE USER, SEND MAILS, READ FILES TO IMPORT DATA
           RunnableService rs = new RunnableService();
           rs.run();
    }

....
}

还有我的 RunnableService:

 public class RunnableService implements Runnable  {
    
        @Override
        public synchronized void run() {
            // DO MY STUFF
        }
    }

作业运行良好,但即使第一次调用的服务执行尚未完成,作业的另一个实例也可以启动。

有没有杀死第一个进程的解决方案?

谢谢,

听起来有几种选择,具体取决于您想要实现的目标:

  • 您不应该使用技术措施中断线程。而是让你的长 运行 任务经常检查它是否应该仍然是 运行,否则优雅地终止 - 有可能在它自己
  • 之后清理
  • 您可以使用 Liferay 的 MessageBus 实现您的功能 - 无需启动线程(无论如何这在 webapp 中都不是好的行为)。这样做的美妙之处在于,即使在集群中,您最终也只有一个并发执行。
  • 您可以在 Liferay 进程之外实现您的功能,只需与 Liferay 的 API 交互,以便执行任何需要对 Liferay 产生影响的事情。这种方法的美妙之处在于两者都可以分离到不同的机器 - 例如规模。