【问题标题】:@Schedule starts twice [duplicate]@Schedule 启动两次 [重复]
【发布时间】: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


【解决方案1】:

这是解决方案:

@Singleton
@LocalBean
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class ServerStartStop {

    private ExecutorService es2 = Executors.newSingleThreadExecutor();
    private Future<Void> operazioniAggiornamentoUI =null;
    
    
    @Schedule(hour = "*" ,minute = "*",second = "*/10", persistent = false)
    public void AggiornamentoUI(Timer timerInfo) {
        
        if (operazioniAggiornamentoUI!=null)
            if(!operazioniAggiornamentoUI.isDone())
                return;
        
        
        Callable<Void> callableObj = () -> { try {

            GestoreAcquisizioneOrdiniUI.aggiornaUiAcquisizioneOrdini();
            
            
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
        };
        
        
        
        operazioniAggiornamentoUI=es2.submit(callableObj);
        
        
        
        
    }}

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多