2 u011699931 u011699931 于 2016.04.28 12:31 提问

springmvc定时任务注入问题
数据库中有一个字段会不断更新,并且本地有一个文件存储着这个字段的信息,我写了一个定时器,自动更新文件,但是出问题了,下面是定时器代码:
 package org.ramer.diary.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.ramer.diary.service.TopicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;

/**
 * schedule job:
 *  execute  every ten seconds;
 *  query tags from table topic and remove duplicates ,and compare to local file "/xml/tags.xml";
 *  new tags will be append to file.
 *
 * @author ramer
 *
 */
@Controller
public class ScheduleWork implements ServletContextListener {

  /**
   * get millis for 'time'
   * @param time "HH:mm:ss"
   * @return
   */
  private long getTimeMillis(String time) {
    try {
      DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
      DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");
      Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);
      return curDate.getTime();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return 0;
  }

  @Override
  public void contextDestroyed(ServletContextEvent arg0) {

  }

  @Autowired
  TopicService topicService;
  @Value("#{diaryProperties['tags.xml.position']}")
  private String file;

  @Override
  public void contextInitialized(ServletContextEvent servletContextEvent) {
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    // execute every ten seconds
    long oneDay = 10 * 1000;

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
    // start now
    long initDelay = getTimeMillis(simpleDateFormat.format(new Date()))
        - System.currentTimeMillis();
    initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;
    // start execute job
    executor.scheduleAtFixedRate(() -> {
      System.out.println("----------start update tags-----------");
      // tags in database
      System.out.println(topicService);
      System.out.println(file);
      List<String> tags = topicService.getAllTags();
      // remove duplicate
      StringBuilder stringBuilder = new StringBuilder();
      for (String string : tags) {
        stringBuilder.append(string + ";");
      }
      String[] strings = stringBuilder.toString().split(";");
      // Arrays.asList will return a proxy with doesn't implement add() and remove(),so create a list.
      List<String> tagslist = Arrays.asList(strings);
      tagslist = new ArrayList<>(tagslist);
      for (int i = 0; i < tagslist.size(); i++) {
        for (int j = i + 1; j < tagslist.size(); j++) {
          if (tagslist.get(i).equals(tagslist.get(j))) {
            tagslist.remove(j);
            j--;
          }
        }
      }
      // tags no duplicate.
      tags = tagslist;
      System.out.println("tags in database: ");
      for (String string : tags) {
        System.out.println("\t" + string);
      }
      List<String> tagsInFile = new ArrayList<>();
      try {
        // read tags in local file
        tagsInFile = FileUtils.readTag(file, servletContextEvent.getServletContext());
      } catch (Exception e) {
        System.out.println("Exception ScheduleWork(Line 111)");
        e.printStackTrace();
      }
      System.out.println("文件中的tags: ");
      for (String string : tagsInFile) {
        System.out.println("\t" + string);
      }
      // less than tags in database ,so each the tags in local file
      for (int i = 0; i < tags.size(); i++) {
        if (!tagsInFile.contains(tags.get(i))) {
          tagsInFile.add(tags.get(i));
          i++;
        }
      }
      System.out.println("update tags: ");
      for (String string : tagsInFile) {
        System.out.println("\t" + string);
      }

      try {
        // update tags in local file
        FileUtils.writeTag(tagsInFile, file, servletContextEvent.getServletContext());
      } catch (Exception e) {
        System.out.println("Exception ScheduleWork(Line 129)");
        e.printStackTrace();
      }

    }, initDelay, oneDay, TimeUnit.MILLISECONDS);
  }

}

运行时,发现上面的‘topicService’和file总是null,也就是注入失败了,请问是什么原因呢?

1个回答

zjysource
zjysource   2016.04.28 14:48

请把springmvc的容器配置文件和工程的web.xml文件拿出来看看哈。光看你这个文件,是找不到原因滴。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
SpringMVC中定时器继承Task后无法对service注入问题
edisTask是通过定时器来每分钟像数据库里推送的,于是就有了 public class RedisTask extends Task { public void execute(TaskExecutionContext executor) throws RuntimeException { Scheduler scheduler = executor.getS
SpringMVC quartz 无法注入service和no session问题
在给项目添加定时任务的时候,想要注入service时失败 查询资料得出 spring配置文件里面要有context:component-scan 扫描到你的定时任务类 而且在类上加@Component就行了。 而没有no session问题是因为事务原因,所以需要在方法上面添加@Transactional 就可以了
Spring quartz定时任务Service注入问题
转载地址:http://www.cnblogs.com/dupang/p/6063734.html今天想单元测试一下spring中的quartz定时任务,job类的大致结构和下面的SpringQtz1类相似,我的是实现的org.quartz.Job接口,到最后总是发现job类里注入的service为null。一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入的原因。就去网上搜搜吧
Spring整合Quartz时,任务类中无法注入Bean的问题
项目中需要在tomcat启动时候就启动定时器运行定时任务,定时器采用在spring中集成quartz。 但是遇到了在任务类中需要引用注入类,但是注入类对象zhuangbeietongService为空,故查询原因得知:Quartz初始化是自己的JobContext,不同于Spring的ApplicationContext,所以无法直接注入,导致使用时产生空指针异常! pub
quartz定时任务与SpringMVC集成-自动注入管理bean
通过quartz实现定时任务的管理,由于quartz本身不支持的IOC自动注入管理bean。因此在于spring集成时,可通过自定义JobFactory的形式,通过继承AdaptableJobFactory类,将quartz对象的生命周期交给Spring IOC管理。结构:        JobFactory.java——实现自动注入        DBWriter.java——实现定时任务qua...
在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean
1.有时候在项目中需要定时启动某个任务,对于这个需求,基于JavaEE规范,我们可以使用Listener与TimerTask来实现,代码如下:public class TestTaskListener implements ServletContextListener { //Context()初始化方法 @Override public void context
Spring定时任务task(Quartz) bean 无法注入
最近项目中使用到定时任务,通过Spring管理,但是在写定时任务出现 bean 无法注入问题,通过在网上查找大量资料也没要找到问题,试过网上多种方法也无效,通过与朋友多方讨论最终解决问题,现在将其分享给大家这是第一次写博客,希望大家多多指点web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.o
Spring使用Quartz定时调度Job无法Autowired注入Service的解决方案
项目过程中有这样一个场景:调用w
一个简单的springmvc实现定时任务的例子
一、开发工具:STS二、步骤:1、创建SpringMvc项目2、编辑web.xml文件&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchem
在SpringMVC中,获取request对象的几种方式
工作中,由于写定时任务需要用到request获取ip地址,但springMVC模式下的定时器不允许带参。因此需要获取request对象,查找了些资料如下: 一、通过注解: @Autowired private  HttpServletRequest request; 二、在web.xml里配置监听: listener> listener-cla