Thêm câu trả lời khác cho chủ đề, kể từ khi tôi tìm thấy một giải pháp cho điều này, cuối cùng.
Môi trường của tôi: ĐƯỢC 8.5.5, Quartz 1.8.5, không có Mùa xuân.
Vấn đề tôi đã là chủ đề không được quản lý ở trên gây ra một NamingException từ ctx.lookup(myJndiUrl)
, thay vào đó hoạt động chính xác trong các máy chủ ứng dụng khác (JBoss, Weblogic); trên thực tế, Webpshere đã bắn một "sự cố" với thông báo sau:
javax.naming.ConfigurationException: Một hoạt động JNDI trên cơ sở "java:" Tên không thể hoàn thành vì thời gian chạy máy chủ không có khả năng kết hợp chuỗi hoạt động với bất kỳ thành phần ứng dụng J2EE nào. Tình trạng này có thể xảy ra khi máy khách JNDI sử dụng tên "java:" không được thực hiện trên luồng của một yêu cầu ứng dụng máy chủ. Hãy chắc chắn rằng một ứng dụng J2EE không thực thi các hoạt động JNDI trên các tên "java:" trong các khối mã tĩnh hoặc trong các luồng được tạo bởi ứng dụng J2EE đó. Mã như vậy không nhất thiết phải chạy trên luồng của một yêu cầu ứng dụng máy chủ và do đó không được hỗ trợ bởi các hoạt động JNDI trên các tên "java:".
Các bước sau đây giải quyết vấn đề:
1) nâng cấp lên 1.8.6 thạch anh (không có thay đổi code), chỉ cần maven pom
2) thêm dep sau để classpath (trong trường hợp của tôi, thư mục EAR/lib), để làm cho WorkManagerThreadExecutor mới có sẵn
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-commonj</artifactId>
<version>1.8.6</version>
</dependency>
Lưu ý: trong QTZ-113 hoặc Tài liệu Quartz chính thức 1.x2.x không có đề cập đến cách kích hoạt bản sửa lỗi này.
3) thêm phần sau đây để quartz.properties ("wm/default" được JNDI của DefaultWorkManager đã được cấu hình trong tôi WS 8.5.5, xem Tài nguyên -> AsynchronousBeans -> WorkManagers trong WS console) :
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
Lưu ý: lớp phù hợp là org.quartz. tùy chỉnh .WorkManagerThreadExecutor cho quartz-scheduler-1.8.6 (thử nghiệm) hoặc org.quartz. commonj .WorkManagerThreadExecutor từ 2.1.1 trên (không dự thi, nhưng xác nhận trong thực tế quartz-commonj's jars trên Repos maven của)
4) chuyển tra cứu JNDI trong constructor rỗng của công việc thạch anh (nhờ m_klovre's "Thread outside of the J2EE container"); có nghĩa là, hàm tạo đã được gọi bởi phương thức phản chiếu (newInstance()
) từ ngữ cảnh J2EE rất giống với ứng dụng của tôi và có quyền truy cập vào không gian tên java:global
, trong khi phương thức execute(JobExecutionContext)
vẫn đang chạy trong ngữ cảnh kém hơn. EJBs
Hy vọng điều này sẽ hữu ích.
Ps. để tham khảo, bạn có thể tìm thấy here một ví dụ về tệp quartz.properties mà tôi đã sử dụng ở trên
Bạn có ý gì khi "bỏ chuỗi không được quản lý"? –
Nhóm WAS của chúng tôi đã báo cáo rằng khi ứng dụng của chúng tôi đang chạy có các luồng được sinh ra, trong trạng thái không bị đe dọa - không gắn liền với bất kỳ thứ gì, GC không thể nhận được chúng. Dựa trên việc đọc từ trang web của IBM, điều này có thể xảy ra khi sử dụng Quartz. – boyd4715