Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wildfly 按间隔运行JavaEECDI任务_Wildfly_Cdi_Java Ee 8 - Fatal编程技术网

Wildfly 按间隔运行JavaEECDI任务

Wildfly 按间隔运行JavaEECDI任务,wildfly,cdi,java-ee-8,Wildfly,Cdi,Java Ee 8,我需要在我的应用程序(WAR)启动后以间隔运行任务,我使用的是WildFly 21。 任务应该在启动时初始化,并在一定的时间间隔内执行一些工作 班级在下面 @ApplicationScoped @ActivateRequestContext public class TaskRunner { @Resource private ManagedScheduledExecutorService scheduler; @Inject private ScheduledFuture<

我需要在我的应用程序(WAR)启动后以间隔运行任务,我使用的是WildFly 21。 任务应该在启动时初始化,并在一定的时间间隔内执行一些工作

班级在下面

@ApplicationScoped
@ActivateRequestContext
public class TaskRunner {

 
  @Resource private ManagedScheduledExecutorService scheduler;

  @Inject private ScheduledFuture<?> TaskRunnerScheduler;

  private boolean initialized = false;

  private void init(@Observes @Initialized(ApplicationScoped.class) Object init) {

    if (initialized) return;

   
    initialized = true;
    try {
      // Execute at startup
      TaskRunner = scheduler.schedule(this::runSchedule, getSchedule());
    } catch (Throwable throwable) {

    }
  }

  private void runSchedule() {
//do some work
  }

  private Trigger getSchedule() {
    return new Trigger() {
      @Override
      public Date getNextRunTime(LastExecution lastExecutionInfo, Date taskScheduledTime) {
        return Date.from(
            ZonedDateTime.now().withSecond(0).withNano(0).plusHours("4").toInstant());
      }

      @Override
      public boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) 
       {return false;}};
  }

}
@ApplicationScoped
@ActivateRequestContext
公共类任务管理器{
@资源专用管理调度程序ExecutorService调度程序;
@注入私有ScheduledFuture TaskRunnerScheduler;
私有布尔初始化=false;
私有void init(@Observes@Initialized(ApplicationScoped.class)对象init){
如果(初始化)返回;
初始化=真;
试一试{
//启动时执行
TaskRunner=scheduler.schedule(this::runSchedule,getSchedule());
}捕捉(可抛可抛){
}
}
专用表格{
//做些工作
}
私有触发器getSchedule(){
返回新触发器(){
@凌驾
公共日期getNextRunTime(LastExecution lastExecutionInfo,Date taskScheduledTime){
返回日期。从(
ZoneDateTime.now()。秒(0)。纳米(0)。冥王星(“4”)。到instant();
}
@凌驾
公共布尔skipRun(LastExecution lastExecutionInfo,日期计划时间)
{返回false;}};
}
}
在尝试部署应用程序时,我遇到以下错误

 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service jboss.deployment.unit."task-web.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."task-web.war".WeldStartService: Failed to start service
    at org.jboss.msc@1.4.12.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1731)
    at org.jboss.msc@1.4.12.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
    at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
    at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
    at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type ScheduledFuture<?> with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private TaskRunner.TaskRunnerScheduler
  at TaskRunner.TaskRunnerScheduler(TaskRunner.java:0)

    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:143)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
    at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
    at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)

错误[org.jboss.msc.service.fail](msc服务线程1-6)MSC000001:无法启动服务jboss.deployment.unit.“task web.war.WeldStartService:服务jboss.deployment.unit.“task web.war”中的org.jboss.msc.service.StartException.WeldStartService:无法启动服务
在org.jboss。msc@1.4.12.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1731)
在org.jboss。msc@1.4.12.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
在org.jboss。threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
在org.jboss。threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
在org.jboss。threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
在org.jboss。threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
位于java.base/java.lang.Thread.run(Thread.java:834)
原因:org.jboss.weld.exceptions.DeploymentException:weld-001408:类型ScheduledFuture与限定符@Default的依赖关系不满足
在注入点[BackedAnnotatedField]@Inject private TaskRunner.TaskRunnerScheduler
位于TaskRunner.TaskRunnerScheduler(TaskRunner.java:0)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:143)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
在org.jboss.weld上。core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
位于java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
位于java.base/java.lang.Thread.run(Thread.java:834)
在org.jboss。threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)

你知道这个错误的原因是什么吗?

看起来你想每4小时左右运行一次。我可以建议更干净一点的实现吗

@Startup
@Singleton
public class MyScheduler {
    @PostConstruct
    private void runAtStartup() {
        // whatever makes sense here
    }

    @Schedule(hour = "*/4", persistent = false )
    private void runSomething() {
        // something here
    }
}
这将设置一个EJB在启动时运行(
@startup
),表示它只有一个实例(
@Singleton
)。然后每4小时运行一次
runSomething()
方法。您可以查看,因为还有许多其他的方法来运行它。如果以前只存在用于设置计时器的
@PostConstruct
方法,则可能需要也可能不需要该方法

persistent
参数告诉Wildfly记住上次运行的时间,如果重新启动,则继续按照该计划运行。如果您不关心方法是否在重新启动时再次运行,请将此值保留为false


我唯一的警告是这个机制不能处理重叠。如果您使用此方法,并且在最后一个方法完成之前(在本例中,4小时后)运行了新的计划方法,则至少会导致日志中出现错误,并且计划的运行方式与您预期的不同。

看起来您希望每4小时左右运行一次。我可以建议更干净一点的实现吗

@Startup
@Singleton
public class MyScheduler {
    @PostConstruct
    private void runAtStartup() {
        // whatever makes sense here
    }

    @Schedule(hour = "*/4", persistent = false )
    private void runSomething() {
        // something here
    }
}
这将设置一个EJB在启动时运行(
@startup
),表示它只有一个实例(
@Singleton
)。然后每4小时运行一次
runSomething()
方法。您可以查看,因为还有许多其他的方法来运行它。如果以前只存在用于设置计时器的
@PostConstruct
方法,则可能需要也可能不需要该方法

persistent
参数告诉Wildfly记住上次运行的时间,如果重新启动,则继续按照该计划运行。如果你不在乎你的方法
 private ScheduledFuture<?> TaskRunnerScheduler;