Comments (10)
@Async("async-executor")可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor") 然后在testJob中调用该方法
@Service public class TestService{ @Async("async-executor") public void testService(){ try { Thread.sleep(3000); XxlJobHelper.handleSuccess("job executed success"); } catch (Exception e) { XxlJobHelper.handleFail("job executed fail"); } } } @Component public class TestSyncSchedule { @ private TestService service; @XxlJob(value = "testJob") public void testJob) { service.testService(); }
看了下源码,job为异步后,jobThread很快就执行完成execute方法,之后会立马去获取jobContext,获取不到你设置的handlMsg
from xxl-job.
你需要将你job的context传递到你的异步线程里去
from xxl-job.
你需要将你job的context传递到你的异步线程里去
可以详细说一下吗?
from xxl-job.
你需要将你job的context传递到你的异步线程里去
可以详细说一下吗?
//如果你@async指定了线程池,你需要在实例化线程池的时候这么操作
//假如你用的是ThreadPoolTaskExecutor
@Bean("async-executor")
public ThreadPoolTaskExecutor asyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(30);
executor.setQueueCapacity(256);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("async-");
executor.setTaskDecorator(runnable -> {
//获取主线程的上下文
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
return () -> {
//设置异步线程上下文
XxlJobContext.setXxlJobContext(context);
runnable.run();
};
});
return executor;
}
from xxl-job.
你需要将你job的context传递到你的异步线程里去
可以详细说一下吗?
//如果你@async指定了线程池,你需要在实例化线程池的时候这么操作 //假如你用的是ThreadPoolTaskExecutor
@Bean("async-executor") public ThreadPoolTaskExecutor asyncExecutor(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); executor.setMaxPoolSize(30); executor.setQueueCapacity(256); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.setThreadNamePrefix("async-"); executor.setTaskDecorator(runnable -> { //获取主线程的上下文 XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext(); return () -> { //设置异步线程上下文 XxlJobContext.setXxlJobContext(context); runnable.run(); }; }); return executor; }
之前的代码和这个差不多,刚才按照您的写法试了下,还是不行。
代码如下:
@Configuration
public class TestAsyncConfig {
@Bean("async-executor")
public ThreadPoolTaskExecutor asyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(30);
executor.setQueueCapacity(256);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("async-");
executor.setTaskDecorator(runnable -> {
//获取主线程的上下文
XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
return () -> {
//设置异步线程上下文
XxlJobContext.setXxlJobContext(xxlJobContext);
runnable.run();
};
});
return executor;
}
}`
定时任务类如下:
`@Component
@RequiredArgsConstructor
@Async("async-executor")
public class TestSyncSchedule {
@XxlJob(value = "testJob")
public void testJob) {
try {
Thread.sleep(3000);
XxlJobHelper.handleSuccess("job executed success");
} catch (Exception e) {
XxlJobHelper.handleFail("job executed fail");
}
}
执行结果如下图:
最新一条是去掉异步线程池之后的效果,这个是期望效果。
from xxl-job.
@Async("async-executor")
可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor")
然后在testJob中调用该方法
@Service
public class TestService{
@Async("async-executor")
public void testService(){
try {
Thread.sleep(3000);
XxlJobHelper.handleSuccess("job executed success");
} catch (Exception e) {
XxlJobHelper.handleFail("job executed fail");
}
}
}
@Component
public class TestSyncSchedule {
@
private TestService service;
@XxlJob(value = "testJob")
public void testJob) {
service.testService();
}
from xxl-job.
@Async("async-executor")可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor") 然后在testJob中调用该方法
@Service public class TestService{ @Async("async-executor") public void testService(){ try { Thread.sleep(3000); XxlJobHelper.handleSuccess("job executed success"); } catch (Exception e) { XxlJobHelper.handleFail("job executed fail"); } } } @Component public class TestSyncSchedule { @ private TestService service; @XxlJob(value = "testJob") public void testJob) { service.testService(); }
from xxl-job.
@Async("async-executor")可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor") 然后在testJob中调用该方法
@Service public class TestService{ @Async("async-executor") public void testService(){ try { Thread.sleep(3000); XxlJobHelper.handleSuccess("job executed success"); } catch (Exception e) { XxlJobHelper.handleFail("job executed fail"); } } } @Component public class TestSyncSchedule { @ private TestService service; @XxlJob(value = "testJob") public void testJob) { service.testService(); }看了下源码,job为异步后,jobThread很快就执行完成execute方法,之后会立马去获取jobContext,获取不到你设置的handlMsg
所以不应该用异步是吧
from xxl-job.
@Async("async-executor")可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor") 然后在testJob中调用该方法
@Service public class TestService{ @Async("async-executor") public void testService(){ try { Thread.sleep(3000); XxlJobHelper.handleSuccess("job executed success"); } catch (Exception e) { XxlJobHelper.handleFail("job executed fail"); } } } @Component public class TestSyncSchedule { @ private TestService service; @XxlJob(value = "testJob") public void testJob) { service.testService(); }看了下源码,job为异步后,jobThread很快就执行完成execute方法,之后会立马去获取jobContext,获取不到你设置的handlMsg
所以不应该用异步是吧
是的
from xxl-job.
@Async("async-executor")可以试下将你的业务代码封装到单独的类和方法,然后在该方法上加@async("async-executor") 然后在testJob中调用该方法
@Service public class TestService{ @Async("async-executor") public void testService(){ try { Thread.sleep(3000); XxlJobHelper.handleSuccess("job executed success"); } catch (Exception e) { XxlJobHelper.handleFail("job executed fail"); } } } @Component public class TestSyncSchedule { @ private TestService service; @XxlJob(value = "testJob") public void testJob) { service.testService(); }看了下源码,job为异步后,jobThread很快就执行完成execute方法,之后会立马去获取jobContext,获取不到你设置的handlMsg
所以不应该用异步是吧
是的
了解了 感谢
from xxl-job.
Related Issues (20)
- 2.4.0版本执行器注册调度中心400问题
- UI重构 HOT 1
- xxl-job弹性资源 HOT 1
- 调度异常
- 修改Job出现415异常,如图所属 HOT 1
- 关于授权问题 HOT 2
- k8s部署,执行器用k8s的服务名,这样配置确实可以访问执行器,而且pod重启ip不一样的问题也可以解决,但是就只会注册一个节点了,任务路由就不准了吧
- 能不能把xxl-job能成spring boot starter方便我们更新维护
- 旧服务下线的一段时间内,还是有任务会执行到这个机器节点上,有没有什么办法在新服务(和旧服务ip不通)上线的时候直接剔除旧的节点呢 HOT 1
- 可以做一个sqlite版本么
- Spring Web UriComponentsBuilder URL解析不当漏洞(CVE-2024-22259)
- SnakeYAML版本升级
- 重启xxl-job,任务丢失
- 分布式锁优化
- 容器节点注册xxl-job执行器,已下线的节点移除延时严重
- XxlJobAdminConfig bug?
- callback的json value中存在“双引号,会一直重试打log,损耗资源
- 整合xxl-job后,存在注解@RequestLine 时,服务启动报错,去掉xxl-job启动器,就正常了
- No classes defined at reference '64'
- 升级ipv6后 节点注册列表不适配ipv6 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from xxl-job.