Spring定时任务直接调用Action里面的方法后,springIOC依赖注入的关系和属性都丢失了~~!这个问题怎么解决,或者,我怎么才能用Spring定时任务通脱Struts2调用Action里面的方法。
   在页面上点击进入方法,都好的呢,功能也都可以实现。

解决方案 »

  1.   

    不管是Struts、Struts2还是其他的web层框架,它们目前基于的技术都是Servlet,只要根据web.xml找到那个启动类,我们就能通过覆盖该类的的init()方法来实现系统的初始化工作。
      

  2.   


    在Struts中实现系统的初始化工作 
    在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。  Java代码 
    package fangwei.servlet;   
      
    import javax.servlet.ServletException;   
    import org.apache.struts.action.ActionServlet;   
      
    /**  
     * 系统唯一的Servlet类BaseServlet<br>  
     * 完成系统初始化的工作  
     */  
    public class BaseServlet extends ActionServlet {   
      
        private static final long serialVersionUID = -4743066925691800288L;   
      
        @Override  
        /*  
         * 系统初始化  
         */  
        public void init() throws ServletException {   
            super.init();   
      
            // 初始化系统全局变量   
            // ...   
      
            // 加载自定义配置文件   
            // ...   
      
            // 启动定时任务   
            // ...   
        }   
      
    }   package fangwei.servlet;import javax.servlet.ServletException;
    import org.apache.struts.action.ActionServlet;/**
     * 系统唯一的Servlet类BaseServlet<br>
     * 完成系统初始化的工作
     */
    public class BaseServlet extends ActionServlet {    private static final long serialVersionUID = -4743066925691800288L;    @Override
        /*
         * 系统初始化
         */
        public void init() throws ServletException {
            super.init();        // 初始化系统全局变量
            // ...        // 加载自定义配置文件
            // ...        // 启动定时任务
            // ...
        }} Xml代码 
    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app>  
      <!-- struts servlet begin -->  
      <servlet>  
        <servlet-name>struts</servlet-name>  
        <servlet-class>fangwei.servlet.BaseServlet</servlet-class>  
        <init-param>  
          <param-name>config</param-name>  
          <param-value>/WEB-INF/struts/struts-config.xml</param-value>  
        </init-param>  
        <load-on-startup>0</load-on-startup>  
      </servlet>  
      <servlet-mapping>  
        <servlet-name>struts</servlet-name>  
        <url-pattern>*.do</url-pattern>  
      </servlet-mapping>  
      <!-- struts servlet end -->  
    </web-app>  <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
      <!-- struts servlet begin -->
      <servlet>
        <servlet-name>struts</servlet-name>
        <servlet-class>fangwei.servlet.BaseServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>struts</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <!-- struts servlet end -->
    </web-app>
      

  3.   


    在Struts中实现系统的初始化工作 
    在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。  Java代码 
    package fangwei.servlet;   
      
    import javax.servlet.ServletException;   
    import org.apache.struts.action.ActionServlet;   
      
    /**  
     * 系统唯一的Servlet类BaseServlet<br>  
     * 完成系统初始化的工作  
     */  
    public class BaseServlet extends ActionServlet {   
      
        private static final long serialVersionUID = -4743066925691800288L;   
      
        @Override  
        /*  
         * 系统初始化  
         */  
        public void init() throws ServletException {   
            super.init();   
      
            // 初始化系统全局变量   
            // ...   
      
            // 加载自定义配置文件   
            // ...   
      
            // 启动定时任务   
            // ...   
        }   
      
    }   package fangwei.servlet;import javax.servlet.ServletException;
    import org.apache.struts.action.ActionServlet;/**
     * 系统唯一的Servlet类BaseServlet<br>
     * 完成系统初始化的工作
     */
    public class BaseServlet extends ActionServlet {    private static final long serialVersionUID = -4743066925691800288L;    @Override
        /*
         * 系统初始化
         */
        public void init() throws ServletException {
            super.init();        // 初始化系统全局变量
            // ...        // 加载自定义配置文件
            // ...        // 启动定时任务
            // ...
        }} Xml代码 
    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app>  
      <!-- struts servlet begin -->  
      <servlet>  
        <servlet-name>struts</servlet-name>  
        <servlet-class>fangwei.servlet.BaseServlet</servlet-class>  
        <init-param>  
          <param-name>config</param-name>  
          <param-value>/WEB-INF/struts/struts-config.xml</param-value>  
        </init-param>  
        <load-on-startup>0</load-on-startup>  
      </servlet>  
      <servlet-mapping>  
        <servlet-name>struts</servlet-name>  
        <url-pattern>*.do</url-pattern>  
      </servlet-mapping>  
      <!-- struts servlet end -->  
    </web-app>  <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
      <!-- struts servlet begin -->
      <servlet>
        <servlet-name>struts</servlet-name>
        <servlet-class>fangwei.servlet.BaseServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>struts</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <!-- struts servlet end -->
    </web-app>
      

  4.   

    实现定时任务 貌似不是简单的延迟加载吧?
    在web.xml里面定义的只是初始化顺序吧。 想要实现类似批处理那样的定时循环加载,在spring里面有一个任务task的类来实现,你可以订制启动的时间,执行时间 等等
      

  5.   

    在web.xml中加入
    <listener>   
    <listener-class>com.hundsun.u3c.task.MyTaskTimer</listener-class>   
    </listener> 再起个定时器
    public class MyTaskTimer implements ServletContextListener {
    private Timer timer = null; @Override
    public void contextDestroyed(ServletContextEvent event) {
    // TODO Auto-generated method stub
    timer.cancel(); } @Override
    public void contextInitialized(ServletContextEvent event) {
               
    timer = new Timer(true);
    timer.schedule(new 类名(event.getServletContext()),1000,1000);


    }}
    这种文式可以把servletContext上下文传过去
      

  6.   

    Spring 定时任务timer和quartz实例详解  www.phome.asia/forum/thread/23397.html

      

  7.   

    lz分层有问题。所谓“定时执行”的工作,
    应该不是action的范畴,
    而只应该是执行“一个service的方法”action只应该相应来自客户端的激活。所以,
    写一个service类,在spring中配置一下,
    包括定义和IOC别的(诸如数据库连接)属性。用MethodInvokingJobDetailFactoryBean,
    其中targetObject指定那个service类,
    targetMethod指定一个要执行的方法名就可以了。
    (当然其他的trigger/scheduler之类的配置也要配,
    不在此贴讨论范围之内)good luck