1

다음 프로젝트가 있습니다.Java ScheduledExecutorService producer consumers

백그라운드에서 Spring (3.2) 기반 웹 응용 프로그램 (Tomcat 7)은 몇 가지 작업이 있습니다.

처리를위한 정보가있는 대기열이 있습니다. 이 대기열은 주기적으로 업데이트됩니다 (비어있는 경우에만).

또한이 큐와 프로세스에서 정기적으로 데이터를 대기열에 포함하는 여러 스레드가 있습니다.

예약하려면 ScheduledExecutorService를 사용하고 싶습니다.

  1. 방법이 큐를 유지하기 :

    나는 질문 \ 몇 가지 문제가 있나요? 내 생각에 그것이 글로벌해야한다고 생각합니다. 나는 그것을 어떤 "홀더"클래스에서 정적으로 만들어야 할까? 이 가난한 desing되지 않을까요?

  2. ScheduledExecutorService를 사용하여이 대기열과 모든 작업을 초기화하는 좋은 곳은 어디입니까? ServletContextLoadingListener는 좋은 장소입니까? Spring에서 이것을 초기화 할 수있는 방법이 있습니까?

  3. 정확하게 소비자 스레드 수를 제어해야하는 경우 여러 ScheduledExecutorService 인스턴스를 사용해야합니까?

  4. 이 경우 ArrayBlockingQueue가 좋을까요?

답변

1
  1. 당신은 일반 클래스를 사용하고 스프링이 범위 singleton 함께 관리 할 수 ​​있습니다.
  2. 스프링 구성으로 init-method으로 빈을 구성하거나 클래스에 InitializingBean 인터페이스를 구현할 수 있습니다.
  3. ScheduledExecutorService의 스레드 번호는 생성자 인수를 통해 구성 할 수 있습니다. 여러 유형의 작업이 있고 개별 스레드 풀에서 실행하려는 경우 복수 ScheduledExecutorService 인스턴스를 사용할 수 있습니다. 그러나 모든 작업이 동일한 유형 인 경우 여러 개의 ScheduledExecutorService 인스턴스가 필요하지 않습니다.
  4. JDK 내에서 제공되는 ScheduledThreadPoolExecutor에는 java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue 클래스의 내부 작업 대기열이 있으며 구성 할 수 없습니다. ArrayBlockingQueue를 어디에 두어야하는지 잘 모르겠습니다.
+0

고마워요, 약 4 번째 항목, 나는 작업자 스레드에 의한 처리를 위해 일정량의 데이터로 업데이트 가능한 큐를 가질 필요가 있습니다. DelayedWorkQueue는 ScheduledExecutorService 안에 있으며, 거기에있는 작업자 스레드를위한 것입니다. –