문제

Spring, Hibernate 및 WebSphere와 함께 Quartz -JDBCJobstore를 사용하는 구현이 관리되지 않는 스레드를 던지고있는 것으로 보입니다.

나는 약간의 독서를했고 IBM의 기술 기사를 찾았다. 그들은이 문제를 해결하기 위해 Commnonj를 사용한다는 제안을합니다.

나는 몇 가지 추가 연구를 수행했으며 지금까지 본 유일한 사례는 모두 데이터베이스에 있지 않은 Old Jobstore 계획을 다루고 있습니다.

그래서이 문제에 대한 솔루션의 예가있는 사람이 있는지 궁금합니다.

감사

도움이 되었습니까?

해결책

우리는 이것에 대한 작업 솔루션이 있습니다 (실제로 두 개).

1) 메인 스케줄러 스레드의 WorkManager 데몬 스레드를 사용하려면 Quartz 소스 코드를 변경하십시오. 작동하지만 쿼트를 변경해야합니다. 우리는 해킹 된 Quartz 버전을 유지하고 싶지 않았기 때문에 이것을 사용하지 않았습니다. (나에게 상기시켜 주는데, 나는 이것을 프로젝트에 제출할 것이지만 완전히 잊어 버렸다)

2) Quartz ThreadPool로 사용할 WorkManagerThreadPool을 만듭니다. Quartz ThreadPool의 인터페이스를 구현하여 Quartz 내에서 트리거되는 각 작업이 CommonJ Work 객체에 래핑되어 WorkManager에서 예약됩니다. 핵심은 Java EE 스레드 (예 : 서블릿 초기화)에서 스케줄러가 시작되기 전에 WorkManagerThreadPool의 WorkManager를 초기화해야한다는 것입니다. 그런 다음 WorkManagerThreadPool은 새 작업 객체를 작성하고 예약하여 예정된 모든 작업을 처리하는 데몬 스레드를 작성해야합니다. 이런 식으로 스케줄러 (자체 스레드)는 작업을 관리 스레드 (작업 데몬)로 전달합니다.

단순하지 않으며 불행히도 포함 할 수있는 코드가 없습니다.

다른 팁

이에 대한 솔루션을 찾은 이후로 스레드에 또 다른 대답을 추가합니다.

내 환경: 8.5.5, Quartz 1.8.5, 봄이 없었습니다.

문제 나는 (위에 언급 된) 관리되지 않은 스레드가 ctx.lookup(myJndiUrl), 대신 다른 응용 프로그램 서버 (Jboss, Weblogic)에서 올바르게 작동했습니다. 실제로 Webpshere는 다음과 같은 메시지로 "사건"을 발사했습니다.

javax.naming.configurationException : "Java :"JNDI 작업은 서버 런타임이 작업 스레드를 J2EE 응용 프로그램 구성 요소와 연결할 수 없기 때문에 이름을 완성 할 수 없습니다. 이 조건은 "Java :"을 사용하는 JNDI 클라이언트가 서버 애플리케이션 요청 스레드에서 실행되지 않을 때 발생할 수 있습니다. J2EE 애플리케이션이 "Java :"정적 코드 블록 내의 이름 또는 해당 J2EE 애플리케이션에서 생성 된 스레드에서 JNDI 작업을 실행하지 않도록하십시오. 이러한 코드는 반드시 서버 애플리케이션 요청 스레드에서 실행되지 않으므로 "Java :"이름의 JNDI 작업에 의해 지원되지 않습니다.

다음 단계는 문제를 해결했습니다.

1) Quartz 1.8.6으로 업그레이드 (코드 변경 없음), 그냥 Maven Pom

2) 새로운 WorkManagerThreadExecutor를 사용할 수 있도록 다음 DEP를 ClassPath (EAR /LIB 폴더)에 추가했습니다.

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-commonj</artifactId>
  <version>1.8.6</version>
</dependency>

참고 : in QTZ-113 또는 공식 석영 문서 1.X 2.X 이 수정을 활성화하는 방법에 대한 언급은 없습니다.

3) Quartz.Properties에 다음을 추가했습니다 ( "Wm/Default"는 8.5.5에 이미 구성된 DefaultWorkManager의 JNDI였습니다. 자원 -> 비동기 비안 -> WorkManagers 콘솔이었다) :

org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default

참고 : 올바른 클래스입니다 org.quartz.커스텀.WorkManagerThreadExecutor Quartz-Scheduler-1.8.6 (테스트), Or org.quartz.Commonj.WorkManagerThreadExecutor ~에서 2.1.1 ON (테스트되지 않았지만 실제 내에서 확인되었습니다 쿼츠-코모 즈의 항아리 Maven 's Repos)

4) 움직였다 석영 작업의 빈 생성자에서 JNDI 조회 (감사합니다 M_KLOVRE의 "J2EE 컨테이너 외부의 실"); 즉, 생성자는 반사에 의해 호출되었습니다 (newInstance() 메소드) 내 응용 프로그램의 동일한 J2EE 컨텍스트에서 java:global 네임 스페이스 execute(JobExecutionContext) 메소드는 여전히 가난한 상황에서 실행 중이며 내 응용 프로그램의 모든 EJB가 누락되었습니다.

도움이 되었기를 바랍니다.

추신. 참조로서 찾을 수 있습니다 여기 위에서 사용했던 Quartz.properties 파일의 예

이 기사를 확인하십시오 :http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html

기본적으로 SchedulerFactoryBean에서 taskexecutor 속성을 설정하여 org.springframework.scheduling.commonj.workmanager taskexecutor를 사용하여 컨테이너 관리 스레드를 사용합니다.

메모 : 위의 쿼츠 -708의 링크는 더 이상 유효하지 않습니다. 이 새로운 이슈 (새로운 지라) 보인다 문제를 해결하려면 : http://jira.terracotta.org/jira/browse/qtz-113 (fixversion = 1.8.6, 2.0.2)

Quartz에서 제기 된 아래 Jira 링크를 확인할 수 있습니다.

http://jira.opensymphony.com/browse/quartz-708

여기에는 요구 사항을 충족하기 위해 언급 된 Quartz.properties의 변경 사항과 함께 사용할 수있는 WebSpherethreadpool 구현이 필요합니다. 도움이 되었기를 바랍니다.

안부, 시바

WebSphere의 관리 스레드 풀을 사용해야합니다. Spring과 Commonj를 통해이 작업을 수행 할 수 있습니다. Commonj에는 관리 된 스레드를 생성 할 작업 집행자가 있습니다. JNDI 관리 스레드 리소스에 대한 참조를 사용할 수도 있습니다. 그런 다음 CommonJ Task Executor를 스프링 기반 석영 SchedulerFactoryBean에 주입 할 수 있습니다.

참조하십시오 http://open.bekk.no/boss/spring-scheduling-n-websphere/ 자세한 내용은 "Commonj와 함께 Quartz"로 스크롤하십시오.

WAS85 ANS Quartz 1.8.6에 대한 Paoloc의 제안은 WAS80 (및 Quartz 1.8.6)에서도 작동하며 봄이 필요하지 않습니다. (내 설정 스프링에서 2.5.5는 존재하지만 그 상황에서는 사용되지 않습니다.)

그렇게하면 새로 생성 된 모든 작업에 CDI를 적용하기 위해 주입 헬퍼를 사용하여 내 변형으로 SimpleJobfactory를 무시할 수있었습니다. 주입은 @EJB (주석이 달린 EJB 원격 비즈니스 인터페이스의 JNDI 조회와 함께) 및 @Inject (새로운 초기 콘텍스트를 사용하여 CDI BeanManager의 JNDI 조회와 함께,이 새로 페치 된 BM을 사용하여 CDI Bean 자체를 조회 함) 모두에 대해 작동합니다.

그 답변에 대해 Paoloc에게 감사합니다! (이 텍스트가 주요 주제에 대한 답이 아닌 "Paoloc에 대한 답변"으로 표시되기를 바랍니다. 이들을 구별 할 수있는 방법을 찾지 못했습니다.)

최근 에이 문제가 발생했습니다. 실제로 당신은 필요합니다 :

  1. WebSphere Work Manager에 작업을 위임하여 스레드 풀 구현. (Quartz는 관리되지 않는 스레드에서 작업을 실행하는 Simplethreadpool 만 제공합니다). Quartz 에게이 스레드 풀을 사용하도록 지시하십시오 org.quartz.threadPool.class 재산
  2. 석영에 사용하라고 말하십시오 WorkManagerThreadExecutor (또는 사용자 정의를 구현) org.quartz.threadExecutor.class 재산
  3. 번거로운 레거시 웹 컨테이너와 약간의 인내심 :)

여기에 있습니다 Github 데모 WebSphere (및 Tomcat)와 함께 석영을 사용하는 것.

누군가를 도와주기를 바랍니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top