10业务任务(service task)
Posted 老柳聊技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10业务任务(service task)相关的知识,希望对你有一定的参考价值。
描述
业务任务通常是用来调用业务系统,camunda中可以调用JAVA代码或者rest api调用。
业务任务分类
在camunda中,业务任务实现方式有5种,本节先用一个小例子显示前三种,External 外部任务,Connector连接器后面分别讲解。
- Java Class
- Expression
- Delegate expression
- External
- Connector
需求
假设用户预约电器公司上门维修家电,然后师傅上门维修,完成后公司回访客户对师傅服务打分,师傅查询自己的评分。
流程设计
1.预约维修
使用java class 模式实现业务任务。
com.forestlake.camunda.servicetask.ReserveRepair
2.师傅上门维修
使用Delegate expression实现业务任务,使用EL表达式接收实现任务的Bean,不用带方法名,默认调用execute方法。 实现任务的Bean需要implements JavaDeletegate接口。Java
Spring Task中的定时任务无法注入service的解决办法
1、问题
因一个项目(使用的是Spring+SpringMVC+hibernate框架)需要在spring task定时任务中调用数据库操作,在使用 @Autowired注入service时后台报错,导致系统不能访问。
2、代码
定时任务的代码如下:
@Component
public class TaskJob {
Logger logger = Logger.getLogger(TaskJob.class);
@Autowired
private TempService tempService ;
@Scheduled(cron = "* * /1 * * ?")
public void getDoorToken() {
//定时执行代码,需要
...数据库操作...
}
3、原因分析
由于定时 @Scheduled的执行优先级高于@Autowired注入,因此我们不能通过@Autowired注入service。
4、解决办法
在定时任务中通过在ApplicationContext中按名称查找service的实例,以便执行后续数据库操作。
4.1 定时任务中代码示例:TempService tempService = (TempService)ApplicationContextUtil.getBean("tempService");
4.2 在ApplicationContext中查找service代码示例:
关键是要实现 ApplicationContextAware,同时需要在Spring中注入
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return context;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
......其他代码......
}
以上是关于10业务任务(service task)的主要内容,如果未能解决你的问题,请参考以下文章