2017-10-04 4 views
1

ように私は自分のアプリケーションのコンテキストごとなど@BeanとしてThreadPoolTask​​Executorを宣言している:私はThreadPoolTask​​Executorのインスタンスを有線得る必要がある2つの異なるサービスを持つシングルトンのThreadPoolTask​​Executorを異なるサービスで共有する必要がありますか?

@Configuration 
@ConfigurationProperties(prefix = "application") 
@EnableCaching 
public class ApplicationConfig { 
    private static final int POOL_SIZE = 2; 

    @Bean 
    public ThreadPoolTaskExecutor taskExecutor() { 
     ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); 
     pool.setCorePoolSize(POOL_SIZE); 

     return pool; 
    } 
} 

。各サービスは、サービス固有のジョブを実行するRunnableを送信します。

@Service 
public class TerminatedContractsService { 
    @Autowired 
    private ThreadPoolTaskExecutor taskExec; 

    public void notifyTerminatedContracts(Date d) { 
     // do some contract specific work 
     taskExec.submit(() -> System.out.println("emailing terminated contracts...")); 
    } 
} 


@Service 
public class SalaryCalculationService { 
    @Autowired 
    private ThreadPoolTaskExecutor taskExec; 

    public void calculateSalary(Date d) { 
     // do some salary related work 
     taskExec.submit(() -> System.out.println("calculating salaries...")); 
    } 
} 

は、右両方のサービスに同じThreadPoolTask​​Executorインスタンスを(そのシングルトン以降)を共有するのが安全であるべきです:

は例えば、これらは2つのサービスですか?

代わりにプロトタイプを作成する必要がありますか?

答えて

1

はい、複数のサービスで同じエグゼキュータを使用しても問題ありません。エグゼクティブは、それを放棄して新しいものを作成することをお勧めします。

注意が必要なことがあります。同じエグゼキュータに提出する期間が異なるタスクがある場合、長時間実行されているタスクの後ろにキューイングされている場合、短時間のタスクはブロックされます。エグゼキュータに提出されたタスクの持続時間を確認したい場合があります。

また、予測可能かつ確実に実行する必要のあるカテゴリのタスクがある場合は、専用の実行プログラムを予約することもできます。そうしないと、それらのタスクが他のタスクとキューを共有していて、それらのタスクが完了できない、または遅くなるという問題がある場合、確実に実行される必要があるタスクは、そのキューに滞留することがあります。

ただし、プロトタイプの範囲は必要ありません。

+0

パフォーマンスの結果を指摘してくれてありがとう。 –

関連する問題