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