【发布时间】:2019-06-03 12:49:56
【问题描述】:
这个程序每天凌晨 4 点开始,但每天的时间表都开始两次,我已经检查了任何周期,但一切都井井有条。 为什么总是启动两次? 我该如何解决?
import javax.ejb.LocalBean;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class RichiamiSync {
@Schedule (minute = "00", hour = "04")
public void main() {
try {
Logica.esegui();
}
catch (Exception e) {
Log.write("ERROR " + e);
Log.write("---------------------ERRORE FATALE IL PROGRAMMA E' STATO ARRESTATO-------------------------");
}
Ottimizza.sql();
Log.sendEmail();
}
}
最初这些方法是这样记录的:
@Singleton
@LocalBean
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
但在另一个问题中,他们说无状态可以解决,现在问题总是一样
【问题讨论】:
-
一种可能性是任务已启动(一次),但在执行过程中失败并出现应用程序异常。可以将容器配置为重试可能再次成功或失败的任务。无论哪种方式,根据
Logica.esegui();中执行的任务,观察到的行为将是任务触发两次(即两个错误日志)。请提供Logica.esegui();实现。可能是应用程序异常被抛出但被吞没了。 -
另外,应用程序是否部署在集群中?会不会是集群的两个节点并行执行任务?你怎么知道任务实际上运行了两次?有堆栈跟踪吗?
-
是的,方法log.sendEmail();在程序结束时给我发一封电子邮件,每天我在 1 小时的距离内收到 2 个(整个程序的处理时间)然后它在第一个结束后立即启动,也有任何异常在始终通过电子邮件发送给我的文件日志中捕获,并且我已经好几天没有收到任何错误。 (计划成功)
-
通过整改,将ottimizza.sql();方法和 log.sendEmail() 方法;他们不能例外。 logica.esegui();方法无法启动它们,因为它们都被捕获了,从代码中可以看出,任何其他异常都会被 main 中的 try 捕获。
标签: java jakarta-ee apache-tomee