当前位置: 首页 > 知识库问答 >
问题:

调度:在spring boot中只执行一次任务

江光明
2023-03-14
@Component
public class JobScheduler{

    @Autowired
    ServiceLayer service;

    @PostConstruct
    public void executeJob(){
        try {
            service.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
private TaskScheduler scheduler;

Runnable exampleRunnable = new Runnable(){
    @Override
    public void run() {
        System.out.println("do something ...");
    }
};

@Override
    @Async
    public void execute() throws Exception {
        try {

            List<Date> myListOfDates = getExecutionTime();  // call dao to get dates insered by the user

            ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor();
            scheduler = new ConcurrentTaskScheduler(localExecutor);
            for(Date d : myListOfDates ){
            scheduler.schedule(exampleRunnable, d);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

问题3:如果我使用@Schedured(initaildelay=10000,fixedrate=20000)而不是@PostConstruct注释,它将解决第一个问题,但是它将每20秒执行一次我的作业。

有线索吗?

共有1个答案

寇夜洛
2023-03-14

从你的问题中我可以推断,你是在问如何根据Spring开始的日期列表触发工作。

首先,我认为与其在bean/组件中使用@postconstruct,不如将它挂接到应用程序级别的事件侦听器中。参见http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/contextrefreshedevent.html

这样,您就可以确保所有bean都已初始化,因此可以加载MyListOfDates,然后启动调度程序。

 类似资料:
  • 是否可以只在指定的时间安排一次Spring服务方法?例如,当前时间是下午2点,但当我点击action按钮时,我希望我的服务方法在晚上8点开始。我很熟悉@Schedured注释,我不确定如何编写不定期运行的cron表达式。这个每天晚上8点触发。 有什么建议吗?

  • 每隔一段时间需要调度任务执行,也许你想注册一个任务在客户端完成连接5分钟后执行,一个常见的用例是发送一个消息“你还活着?”到远端通,如果远端没有反应,则可以关闭通道(连接)和释放资源。 本节介绍使用强大的 EventLoop 实现任务调度,还会简单介绍 Java API的任务调度,以方便和 Netty 比较加深理解。 使用普通的 Java API 调度任务 在 Java 中使用 JDK 提供的 S

  • 问题内容: 是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,并且不确定如何编写cron表达式以使其不定期运行。这一次,每天晚上8点触发。 有什么建议么? 问题答案: 你可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多的配置(

  • 我正在学习angularjs,作为一个测试项目,我正在轮询一个返回活动进程列表(它们的pid)并显示这些进程的服务器。 客户端代码如下所示: 这适用于Firefox和Chrome,但不太适用于Internet Explorer 11。 所有浏览器每秒都执行ReloadData方法,但IE11实际上并不从服务器获取流程数据。Firefox和Chrome确实每秒都会获取数据。我也可以在服务器的输出中看

  • 在上下文中没有Executor bean的情况下,Spring Boot会自动配置一个具有合理默认值的ThreadPoolTaskExecutor,这些默认值可以自动与异步任务执行(@EnableAsync)和Spring MVC异步请求处理相关联。 如果您在上下文中定义了自定义Executor,则常规任务执行(即@EnableAsync)将透明地使用它,但不会配置Spring MVC支持,因为它

  • 问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和