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

Java Liferay 7.1-从调度程序作业终止线程执行,java,liferay,liferay-7,Java,Liferay,Liferay 7,我在Liferay 7.1中有以下工作: @Component( immediate = true, property = {"cron.expression=0 5 10 * * ? *"}, service = CustomJob.class ) public class CustomJob extends BaseMessageListener { .... @Override protected void doRec

我在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产生影响的操作。这种方法的美妙之处在于,两者都可以被分离到不同的机器上,例如规模

您好,谢谢您的回答。我是这样做的:这是正确的实施方式吗?其他问题:在通过集群发送消息(作业执行)这两个命题之间是否存在任何差异或建议:ClusterLinkUtil.sendMulticastMessage(message,Priority.LEVEL10);MessageBusUtil.sendMessage(DestinationNames.SCHEDULER_DISPATCH,message);