2017-06-28 23 views
0

Spring Bootでスケジュールされたタスクを作成したいとします。私はすでにこのような定義を持っています。既存のコントローラを使用したSpringブートのスケジュール済みタスク

@Component 
public class ScheduledTasks { 

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); 
    private static long count = 0; 

    @Autowired 
    private TaskRepository taskRepository; 

    @Scheduled(fixedRate = 15000) 
    public void createTasks() { 

     count++; 

     Task t = new Task(); 
     t.setTitle("Scheduled Task " + count); 
     //TaskController tc = new TaskController(); 
     //tc.create(t); 
     taskRepository.saveAndFlush(t); 

     log.info("A new scheduled task has been created!"); 
    } 
} 

これはうまくいきますが、私のリポジトリのインターフェイスを直接使用しています。リポジトリを直接使用するのではなく、私が持っている既存のコントローラクラスを使いたいと思います。私はこのようになりますコントローラクラスがあります。だから、

@RestController 
@RequestMapping("api/v1/") 
public class TaskController { 

    @Autowired 
    private TaskRepository taskRepository; 

    @RequestMapping(value = "tasks", method = RequestMethod.POST) 
    public Task create(@RequestBody Task task) { 
     return taskRepository.saveAndFlush(task); 
    } 
} 

を、どのように私は実際にScheduledTasksクラスでタスク作成のためのメソッドを作成し、これを呼び出すことができますか?私がコメントアウトしたようにnew TaskController()のようなことをしようとすると、null参照エラーが発生します。どのようにこれを回避するためのアイデア?

答えて

1

new TaskController()を作成した場合、作成したインスタンスはSpringによって管理されないため、IoC(依存関係のオートワイヤリング)は行われません。

私は、コントローラのSpring管理インスタンスを使いたいと思っています。その場合は、単にScheduledTaskコンポーネントでautowireしてください。 (以下のように(テストされていない))

@Component 
public class ScheduledTasks { 

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); 
    private static long count = 0; 

    @Autowired 
    private TaskRepository taskRepository; 

    @Autowired 
    private TaskController tc; 

    @Scheduled(fixedRate = 15000) 
    public void createTasks() { 

     count++; 

     Task t = new Task(); 
     t.setTitle("Scheduled Task " + count); 
     tc.create(t); 
     taskRepository.saveAndFlush(t); 

     log.info("A new scheduled task has been created!"); 
    } 
} 
+3

これは技術的には機能しますが、この種の機能を 'Controller'クラスに入れるのは非常に間違っているようです。コントローラの唯一の関心事は、UIにある必要があります。 –

+4

一般的な機能をサービスクラスに抽出し、コントローラとタスクの両方でこのサービスを使用する方が効果的です。 ✅ – Strelok

+0

私はそれが良いデザインではないことに懸念があることに同意する必要があります。サービスのステレオタイプを使用してそのログインを抽象化し、ScheduledTaskとControllerの両方にサービス(autowired)。 – Oliver

関連する問題