SpringMVCでタイマーがTaskを継承してサービスに問題を注入できない
3221 ワード
最近Spring+MyBatisのプロジェクトをしていますが、Redisのストレージが使用され、問題が発生しました.
RedisTaskはタイマーで毎分データベースのようにプッシュされているので、
そしてタイマのタスクでRedisの呼び出しによりローカルデータベースにプッシュ
そこで問題が発生し、tomcatがタイマを呼び出さなかったRedisTaskがエラーを報告し始め、debugはorderServiceがnullであることを発見し、つまりサービスが注入されていないことを発見した.
それから私はSpringのプロファイルの中で表示の問題を見て、まったく問題がないことを発見して、それからこの方法がTaskを継承したことを発見して、そこでぼんやりと悟りました
:タイマがTaskを継承すると、タイマがこのメソッドを呼び出すと、注釈を急いで注入しないようにexecuteメソッドが直接実行されます.
ソリューション:
1、ApplicationContextUtilを導入するツール類
2.executeメソッドでこのようにサービスを注入する
注意:サービスのインタフェースの@Serviceタグには、入力した名前を明記する必要があります.
これで問題は完璧に終わり、今晩redisの使用を新しいブログに書きます.OK、仕事が終わるのを待っています.
RedisTaskはタイマーで毎分データベースのようにプッシュされているので、
public class RedisTask extends Task {
public void execute(TaskExecutionContext executor) throws RuntimeException {
Scheduler scheduler = executor.getScheduler();
TaskExecutor[] executors = scheduler.getExecutingTasks();
if(executors!=null && executors.length>1)//
そしてタイマのタスクでRedisの呼び出しによりローカルデータベースにプッシュ
OrderService orderService = new OrderService();
Order order = new Order();
int num = orderService.add(order);
System.out.println(" :" + num);
そこで問題が発生し、tomcatがタイマを呼び出さなかったRedisTaskがエラーを報告し始め、debugはorderServiceがnullであることを発見し、つまりサービスが注入されていないことを発見した.
それから私はSpringのプロファイルの中で表示の問題を見て、まったく問題がないことを発見して、それからこの方法がTaskを継承したことを発見して、そこでぼんやりと悟りました
:タイマがTaskを継承すると、タイマがこのメソッドを呼び出すと、注釈を急いで注入しないようにexecuteメソッドが直接実行されます.
@Resource
private OrderService orderService;
ソリューション:
1、ApplicationContextUtilを導入するツール類
package com.aneop.common.util;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext) {
ApplicationContextUtil.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
}
2.executeメソッドでこのようにサービスを注入する
OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");
注意:サービスのインタフェースの@Serviceタグには、入力した名前を明記する必要があります.
@Service("orderService")
public class OrderServiceImpl implements OrderService {
これで問題は完璧に終わり、今晩redisの使用を新しいブログに書きます.OK、仕事が終わるのを待っています.