我正在尝试在 Helidon Microprofile 中配置调度程序。我试图从配置文件中获取 IntialDelay 和固定速率值,但它似乎不起作用。 我提供了我尝试过的所有不同方法。请帮助我以最好的方式解决这个问题。 谢谢你。
在下面的代码中,我期望调用构造函数并首先初始化 TaskScheduler()。但这并没有发生。 taskScheduler 未得到安排。
@ApplicationScoped
public class TaskScheduler {
private final Long initialDelay;
private final Long fixedRate;
private static final Logger LOGGER = Logger.getLogger(TaskScheduler.class.getName());
@Inject
public TaskScheduler() {
org.eclipse.microprofile.config.Config config = ConfigProvider.getConfig();
this.initialDelay = config.getOptionalValue("scheduler.initialDelay", Long.class).orElse(2L);
this.fixedRate = config.getOptionalValue("scheduler.fixedRate", Long.class).orElse(2L);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(this::taskScheduler, this.initialDelay, this.fixedRate, TimeUnit.SECONDS);
}
public void taskScheduler() {
LOGGER.info("Running tasks: ");
}
}
我尝试将 ConfigProperty 作为构造函数参数传递,如下代码所示,但出现此异常 线程“main”中的异常 org.jboss.weld.exceptions.DeploymentException:WELD-001408:带有限定符@Default
的 Long 类型的依赖关系不满足@Inject
public TaskScheduler(
@ConfigProperty(name = "scheduler.initialDelay") Long delay,
@ConfigProperty(name = "scheduler.fixedRate") Long rate
) {
this.initialDelay = delay;
this.fixedRate = rate;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(this::taskScheduler, this.initialDelay, this.fixedRate, TimeUnit.SECONDS);
}
我也尝试过使用@PostConstruct,但这根本没有被调用。
@PostConstruct
public void postConstruct() {
LOGGER.info("Running tasks: ");
Config config = ConfigProvider.getConfig();
long initialDelay = config.getOptionalValue("scheduler.initialDelay", Long.class).orElse(2L);
long fixedRate = config.getOptionalValue("scheduler.fixedRate", Long.class).orElse(2L);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(this::taskScheduler, initialDelay, fixedRate, TimeUnit.SECONDS);
}
正如 Dmitry 所建议的,我们有专门的调度支持,您不需要手动执行任何操作。 https://helidon.io/docs/v4/mp/scheduling