2016-08-21 31 views
0

コードを変更して動作させるにはどうすればいいですか?Spring @AutowiredアノテーションがJava TimerTaskで機能しない

public class GetDataFromTheWarehouse implements ServletContextListener { 

    @Autowired 
    ScheduledTask scheduledTask; 

    private ScheduledExecutorService scheduler = null; 

    public GetDataFromTheWarehouse() { 
    } 

    public void contextDestroyed(ServletContextEvent arg0) { 
     try { 
      System.out.println("Scheduler Shutting down successfully " + new Date()); 
      scheduler.shutdown(); 
     } catch (Exception ex) { 
     } 
    } 

    public void contextInitialized(ServletContextEvent arg0) { 
     if ((scheduler == null) || (!scheduler.isTerminated())) { 
      scheduler = Executors.newSingleThreadScheduledExecutor(); 
      scheduler.scheduleAtFixedRate(scheduledTask, 0, 60*60, TimeUnit.SECONDS); 
     } 
    } 
} 

productServiceがnullであるScheduledTaskクラスは、以下に示しますので、productService.save()呼び出すたびに失敗します:

@Component 
public class ScheduledTask extends TimerTask { 
    @Autowired 
    ProductService productService; 

    public void run() { 
     try { 
      parse(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void parse() throws IOException { 
      ... 
      productService.save(product); 
      ... 
     } 
    } 
} 

マイapplicationContext.xmlをします:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <!-- Enable autowire --> 
    <context:component-scan base-package="com" /> 
    <context:annotation-config /> 

    <bean id="usersUpdateTask" class="com.demo.task.ScheduledTask"> 
    </bean> 

    <mvc:annotation-driven /> 

    <mvc:resources mapping="/resources/**" location="/resources/" /> 

    <mvc:resources mapping="/views/**" location="/views/" /> 
    <mvc:resources mapping="/img/**" location="/img/" /> 
    <mvc:resources mapping="/fonts/**" location="/fonts/" /> 
    <mvc:resources mapping="/css/**" location="/css/" /> 
    <mvc:resources mapping="/js/**" location="/js/" /> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/demo" /> 
     <property name="username" value="root" /> 
     <property name="password" value="root" /> 
    </bean> 

    <!-- Session Factory Declaration --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.demo.model" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.enable_lazy_load_no_trans">true</prop> 
       <prop key="hibernate.default_schema">demo</prop> 
       <prop key="format_sql">true</prop> 
       <prop key="use_sql_comments">true</prop> 
       <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> --> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

</beans> 

私のデモの構造:あなたはすでにそのBeanクラスの@Componentを使用しているときにScheduledTaskがappilcationConfig.xmlで初期化していないのはなぜ

demo website structure

+0

'Autowired'フィールド@' null'なのですることはできません。これが起こると、アプリケーションの起動は 'BeanCreationException'で失敗します。今は 'null'の場合は、あなたがインスタンスを作成しているので、それは春ではありません。一般的にはバネで管理されていないServletContextListenerをautowiringしているので、autowiredなものは何も受け取らないでしょう。 –

+0

ありがとうございます。したがって、Tomcatがウェブサイトを起動した後、 'ServletContextListener'を使用せず、' @ Autowired''productService'が適用されるいくつかのスケジュールされたタスクを実行したい場合、どのような解決策を試すことができますか? –

答えて

0

。これをapplicationContext.xmlファイルから削除します。

<bean id="usersUpdateTask" class="com.demo.task.ScheduledTask"> 
</bean> 

EDIT:春ブートサンプルを追加。

@Scheduledの@AutowiredをSpring Bootで使用するサンプルコードは次のとおりです。

のpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>springboot-scheduler</groupId> 
<artifactId>springboot-scheduler-app</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
     <version>1.4.0.RELEASE</version> 
    </dependency> 
</dependencies> 
</project> 

MySpringBootApp.java

package my.spring.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.scheduling.annotation.EnableScheduling; 

@SpringBootApplication 
@EnableScheduling 
public class MySpringBootApp { 
    public static void main(String[] args) { 
    SpringApplication.run(new Object[] { MySpringBootApp.class }, args); 
    } 
} 

MyService.java

package my.spring.app; 

import java.text.SimpleDateFormat; 
import java.util.Date; 
import org.springframework.stereotype.Component; 

@Component 
public class MyService {  
public String getNextMessage(){ 
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()); 
    } 
} 

ScheduledTask.java

package my.spring.app; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 

@Component 
public class ScheduledTask { 

@Autowired 
MyService service; 

@Scheduled(fixedRate = 5000) 
public void process() { 
    System.out.println("Processing at " + service.getNextMessage()); 
    } 
} 

サンプル出力

Processing at 2016-08-24T14:01:48 
Processing at 2016-08-24T14:01:53 
Processing at 2016-08-24T14:01:58 

は、この情報がお役に立てば幸いです。

EDIT-2:Springブートサンプルwarファイルのバージョンを追加しています。 Tomcat 8でテスト済み。 以下の2つのファイルが変更されています。その他は上記と同じです。

のpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>springboot-scheduler</groupId> 
<artifactId>springboot-scheduler-app</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>war</packaging> 

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.0.RELEASE</version> 
    <relativePath/> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

</project> 

MySpringBootApp.java

package my.spring.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.web.support.SpringBootServletInitializer; 
import org.springframework.scheduling.annotation.EnableScheduling; 

@SpringBootApplication 
@EnableScheduling 
public class MySpringBootApp extends SpringBootServletInitializer { 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(MySpringBootApp.class); 
    } 

public static void main(String[] args) { 

    SpringApplication.run(new Object[] { MySpringBootApp.class }, args); 

    } 
} 
+0

あなたの提案に感謝:)私の元の質問は私の状況を説明しましたが、David Makogonによって編集(削除)されました。ここでは削除されたコンテンツがあります:私は同様の質問があることを発見したが、私はそれらの解決策に従ったが、うまくいかなかった(おそらく私はそれらを誤解したかもしれない): java TimerTaskを使った@autowiredのSpringアノテートが機能しない java timertaskのSpring autowiredアノテーション コードを変更して動作させるには?可能であれば、作業コードを表示してください。 私はJavaの初心者です。私はこのデモを行うためにいくつかのチュートリアルに続き、多くのコードや構造が奇妙に見えるかもしれません。 –

+0

TimerTaskを使用する理由は何ですか? ScheduledTaskクラスのparse()メソッドでSpringの@Scheduledアノテーションを使用できます。 https://spring.io/guides/gs/scheduling-tasks/ – abaghel

+0

のスプリングガイドを参照してください。 元の問題は依然として存在します。スケジュールされたタスク(productServiceがnull)でAutowired ProductService productServiceを使用することはできません。 Autowiredがスケジュールされたタスクで動作するサンプルコードはありますか? –

関連する問題