2008-10-06 37 views
5

Dường như việc triển khai sử dụng Quartz - JDBCJobStore của chúng tôi cùng với Spring, Hibernate và Websphere đang ném các luồng không được quản lý.Chủ đề không được quản lý Spring Quartz Websphere Hibernate

Tôi đã thực hiện một số đọc và tìm thấy một bài viết công nghệ từ IBM nói rằng việc sử dụng Quartz với Spring sẽ gây ra điều đó. Họ đưa ra gợi ý sử dụng CommnonJ để giải quyết vấn đề này.

Tôi đã thực hiện thêm một số nghiên cứu và các ví dụ duy nhất tôi đã thấy cho đến nay tất cả đều xử lý kế hoạch cũ mà JobStore không có trong cơ sở dữ liệu.

Vì vậy, tôi đã tự hỏi nếu có ai có ví dụ về giải pháp cho vấn đề này.

Cảm ơn

+0

Bạn có ý gì khi "bỏ chuỗi không được quản lý"? –

+0

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

Trả lời

10

Chúng tôi có giải pháp làm việc cho điều này (hai thực tế).

1) Thay đổi mã nguồn thạch anh để sử dụng chuỗi chủ đề WorkManager cho chuỗi lịch trình chính. Nó hoạt động, nhưng yêu cầu thay đổi quarts. Chúng tôi đã không sử dụng điều này mặc dù kể từ khi chúng tôi không muốn duy trì một phiên bản của thạch anh bị tấn công. (Điều đó nhắc nhở tôi, tôi sẽ gửi nó cho dự án nhưng hoàn toàn quên)

2) Tạo một WorkManagerThreadPool được sử dụng làm luồng chỉ thạch anh. Thực hiện giao diện cho ThreadPool thạch anh, để mỗi tác vụ được kích hoạt bên trong thạch anh được bọc trong một đối tượng công việc commonj mà sau đó sẽ được lên lịch trong WorkManager. Điều quan trọng là WorkManager trong WorkManagerThreadPool phải được khởi tạo trước khi bộ lập lịch được bắt đầu, từ một luồng Java EE (chẳng hạn như khởi tạo servlet). WorkManagerThreadPool sau đó phải tạo một chuỗi daemon sẽ xử lý tất cả các tác vụ được lập lịch bằng cách tạo và lên lịch các đối tượng Công việc mới. Bằng cách này, trình lên lịch (theo chủ đề riêng của nó) đang chuyển các tác vụ đến một luồng được quản lý (trình nền công việc).

Không đơn giản, và rất tiếc là tôi không có sẵn mã để bao gồm.

+1

Tôi nhận thấy bài đăng này là cũ nhưng bạn có ví dụ về cách bạn có thể thay đổi Quartz để sử dụng chuỗi chủ đề WorkManager hoặc tạo WorkManagerThreadPool có thể được sử dụng làm thread thread Quartz không? Tôi muốn sử dụng Quartz với Websphere nhưng nhận ra những hạn chế của các luồng không được quản lý, và muốn làm điều đó "đúng cách". Cảm ơn. – user172092

3

Kiểm tra bài viết này: http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html

về cơ bản, thiết lập thuộc tính taskExecutor trên SchedulerFactoryBean sử dụng một org.springframework.scheduling.commonj.WorkManager TaskExecutor mà sẽ sử dụng đề chứa được quản lý.

+0

Giải pháp này đã cho chúng tôi 2 phút để thực hiện (bạn có thể tái sử dụng mặc định wm jndi từ WAS) và hoạt động hoàn hảo. –

1

Bạn có thể kiểm tra liên kết JIRA bên dưới được nêu lên trên thạch anh về việc này.

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

này có thực hiện WebSphereThreadPool yêu cầu mà có thể được sử dụng với những thay đổi trong quartz.properties như đã đề cập để đáp ứng yêu cầu của bạn. Hi vọng điêu nay co ich.

Kính trọng, Siva

1

Bạn sẽ phải sử dụng hồ bơi chủ đề quản lý WebSphere của. Bạn có thể làm điều này thông qua mùa xuân và commonj. CommonJ có thể có một người thực hiện nhiệm vụ sẽ tạo ra các luồng được quản lý. Bạn thậm chí có thể sử dụng một tham chiếu đến tài nguyên luồng được quản lý jndi. Sau đó bạn có thể tiêm tác vụ thi hành nhiệm vụ commonj vào Spring SchedulerFactoryBean dựa trên Spring.

Vui lòng xem http://open.bekk.no/boss/spring-scheduling-in-websphere/ và cuộn đến phần "Quartz with CommonJ" để biết thêm chi tiết.

2

Chỉ cần lưu ý: liên kết QUARTZ-708 ở trên không còn hợp lệ nữa. này vấn đề mới (trong một Jira mới) dường như để được giải quyết các vấn đề: http://jira.terracotta.org/jira/browse/QTZ-113 (fixVersion = 1.8.6, 2.0.2)

5

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

+0

Tôi biết đã nhiều năm, nhưng liệu bạn có thể tìm và chia sẻ toàn bộ nội dung của tệp quartz.properties không? – rodripf

+1

Chắc chắn, đây là - hy vọng điều đó sẽ giúp ích. Ngoài ra, xin vui lòng upvote câu trả lời của tôi nếu bạn tìm thấy nó hữu ích. – PaoloC

+0

Cảm ơn bạn! Nhưng tôi tiếp tục đấu tranh với vấn đề. Sự khác biệt mà tôi có được trong môi trường của tôi là Quartz 2.2.Không chắc tôi nên thử những gì khác, nếu tôi nhận được bất kỳ khoản tiền tạm ứng nào sẽ cho bạn biết. – rodripf

1

Đề xuất từ ​​PaoloC cho WAS85 ans Quartz 1.8.6 cũng hoạt động trên WAS80 (và Quartz 1.8.6) và không cần Mùa xuân. (Trong thiết lập của tôi, Spring 2.5.5 có mặt, nhưng không được sử dụng trong bối cảnh đó.)

Bằng cách đó, tôi có thể ghi đè SimpleJobFactory bằng biến thể của riêng mình, sử dụng InjectionHelper để áp dụng CDI cho mỗi công việc mới được tạo ra. Tiêm cho cả hai @EJB (với JNDI tra cứu giao diện kinh doanh từ xa có chú thích EJB) và @Inject (với tra cứu JNDI của BeanManager CDI bằng cách sử dụng InitialContext mới đầu tiên, và sau đó sử dụng BM mới được tìm nạp này để tra cứu chính đĩa CDI).

Cảm ơn PaoloC về câu trả lời đó! (Tôi hy vọng văn bản này sẽ xuất hiện dưới dạng "câu trả lời cho PaoloC" chứ không phải là câu trả lời cho chủ đề chính. Không tìm thấy cách nào để phân biệt giữa các chủ đề này.)

0

Gần đây tôi đã gặp sự cố này. Thực tế bạn cần:

  1. Thực hiện nhóm chủ đề bằng cách ủy quyền công việc cho Trình quản lý công việc trên Websphere. (Quartz chỉ cung cấp SimpleThreadPool chạy các công việc trên các luồng không được quản lý). Nói với thạch anh sử dụng hồ bơi thread này bởi org.quartz.threadPool.class tài sản
  2. biết chính xác thạch anh sử dụng WorkManagerThreadExecutor (hoặc thực hiện tùy chỉnh một) bởi org.quartz.threadExecutor.class tài sản
  3. Một chút kiên nhẫn với vùng chứa web di sản cồng kềnh :)

Đây là github demo của sử dụng Quartz với Websphere (và cả Tomcat).

Hy vọng nó sẽ giúp ai đó ..

Các vấn đề liên quan