gpt4 book ai didi

java - 我应该使用 Spring 任务计划程序通过 @Async 注解在指定时间执行任务吗?

转载 作者:行者123 更新时间:2023-11-30 04:47:55 24 4
gpt4 key购买 nike

我在 Web 应用程序中使用 Spring 3,并且我想在未来两分钟内运行一次任务(例如发送电子邮件)。不同的用户(使用不同的参数)可能会多次调用来调度同一任务,因此会出现一些调度队列重叠。

在应用程序的其他地方,我使用 Spring 的 @Scheduled 注释定期执行 cron 样式任务,因此我已经有了 Spring's task execution and scheduling配置并工作。因此我的 applicationContext.xml 文件包含类似以下内容:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>

我编写了以下代码作为测试,从发送到控制台的输出来看,无论我是否使用 @Async 注释,似乎都没有任何区别(行为是相同)。

public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
long start = System.currentTimeMillis();
long inXseconds = start + (1000 * 10);
Date startTime = new Date(start + 5000);
TaskScheduler taskscheduler = (TaskScheduler) ctx.getBean("myScheduler");

System.out.println("Pre-calling " + new Date());
doSomethingInTheFuture(taskscheduler, startTime, "Hello");
System.out.println("Post-calling " + new Date());

while(System.currentTimeMillis()< inXseconds){
// Loop for inXseconds
}

System.exit(0);
}

@Async
private static void doSomethingInTheFuture(
TaskScheduler taskscheduler,
Date startTime,
final String attribute){
// Returns a ScheduledFuture but I don't need it
taskscheduler.schedule(new Runnable(){
public void run() {
System.out.println(attribute);
System.out.println(new Date());
}
}, startTime);
}

我的一些问题是:

我应该使用 @Async 注释吗?如果这样做会有什么不同?

最佳答案

这对您的情况没有影响,因为您已经使用 @Async 注释注释了静态方法 - 并且 Spring 不会在此实例中创建代理。

如果您在普通 Spring bean 方法上声明了 @Async 注释,那么行为将是在内部将其包装到 Runnable 类中并将其作为任务提交到线程池,并且您调用的方法将立即返回 -而任务则计划由线程池执行。

关于java - 我应该使用 Spring 任务计划程序通过 @Async 注解在指定时间执行任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10550484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com