2010-07-21 25 views
10

Trong ứng dụng Mùa xuân của tôi, tôi đang sử dụng SchedulerFactoryBean để tích hợp với Quartz. Chúng ta sẽ có các trường hợp Tomcat nhóm, và do đó tôi muốn có một môi trường Quartz nhóm, để các công việc tương tự không chạy cùng một lúc trên các máy chủ web khác nhau.Quartz & Spring - Clustered nhưng NOT Persistent?

Để làm điều này, tôi app-context.xml là như sau:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref bean="cronTrigger"/> 
      <ref bean="simpleTrigger" /> 
     </list> 
    </property> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="overwriteExistingJobs" value="true"/> 
    <!-- found in applicationContext-data.xml --> 
    <property name="applicationContextSchedulerContextKey" value="applicationContext"/> 
    <property name="quartzProperties"> 
     <props> 
      <prop key="org.quartz.scheduler.instanceName">SomeBatchScheduler</prop> 
      <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
      <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> 
      <!--<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>--> 
      <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
      <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> 
      <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> 
      <prop key="org.quartz.jobStore.isClustered">true</prop> 
      <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
      <prop key="org.quartz.threadPool.threadCount">25</prop> 
      <prop key="org.quartz.threadPool.threadPriority">5</prop> 
     </props> 
    </property> 
</bean> 

Tất cả mọi thứ hoạt động tốt, ngoại trừ việc khi tôi cố gắng để loại bỏ hoặc thay đổi kích hoạt, sau đó khởi động lại ứng dụng của tôi, những nguyên nhân cũ vẫn còn tồn tại DB, và vẫn chạy. Tôi không muốn điều này, tôi chỉ muốn họ bị xóa khi ứng dụng dừng (hoặc được khởi động lại). Tôi đặt giá trị của thuộc tính overwriteExistingJobs thành true, vì tôi nghĩ đó là những gì nó đã làm.

Bất kỳ ý tưởng nào? Tất cả tôi muốn sử dụng DB cho phân cụm, không phải bất kỳ loại kiên trì vượt ra ngoài đó.

+0

Tôi gặp vấn đề tương tự và tôi không thể tìm thấy giải pháp nào. Cuối cùng, tôi chuyển công việc ra khỏi ứng dụng web và lên lịch để chạy qua cron. Tò mò để xem những gì người khác phải nói. – chedine

+0

Sử dụng đất nung? –

Trả lời

2

Tôi đã nghiên cứu về chủ đề và đó là một lỗi nổi tiếng trong Quartz, tôi đã tìm thấy một vài bài đăng trên diễn đàn của họ. Để giải quyết vấn đề này, tôi đã tạo một bean xóa tất cả các bản ghi trong bảng Quartz. Bạn có thể gọi bean này trước khi hạt Quartz của bạn được nạp (thêm một "phụ thuộc vào" trên bean Scheduler), khi bối cảnh mùa xuân của bạn đang bị phá hủy (đảm bảo rằng hồ bơi kết nối DB vẫn mở), hoặc bằng tay thông qua một số hình thức Giao diện người dùng. Ngoài ra còn có một lỗi trên các nhóm công việc, đừng ngạc nhiên. Sửa chữa đầu tiên của tôi là tạo ra một bình thạch anh khách hàng với bản sửa lỗi nhưng nó đã khá khó khăn để nâng cấp bất cứ khi nào họ phát hành một phiên bản mới (tôi đã sử dụng 1,4 hoặc 1,5 vào thời điểm đó - không thực sự nhớ).

+3

Đây không phải là lỗi. Đó là một quan niệm sai lầm về những gì mà plugin đọc tệp XML. Tất cả nó làm nó đọc tập tin và thêm các công việc/kích hoạt được quy định trong tập tin. Đó là tất cả nó bất cứ lúc nào nó chạy. Nó không yêu cầu làm bất cứ điều gì khác hơn thế (ví dụ:đầu tiên xóa tất cả dữ liệu trong trình lên lịch). – jhouse

0

Đây là một bài đăng cũ, nhưng vì lợi ích của những người cần một giải pháp, ở đây nó được. Chỉ định "true" cho thuộc tính "overwriteExistingJobs". Bạn sẽ phải khởi động lại máy chủ của bạn và mỗi lần bạn khởi động lại, các công việc cũ sẽ bị xóa. Tôi không biết liệu điều này có thể xảy ra trong các phiên bản cũ hơn của lịch trình thạch anh hay không, tôi đang sử dụng 2.1.7

1

Tôi gặp phải vấn đề tương tự với thạch anh nhóm 2. Tôi không chạy lạc đà, nhưng đó cũng là vấn đề tương tự.

1) Không có cách nào tôi đã nhìn thấy để xóa các công việc trong một môi trường nhóm bằng cách đơn giản loại bỏ các công việc/kích hoạt từ bối cảnh mùa xuân xml.

2) Vì cơ sở dữ liệu lưu trữ thông tin công việc/kích hoạt, triển khai cán trên các máy chủ trở nên có vấn đề nếu bạn đang thêm hoặc sửa đổi công việc. Máy chủ có thể bắt đầu chạy công việc trước khi triển khai công việc có thể được triển khai tới máy chủ ứng dụng, trừ khi bạn gỡ tất cả các máy chủ trước khi triển khai thay đổi của mình.

Để giải quyết vấn đề này, tôi đã đưa ra một giải pháp khá đơn giản. Là một phần của quá trình xây dựng của chúng tôi, chúng tôi đã thu thập và lưu trữ một phiên bản xây dựng duy nhất + số w/trong tạo phẩm xây dựng (sử dụng thay thế biến gradle). Để giải quyết vấn đề này, chúng tôi chỉ đơn giản là làm cho tên của lịch trình bao gồm số phiên bản + số phiên bản duy nhất. Điều này dẫn đến bộ công việc mới nhất + trình kích hoạt được thêm vào db dưới tên của người lập lịch mới và sau khi triển khai triển khai xong, tất cả các máy chủ đang chạy với tên mới. Điều này giải quyết vấn đề xóa và cũng giải quyết vấn đề triển khai lăn. Nếu tất cả các tên bộ lập lịch bổ sung trở thành một vấn đề trong db, một cái gì đó có thể được viết để làm sạch chúng nếu cần thiết.

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