2012-05-05 22 views
12

Tôi rất mới với Quartz và tôi có một số nghi ngờ về vòng đời công việc.khi một công việc thạch anh cháy, đó có phải là một ví dụ về công việc mới không?

Giả sử tôi có một công việc được định cấu hình để thực hiện một số nội dung.

Công việc cháy và kết thúc công việc của nó. Khi nó cháy một lần nữa là nó cùng một thể hiện (có thể được thiết lập để ngủ và đánh thức bởi bộ lập lịch) hoặc nó là một ví dụ công việc mới (một khi công việc kết thúc nó bị giết và khi điều kiện kích hoạt được đáp ứng lại một thể hiện công việc mới được tạo ra) ?

Tôi đặt câu hỏi như vậy vì khi tôi gỡ lỗi ứng dụng của mình (mùa xuân 3 mvc với hỗ trợ thạch anh), tôi thấy các phiên bản mới của công việc và chủ đề mới với SimpleThreadPool $ WorkerThreadRun() được mở cho mỗi lần công việc được kích hoạt để SimpleThreadPool $ WorkerThreadRun() chủ đề được chất đống và không bao giờ chấm dứt.

Tôi chỉ muốn biết nếu hành vi này là hoàn toàn hoặc tôi bị ràng buộc để lấp đầy bộ nhớ ;-)

Bất cứ ai có thể cho tôi một số lời giải thích? Cảm ơn trước.

Trả lời

15

Quartz tạo phiên bản mới của lớp công việc của bạn mỗi khi nó muốn kích hoạt công việc đó. Giả sử bạn có hàng trăm nghìn việc làm được lên lịch để kích hoạt rất thường xuyên - nó sẽ lãng phí bộ nhớ để giữ tất cả những công việc đó trong bộ nhớ.

Tuy nhiên nếu bạn đang sử dụng Spring support for Quartz, đặc biệt là MethodInvokingJobDetailFactoryBean, Spring sẽ xử lý vòng đời của công việc của bạn (về cơ bản gọi phương thức được chỉ định của một trong các hạt của bạn). Nhưng có vẻ như không phải là trường hợp trong ứng dụng của bạn.

Tất nhiên sau khi công việc được thực hiện và không có tài liệu tham khảo khác trỏ đến nó (đó là trường hợp bình thường) thu gom rác cuối cùng sẽ phát hành bộ nhớ bị chiếm đóng bởi công việc).

Cuối cùng về chủ đề - Quartz tạo một nhóm công việc cố định (xem org.quartz.threadPool.threadCount tùy chọn cấu hình). Mỗi lần bạn chạy công việc, Quartz có thể quyết định sử dụng một chuỗi khác - nhưng nó sẽ không tạo chuỗi mới cho mỗi trình kích hoạt.

+0

Cảm ơn bạn rất nhiều. Lời giải thích của bạn đơn giản và rõ ràng và đó là những gì tôi thực sự cần! Trên thực tế trong ứng dụng của tôi, tôi đang sử dụng 'JobDetailBean',' CronTriggerBean' và 'SchedulerFactoryBean', nhưng đọc câu trả lời của bạn, tôi cho rằng vòng đời cũng được xử lý bởi mùa xuân, không có nguy cơ lỗi bộ nhớ. Thnks một lần nữa. – MaVVamaldo

+0

Giới thiệu về "MethodInvokingJobDetailFactoryBean". Spring sẽ xử lý vòng đời của ** bean ** của bạn và phương thức của bean này sẽ được gọi từ Quartz-job (thực hiện "org.quartz.Job" interface, con của lớp trừu tượng "QuartzJobBean" trong Spring). Và ví dụ Quartz-job này sẽ được tạo ra như được mô tả trong câu trả lời của tôi. –

+0

Xin chào @tomasz, bạn có thể vui lòng cho tôi biết cách gọi phương thức doIt() (ví dụ: từ tài liệu Spring) bằng cách nhấp vào một nút từ JSP. Tôi đang sử dụng công việc Quartz nhưng phương thức execute() của lớp Job của tôi không được gọi.Tôi đang sử dụng MethodInvokingJobDetailFactoryBean với một số trigger và jobDetails với SchedulerFactoryBean nhưng chúng được gọi vào một khoảng thời gian sửa lỗi không theo yêu cầu. Cảm ơn – Jaikrat

3

Tôi sẽ viết về phiên bản 2.1.5 (phiên bản mới nhất), nhưng cũng có thể đúng với các phiên bản khác.

Job -instance được tạo ra bởi một số ví dụ của "JobFactory" với "newJob" -function (SimpleJobFactory, ví dụ). Gọi tới "newJob" được thực hiện trong "initialize" -method của JobRunShell -class. JobRunShell -object được giữ trong biến cục bộ "QuartzSchedulerThread .run" và không được lưu trữ trong bất kỳ danh sách hoặc trường nào khác.

Vì vậy, mới Job -instance được tạo cho mọi thời gian kích hoạt và sau khi thực thi, bộ lọc thu dọn sẽ được dọn dẹp bình thường.