1

私はそれを自分で開発する前に、特定の機能が設定されているJavaタスクスケジューラを探しています。Javaの巧妙なタスクスケジューラとエグゼクティブをお探しですか?

それは、スケジューラのそれほど多くはないのですが、今、実行することができますセット(T)にどのタスクを決定するロジックゲート(例えばThreadPoolExecutorにオフに渡される)とタスクは、いくつかの将来の状態を待たなければなりません。

これは私が実現したいものの一例である:各タスクに関連付けられている可能性があります考えてみましょうさまざまな属性:

  • はFoo:Fooのタスクは、1度に1つしか実行することができ、そうT. foo2は、実行容量がどれくらいあるかにかかわらず、T.foo1が完了するまで開始できません。
  • バー:バータスクには同時実行制限がないため、スケジューラは風に注意を払い、実行キューに直接T.bar1T.barNを送信できます。
  • タスクは、属性のFooバーを持つものとしてマークされている場合は、フー属性は、スケジュールに関して優先されます。

誰でもこのようなフレームワークを知っていますか?

ありがとうございます!

//ニコラス

答えて

3

個別のエグゼキュータを使用したいと思うようです。あなたは本当に無制限のスレッドにしたい場合は、FoonewFixedThreadPool(1)、次にBarnewCachedThreadPool()を使用することができます。あなたがsubmit(Foo foo)submit(Bar bar)、またはsubmit(Object obj)FooまたはBarをテストし、右のエグゼキュータにそれを提出することができたので、

は、その後、あなたは、いくつかのラッパーオブジェクトを持っているでしょう。ような何か:

public class FooBarExecutor { 
    private ExecutorService fooExecutor = Executors.newFixedThreadPool(1000); 
    private ExecutorService barExecutor = Executors.newCachedThreadPool(); 

    public <T> Future<T> submit(Foo foo) { 
     return fooExecutor.submit(foo); 
    } 

    public <T> Future<T> submit(Bar bar) { 
     return barExecutor.submit(bar); 
    } 

    public <T> Future<T> submit(Object obj) { 
     if (obj instanceof Foo) { 
      return submit((Foo)obj); 
     } else if (obj instanceof Bar) { 
      return submit((Bar)obj); 
     } else { 
      throw new IllegalArgumentException(
       "Object should be either Foo or Bar"); 
     } 
    } 
} 

はこのFooBarが両方RunnableまたはCallableを実装することを前提としています。私はジェネリックスを正しく持っているかどうか疑問ですが、あなたはそのアイデアを得ます。

+0

こんにちは、速いレスポンスグレー!私は属性の並行性のために設定されたプールを指定する考えが好きです。しかし、私が発明した属性は恣意的なものなので、私の想像では、フレームワークは、名前付き属性ごとに制約が何であるかを宣言的に定義する手段を提供します。しかし、カバーの下では、必要な構造を動的に拾い上げた後、あなたが概説したものとまったく同じことが起きるかもしれません。 – Nicholas

+0

@Nicholasええ、それはずっと難しいです。あなたは 'Foo'と' Bar'の両方に何らかの 'createExectuorForMe()'インタフェースメソッドを実装することができますし、クラスの同時マップを 'ExecutorService'に保つことができますが、それは複雑すぎるかもしれません。オブジェクトを送信すると、クラスを検索し、エグゼキュータがなければ、そのオブジェクトまたはその何かの 'createExectuorForMe()'メソッドを呼び出します。 – Gray

1

私は、これはあなたのケースのためにやり過ぎだろうかどうかわからないんだけど、JavaアプリケーションのためのタスクスケジューラはQuartzです。それは一見価値がある。

+0

オスカーに感謝します。私はQuartzについて考えましたが、この種の機能を覚えていません。しかし、それはしばらくしている。私は戻って最新のものを見ます。ありがとう。 – Nicholas

1

Quartzには拡張ポイントがあり、ジョブ処理に関するこの種の決定を可能にする場合があります。

特に

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context)

:を見てください。

関連する問題