1

私は、さまざまな API からデータをダウンロードする Spring アプリケーションで作業しています。そのためには、API とやり取りして必要なデータをフェッチするクラス Fetcher が必要です。このクラスの要件の 1 つは、フェッチを開始するメソッドとフェッチを停止するメソッドが必要なことです。また、ユーザーはデータをフェッチしながらダッシュボードを操作できる必要があるため、すべてを非同期でダウンロードする必要があります。

これを達成するための最良の方法はどれですか? タスク エグゼキューターと、タスクをスケジュールして非同期に実行するための Spring のさまざまな注釈について読んできましたが、このソリューションは私の問題を解決していないようです。

4

3 に答える 3

1

これを行う最も簡単な方法は、Threadクラスを使用することです。Runnableメソッドでフェッチ機能を実行するオブジェクトを提供しrun()、スレッドが開始されると、別の実行スレッドでメソッドを呼び出しますrun

だから、このようなもの:

public class Fetcher implements Runnable{
    public void run(){
      //do fetching stuff
    }
}

//in your code
Thread fetchThread = new Thread(new Fetcher());
fetchThread.start();

キャンセルできるようにしたい場合は、いくつかの方法でキャンセルできます。最も簡単なのは (最も暴力的でお勧めできない方法ですが、スレッドを中断することです:

fetchThread.interrupt();

それを行う正しい方法はFetcher、変数を定期的にチェックして、実行中のことを停止する必要があるかどうかを確認するロジックをクラスに実装することです。

編集Spring を自動的に実行することについての質問に対して、定期的に実行する場合は、Quartz などのスケジューリング フレームワークを使用する必要があります。ただし、一度だけ実行したい場合は、@PostConstructアノテーションを使用できます。で注釈が付けられたメソッド@PostConstructは、Bean の作成後に実行されます。だから、あなたはこのようなことをすることができます

@Service
public class Fetcher implements Runnable{
    public void run(){
      //do stuff
    }

    @PostConstruct
    public void goDoIt(){
      Thread trd = new Thread(this);
      trd.start();
    }
}

編集 2私は実際にはこれについて知りませんでしたが、 Spring ドキュメント@Asyncの議論をまだチェックしていない場合はチェックしてください。やりたいこともあるかもしれません。

于 2013-05-29T21:04:06.917 に答える