2012-06-21 36 views
6

Tôi biết điều đó không công bằng với những người dùng đất nung, nhưng có ai đã cố gắng sử dụng Hazelcast để sử dụng các công việc theo lịch trong một môi trường nhóm không?Các công việc được lập lịch biểu Hazelcast (hỗ trợ của Quartz?)

Việc thực hiện đơn giản nhất tôi có thể hình ảnh là kiến ​​trúc sau:

  1. Một khóa Hazelcast toàn cầu để đảm bảo chỉ có một máy chủ có khởi động cấu hình thạch anh.
  2. Chạy các tác vụ thực tế dưới dạng DistributedTask. (điều này có thể được thực hiện sau này, cho thời điểm các tác vụ được lên lịch nặng sẽ cần phải quan tâm đến việc kích hoạt DistributedTask)
  3. Ngay sau khi máy chủ giữ khóa bị khóa, một máy chủ khác sẽ khóa.

Tôi tin rằng đây sẽ là một lợi thế lớn cho những người đã có Hazelcast, vì họ sẽ không yêu cầu toàn bộ môi trường phức tạp bằng cách mở công cụ đất nung mọi lúc.

Hiện tại, tôi đã mã hóa giải pháp đơn giản nhất là chỉ thực hiện một nút để phụ trách việc kích hoạt trình kích hoạt Quartz. Vì tôi chỉ sử dụng các trigger kích hoạt Cron, nó có thể là một giải pháp có thể chấp nhận được nếu tôi xử lý việc tạo DistributedTask cho các tác vụ kích hoạt nặng.

Dưới đây là phần mở rộng org.springframework.scheduling.quartz.SchedulerFactoryBean của tôi mà làm cho nó xảy ra:

@Override 
public void start() throws SchedulingException { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      final Lock lock = getLock(); 
      lock.lock(); 
      log.warn("This node is the master Quartz"); 
      SchedulerFactoryBean.super.start(); 
     } 
    }).start(); 
    log.info("Starting.."); 
} 

@Override 
public void destroy() throws SchedulerException { 
    super.destroy(); 
    getLock().unlock(); 
} 

Xin vui lòng, cho tôi biết nếu tôi đang thiếu một cái gì đó lớn và nếu điều này có thể được thực hiện.

Tôi đã thêm hai tệp vào github. Dưới đây là phần mở rộng RAMJobStore:

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/HazelcastRAMJobStore.java

Và đây là phần mở rộng mùa xuân SchedulerFactoryBean:

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/SchedulerFactoryBean.java

+1

FYI, có một yêu cầu tính năng để thực hiện phân phối theo lịch được phân phối trong Hazelcast: https://github.com/hazelcast/hazelcast/issues/115 – ccleve

Trả lời

8

Tôi đã suy nghĩ về các khái niệm tương tự một số thời gian trước đây. Bạn thực sự có thể tích hợp Hazelcast với quartz-scheduler dễ dàng bằng cách triển khai giao diện SPI JobStore. Hãy xem RAMJobStore để tham khảo về cách triển khai cửa hàng việc làm dựa trên cấu trúc dữ liệu trong bộ nhớ và JobStoreTX - cửa hàng được nhóm lại, được cơ sở dữ liệu hỗ trợ.

Giao diện này khá lớn, nhưng nó là nơi duy nhất cần thiết để chuyển từ RAM hoặc Terracotta sang Hazelcast. Thư viện thứ hai đã cung cấp lưu trữ và ổ khóa được phân phối nên nó phải khá đơn giản.

Thật tuyệt vời nếu bạn có thể chia sẻ triển khai của bạn (GitHub?), Đoán nó sẽ là một lựa chọn khả thi cho cụm Terracotta cho nhiều người.

+0

Xin chào Tomaz, tôi đã cập nhật bài đăng của mình với liên kết github để triển khai đơn giản nhất tôi có thể nghĩ. Làm ơn hãy kiểm tra nó. –

3

Bắt đầu với phiên bản 3.8 bạn chỉ có thể sử dụng phân phối Scheduled Executor Service:

  • scheduleOnMember()
  • scheduleOnKeyOwner()
  • scheduleOnAllMembers()
  • scheduleOnAllMembers()

Xem Scheduled Executor ServiceIScheduledExecutorService để biết thêm chi tiết.

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