2013-03-19 23 views
6

Tôi đang sinh ra một chuỗi sẽ tiếp tục kéo đoạn bản ghi từ cơ sở dữ liệu và đưa chúng vào hàng đợi. Chủ đề này sẽ được bắt đầu trên tải máy chủ. Tôi muốn chủ đề này hoạt động mọi lúc. Nếu không có hồ sơ trong cơ sở dữ liệu tôi muốn nó chờ đợi và kiểm tra lại sau một thời gian. Tôi đã nghĩ đến việc sử dụng bộ lập lịch tác vụ mùa xuân để lên lịch cho điều này nhưng không chắc liệu điều đó có đúng không vì tôi chỉ muốn nhiệm vụ của mình được bắt đầu một lần. Điều gì sẽ là cách tốt để thực hiện điều này trong mùa xuân?Lập lịch tác vụ trong Spring/Java

Ngoài ra, tôi cần phải có một kiểm tra ranh giới rằng nếu sợi của tôi đi xuống (vì bất kỳ lỗi hoặc điều kiện ngoại lệ) nó nên được tái instantiated sau một thời gian.

Tôi có thể làm tất cả điều này trong java bằng cách sử dụng các phương thức giao tiếp luồng nhưng chỉ cố gắng nếu có sẵn một thứ gì đó trong Spring hoặc Java cho các trường hợp như vậy.

Mọi đề xuất hoặc con trỏ sẽ trợ giúp.

Trả lời

0

Bạn có thể thử sử dụng Trình lên lịch thạch anh. http://quartz-scheduler.org/ Điều đó sẽ cho phép bạn chỉ định khoảng thời gian giữa các lần thực hiện tác vụ. Bạn có thể đặt một cờ (boolean) cho biết nếu lớp đã chạy trước để tránh trùng lặp mã mà bạn chỉ muốn chạy thời gian 'đầu tiên'.

0

Mùa xuân có hỗ trợ out-ot-the-box cho các tác vụ lập lịch biểu. Here are for the docs cho phiên bản mùa xuân 3.2.x mới nhất nhưng hãy kiểm tra tài liệu cho phiên bản bạn đang sử dụng. Hình như nó sử dụng Quartz dưới mui xe cho các nhiệm vụ lập kế hoạch.

+0

Tôi đã đi qua nó nhưng tôi không muốn nhiệm vụ của tôi được thực hiện sau một thời gian cụ thể nhưng chỉ một lần. Chỉ cần xử lý một kịch bản rằng nếu nhiệm vụ của tôi giảm xuống thì làm cách nào tôi có thể hồi sinh lại. – Ashu

6

Bạn có thể sử dụng chú thích @Scheduled để chạy công việc. Đầu tiên tạo một lớp học với một phương thức được chú thích với @Scheduled.

Lớp

public class GitHubJob { 

    @Scheduled(fixedDelay = 604800000) 
    public void perform() { 
     //do Something 
    } 
} 

Sau đó đăng ký lớp này trong các tập tin cấu hình của bạn.

mùa xuân-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:task="http://www.springframework.org/schema/task" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

<tx:annotation-driven/> 
<task:annotation-driven scheduler="myScheduler"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/> 

</beans> 

Để biết thêm về lịch trình chuyến thăm Spring Docs.

0

Tôi nghĩ rằng yêu cầu của bạn chỉ là senario thường xuyên mà khung công tác lập lịch trình thạch anh hoặc mùa xuân hỗ trợ rất tốt. nhưng bạn muốn tạo ra một cách tiếp cận đặc biệt để cấy ghép nó. đề nghị của tôi là giữ cho nó đơn giản và ngu xuẩn. mùa xuân scheudling sẽ tận dụng chuỗi công nhân của bạn bằng cách tổng hợp thay vì chạy nó tất cả các thời gian.

Theo số liệu thống kê, thật dễ dàng để kiểm tra nhật ký của lớp công nhân. nếu bạn muốn xem số liệu thống kê trong bảng điều khiển web, bạn cần ghi nhật ký cơ sở dữ liệu của nhân viên. Tôi chắc chắn bạn có thể làm cho nó dễ dàng theo cách thông thường.

4
@Scheduled(fixedDelay=3600000) 
private void refreshValues() { 
    [...] 
} 

Điều đó chạy một nhiệm vụ mỗi giờ một lần. Nó cần phải được void và chấp nhận không có đối số. Nếu bạn sử dụng cấu hình Java của Spring, bạn cũng cần phải thêm chú thích @EnableScheduling vào một trong các lớp @Configuration của mình.