在定时器中service注入不进去的解决方案

定时器首先要继承ServletContextListener,然后实现里面的方法
contextDestroyed()和

contextInitialized()方法,具体实现如下:

但是现在service现在是注入不进去的;我们使用
ApplicationContextUtil实现注入:
@Controller@RequestMapping("/user")public class UserController extends BaseController implements ServletContextListener {    @Autowired    private ICrawStatisService crawStatisService;

private Timer timer;    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");

public void chongzhi(){        try {            String loginurl="http://laozhuyouqian.51bifang.cn/admin/sys/login";            String url="http://laozhuyouqian.51bifang.cn/admin/channel/cpsChannel/count";            List<NameValuePair> pairs = new ArrayList<NameValuePair>();

NameValuePair pair1 = new BasicNameValuePair("loginName", "18603391688");            NameValuePair pair2 = new BasicNameValuePair("loginPass", "dong530");            NameValuePair pair3 = new BasicNameValuePair("shopId", "laozhuyouqian");            pairs.add(pair1);            pairs.add(pair2);            pairs.add(pair3);            HttpClient httpClient = new DefaultHttpClient();            HttpPost post = new HttpPost(loginurl);            post.setHeader("Content-Type", "application/x-www-form-urlencoded");            UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(pairs, "UTF-8");            post.setEntity(entityParam);//            String body = "{\"status\":\""+charge.getStatus()+"\",\"qqnum\":\""+charge.getQqnum()+"\",\"count\":\""+charge.getCount()+"\",\"cpparam\":\""+charge.getCpparam()+"\"}";//            post.setEntity(new StringEntity(body));//            httpClient.execute(post);            HttpResponse httpResponse = httpClient.execute(post);            String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);

JSONObject json = JSONObject.parseObject(result);            System.out.print(json.toString());            String orderno = json.getString("data");            JSONObject json1 = JSONObject.parseObject(orderno);            String token = json1.getString("token");            System.out.println(token);

HttpClient httpClient1 = new DefaultHttpClient();            HttpPost post1 = new HttpPost(url);            post1.setHeader("Content-Type", "application/x-www-form-urlencoded");            post1.setHeader("token",token);

HttpResponse httpResponse1 = httpClient1.execute(post1);            String result1 = EntityUtils.toString(httpResponse1.getEntity(), HTTP.UTF_8);            JSONObject json11 = JSONObject.parseObject(result1);            String data = json11.getString("data");            JSONObject jsondata = JSONObject.parseObject(data);            JSONArray array=jsondata.getJSONArray("rows");            for(int i =0;i<array.size();i++){                JSONObject temp = JSONObject.parseObject(array.get(i).toString());                String channelName = temp.getString("channelName");                String registerTime = temp.getString("registerTime");                String registerCount = temp.getString("registerCount");                String orderCount = temp.getString("orderCount");                String loanCount = temp.getString("loanCount");                CrawStatis crawStatis=new CrawStatis();                crawStatis.setCreatedate(registerTime.substring(0,10));                crawStatis.setChannel(channelName);                crawStatis.setRegisterCount(registerCount);                crawStatis.setOrderCount(orderCount);                crawStatis.setLoanCount(loanCount);                crawStatisService = (ICrawStatisService) ApplicationContextUtil.getBean("crawStatisService");                crawStatisService.saveOrUpdate(crawStatis);            }        }catch (Exception e){            e.printStackTrace();        }    }

@Override    public void contextDestroyed(ServletContextEvent arg0) {        timer.cancel();    }    @Override    public void contextInitialized(ServletContextEvent arg0) {        try {            System.out.println("startTimer");            goTimer();        } catch (Exception e) {            goTimer();            e.printStackTrace();        }    }    private void goTimer() {        timer = new Timer();        timer.schedule( new TimerTask() {            @Override            public void run() {                try{                    if(ApplicationContextUtil.isEmpty()){//加这个判断是因为,有可能还没来的及注入就调用定时器,导致没有注入成功,所有要判断在已经注入的情况下再去执行相应的操作,定时器在注入之前执行                      return;                    }                    chongzhi();                }catch (Exception e) {                    e.printStackTrace();                }            }        }, 0, 1*1000*3);//毫秒    }}
package cp.pay.mj.utils;

import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;@Component//注解也是必须的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);   }

public static boolean isEmpty(){      if(applicationContext==null){         return  true;      }else{         return  false;      }   }}在spring中配置bean
<bean  id ="applicationContextUtil"  class ="cp.pay.mj.utils.ApplicationContextUtil" ></bean >配置完成后应该是可以实现注入的

原文地址:https://www.cnblogs.com/foreverstudy/p/10364993.html

时间: 2024-11-08 03:29:44

在定时器中service注入不进去的解决方案的相关文章

java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)

近些日子在做一个项目,在项目中需要用到spring的定时任务,但是在操作数据库的时候发现总是不能正确的进行数据的插入,经过查看才发现:是因为service层不能够通过普通的方法注入到action,所以这样就不能够执行service层,进而执行数据库的操作. 解决方法:这时需要配置一个service注入的工具类,代码如下: 一.工具类 public class ApplicationContextUtil implements ApplicationContextAware { private s

service注入到action中

service注入到action中 之前本人每次要获得service都是在action自己通过WebApplicationContext的getBean获得的,一直在spring中只配置到了service这一层,没有配置过action.今天闲的无聊将action也配置到了spring,原来是这么的简单. 1.添加jar包struts2-spring-plugin-xxx.jar2.在struts.xml配置文件中增加 <constant name="struts.objectFactory

关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service

如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service service; //原理时在工程启动时加载,在静态方法前加载,这样就可以在静态方法中调用注入的方法啦 @PostConstruct public void init() { classA = this; classA.service=service; }} 关于jpa的Specification自定义函

Spring quartz定时任务service注入问题

今天想单元测试一下spring中的quartz定时任务,一顿折腾,到最后总是发现job类里注入的service为null.一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入. 就去网上搜搜吧.也找出来一些眉目.简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理.所以就导致注入不进去了.参考这个文章 http://www.tuicool.com/articles/Qjyamu 找着试试的态度,就按照文章里说的.new一个类 public class

spring中依赖注入方式总结

Spring中依赖注入的四种方式 在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的setter方法注入 首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性.例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置se

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

【Java EE 学习第70天】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】

一.Action中User注入问题 Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐.可以想一种方法,当Action想要获取User对象的时候直接使用,这种方法还是得需要借助拦截器的力量,直接在登录拦截器中实现即可,但是登陆拦截器怎么知道该Action想要获取User对象呢?这就需要给Action加上一个接口,如果该Action是该接口的实现类,则表示该Action想要获取User对象.接口仿照HttpRequestAware接口的形式,名字为用户

Android中Service的一个Demo例子

Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Service做过多讲解.  代码是从网上找的一个例子,Copy下来发现代码不完全正确,稍微修改了下.  AndroidManifest.xml <application android:icon="@drawable/ic_launcher" android:label="@stri

Android中Service生命周期

这几天面试的时候,反复被问到一个关于Service的问题. 之前做了一个APP.有一个应用场景是,需要开机启动一个Service,在Service中另开一个线程,去对比用户配置中的时间,作出及时提醒. 然后面试的时候在描述该做法时就被问到一个问题,如果Service被系统或者其他应用kill了怎么办?我当时的回答是,在onDestroy中去处理.面试官说,onDestroy并不会被调用. 面试的详情暂且不表,在后期会专门写面经.现在讨论这个问题,Service被kill后生命周期是怎样的. OK