2017-12-21 17 views
0

私はSpring Restful Webサービスで1分ごとに自動的にQuartzでジョブを実行していましたが、問題が見つかりました。Quartzを使ったスケジューリングの仕事

ログ:私は、各コントローラにprintlnを

17:24:00,016 INFO [stdout] (DefaultQuartzScheduler_Worker-6) Hello Letter Printing Timer Quartz! Thu Dec 21 17:24:00 ICT 2017 

17:24:00,016 INFO [stdout] (DefaultQuartzScheduler_Worker-6) ini controller testing 

17:24:00,016 INFO [stdout] (DefaultQuartzScheduler_Worker-6) ----controller----- 

17:24:00,016 ERROR [org.quartz.core.JobRunShell] (DefaultQuartzScheduler_Worker-6) Job DEFAULT.6da64b5bd2ee-929cc152-4d2a-4f06-8149-273dd89c6e36 threw an unhandled Exception: : java.lang.NullPointerException 
    at com.prudential.letter.printing.controller.ModifyFileController.modifyFileForGenerateUniqueID(ModifyFileController.java:20) [classes:] 
    at com.prudential.letter.printing.HelloJob.execute(HelloJob.java:20) [classes:] 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz-2.2.1.jar:] 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.1.jar:] 

17:24:00,016 ERROR [org.quartz.core.ErrorLogger] (DefaultQuartzScheduler_Worker-6) Job (DEFAULT.6da64b5bd2ee-929cc152-4d2a-4f06-8149-273dd89c6e36 threw an exception.: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException] 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-2.2.1.jar:] 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.1.jar:] 
Caused by: java.lang.NullPointerException 
    at com.prudential.letter.printing.controller.ModifyFileController.modifyFileForGenerateUniqueID(ModifyFileController.java:20) [classes:] 
    at com.prudential.letter.printing.HelloJob.execute(HelloJob.java:20) [classes:] 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz-2.2.1.jar:] 
    ... 1 more 

、サービス実装、およびDAOを実装するが、ジョブからわずかコントローラまで。コントローラからサービスにいたるまで、私はエラーを発見しました。

私のコード:

HelloJob.java

public class HelloJob implements Job { 

    TestingController testing = new TestingController(); 
    ModifyFileController modify = new ModifyFileController(); 

    public void execute(JobExecutionContext context) throws JobExecutionException { 
     System.out.println("Hello Letter Printing Timer Quartz! " + new Date()); 
     testing.getData(); 
     modify.modifyFileForGenerateUniqueID(); // to controller 
    } 
} 

私のコントローラ:

@RestController 
@RequestMapping(value = "/") 
public class ModifyFileController { 

    @Autowired 
    private FileService fileService; 

    @PostMapping("modify") 
    public String modifyFileForGenerateUniqueID() { 
     System.out.println("----controller-----"); 
     return fileService.modify(); 
    } 

} 

インタフェース:

public interface FileService { 
    public String modify(); 
} 

サービスのimpl:

@Service 
@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class FileServiceImpl implements FileService { 

    private static final Logger log = LoggerFactory 
      .getLogger(FileServiceImpl.class); 

    @Autowired 
    private FileDao fileDao; 

    @Autowired 
    ConfigProperties configProperties; 

    @Override 
    @Transactional 
    public String modify() { 
     System.out.println("----service impl-----"); 
     String data = configProperties.getSeparator(); 
     String[] result = data.split(";"); 
     String timeout = configProperties.getTimeout(); 
     Integer i = Integer.parseInt(timeout); 
     return fileDao.modify(result, i); 
    } 

} 

ダオ:

public interface FileDao { 
    public String modify(String[] result, Integer timeout); 
} 

ダオのImpl:

@Repository 
public class FileDaoImpl implements FileDao { 

    @Transactional 
    @Override 
    public String modify(String[] delimeter, Integer timeout) { 
     // the content here 
     return "Success"; 
    } 
} 

クォーツリスナー:実行中のジョブは、サービスIMPLに行っていないのはなぜ

@WebListener 
public class QuartzListener extends QuartzInitializerListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     super.contextInitialized(sce); 
     ServletContext ctx = sce.getServletContext(); 
     StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY); 
     try { 
      Scheduler scheduler = factory.getScheduler(); 
      JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).build(); 
      Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simple").withSchedule(
        CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *")).startNow().build(); 
      scheduler.scheduleJob(jobDetail, trigger); 
      scheduler.start(); 
     } catch (Exception e) { 
      ctx.log("There was an error scheduling the job.", e); 
     } 
    } 
} 

?ちょうどコントローラで停止し、エラー?ありがとう

+0

ログを参照してください。それはあなたのコントローラにNPEを持っています – pvpkiran

+0

ログに、 "NullPointerException"というエラーが表示されます。 –

答えて

0

newキーワードを使用して新しいコントローラを初期化しないでください。

さらに、Spring Dependency Injectionを使用してください。

public class HelloJob implements Job { 

    @Autowired 
    private TestingController testing; 

    @Autowired 
    private ModifyFileController modify; 

    // ... 
} 

問題はModifyFileControllerもそうでFileServiceとで依存していることです。このオブジェクトは、そのように呼び出そうとするとnullです。

私はそれをJobから追加する必要があります。のレイヤーでメソッドを呼び出し、Controllerレイヤーではなくメソッドを呼び出すほうがよいと思います。

+0

私はすでにコードを変更していましたが、まだエラーです。エラーは、ログjboss eap ..の "NullPointerException"を示しています。 –

+0

コードをどのように変更しましたか?正確にNullPointerException行がスローされていますか? – lzagkaretos

0

ジョブはコントローラと同じアプリケーションレベルにあると精神的に考える必要があります。そのような他のクラスからプログラマチックにコントローラメソッドを呼び出すべきではありません。あなたはあなたの仕事のFileServiceと直接対話する必要があります。

+0

私はすでにコードを変更していましたが、まだエラーがありました。エラーは、ログjboss eap ..の "NullPointerException"を示しています。 –

関連する問題