如何使用外部配置属性在 EJB 的 @Schedule 注释中定义 cron 表达式?

问题描述 投票:0回答:1

我的属性文件中有一个 cron 表达式,但计划注释不会像 Spring 中的 Scheduled 注释那样采用该属性。

春天你可以做:

@Scheduled(cron = "${app.cronExpiredDepartures}")

我想对 EJB 做同样的事情。此时,我不关心计时器是编程的还是自动的,我只是想要更简单的方法来在我的计时器中使用 cron 属性。

我尝试使用@Schedule注释的info属性,但没有成功:

    @Inject
    @ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
    private String cronExpression;

    @Schedule(persistent = false, info = "app.cronExpiredDepartures")
    @Transactional
    public void checkExpiredDepartures() {

        System.out.println("checkExpiredDepartures executed");
        blabla
            }
        }
    }

这是我的属性文件中的 cron 表达式:

app.cronExpiredDepartures="* * * * *"

含义:

任何一刻, 任何时间, 任何一天, 任何一个月, 一周中的任何一天

所以:每分钟执行一次。

我也尝试过使用编程方法,但没有结果。超时方法不运行:

@无状态 公开课 ExpirationWatch {

@Resource
private TimerService timerService;

@Inject
@ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
private String cronExpression;


@PostConstruct
public void init() {
    ScheduleExpression schedule = new ScheduleExpression();

    String[] parts = cronExpression.split(" ");
    schedule
        .second("0")
        .minute(parts[0])
        .hour(parts[1])
        .dayOfMonth(parts[2])
        .month(parts[3])
        .dayOfWeek(parts[4]);

    timerService.createCalendarTimer(schedule, new TimerConfig("ExpirationWatchTimer", false));
}

@Timeout
@Transactional
public void checkExpiredDepartures()  {

    System.out.println("checkExpiredDepartures executed");
    
        }
    }
}

}

cron properties ejb schedule
1个回答
0
投票

我找到了一种让它发挥作用的方法。看来问题出在注释上。即使我将其更改为非常简单的情况,我的 EJB 编程计时器也没有执行。

我使用了注解@Singleton,而不是@Stateless(两者都不能使用)和@Startup,如下所示:

@Singleton
@Startup
public class ExpirationWatch {

@Resource
private TimerService timerService;

@Inject
@ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
private String cronExpression;


@PostConstruct
public void init() {
    ScheduleExpression schedule = new ScheduleExpression();

    String[] parts = cronExpression.split(" ");
    schedule
        .second("0")
        .minute(parts[0])
        .hour(parts[1])
        .dayOfMonth(parts[2])
        .month(parts[3])
        .dayOfWeek(parts[4]);

    timerService.createCalendarTimer(schedule, new TimerConfig("ExpirationWatchTimer", false));
}

@Timeout
@Transactional
public void checkExpiredDepartures()  {

    System.out.println("checkExpiredDepartures executed");
    
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.