2010-01-17 41 views
13

Tôi có một ứng dụng đơn giản sử dụng Spring 3 để tiêm phụ thuộc. Tôi có một JFrame cho người sử dụng để xem xét và một số nhiệm vụ nền cho đồng bộ hóa với một máy chủ back-end và bảo trì cơ sở dữ liệu địa phương.Tác vụ trì hoãn: lập lịch thực hiện lần đầu tiên trong Spring 3

Đây là phần có liên quan của bối cảnh ứng dụng của tôi:

<task:scheduler id="scheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="synchronizer" method="incrementalSync" fixed-delay="600000"/> 
    ... more tasks ... 
</task:scheduled-tasks> 

<bean id="mainFrame" class="nl.gdries.myapp.client.ui.MainFrame"> 
    ... properties and such ... 
</bean> 

Khi tôi bắt đầu này ApplicationContext scheduler ngay lập tức bắt đầu thực hiện các nhiệm vụ nền ngay cả khi giao diện người dùng của tôi đang tải. Bởi vì nhiệm vụ đầu tiên là một nhiệm vụ khá nặng lúc bắt đầu, tôi muốn nó đợi giao diện người dùng tải đầy đủ và hiển thị trước khi nó bắt đầu thực hiện.

Có ai biết cách nói với Spring để trì hoãn việc thực hiện các tác vụ đã lên lịch cho đến thời điểm tôi chọn không?

Trả lời

8

Điều này dường như đã bị bỏ qua khỏi định nghĩa bean <task:scheduled>, điều mà tôi vừa mới nhận thấy vào tuần trước.

Hãy nhớ rằng, mặc dù, các định nghĩa <task:...> chỉ là các phím tắt, bạn luôn có thể sử dụng cách tiếp cận rõ ràng, bằng cách xác định một số ScheduledExecutorFactoryBean, với các hạt được xếp chồng ScheduledExecutorTask. Điều này giúp bạn kiểm soát tốt hơn, bao gồm initialDelay.

5

Tôi đã có cùng một vấn đề và trở về TimerTask vì nó là trong 25.7.1 điểm trong http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
    <!-- wait 25 seconds before starting repeated execution --> 
    <property name="delay" value="25000" /> 
    <!-- run every 50 seconds --> 
    <property name="period" value="50000" /> 
    <property name="timerTask" ref="task" /> 
</bean> 

<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> 
    <property name="scheduledTimerTasks"> 
     <list> 
      <ref bean="scheduledTask" /> 
     </list> 
    </property> 
</bean> 

Tôi hy vọng trong mùa xuân 3.1 sẽ là thuộc tính initialDelay trong <task:scheduled>, vì trong mùa xuân 3,0 TimerFactoryBean không được chấp nhận. Bạn có thể bỏ phiếu cho vấn đề này: jira.springframework.org/browse/SPR-7022

+0

là nó có thể có paramete cron động r cho mọi công việc ?? sử dụng TimeFactoryBean ?? –

3

này đã được giới thiệu bằng cách này trong mùa xuân 3,2 vì vậy nếu bạn sử dụng các lược đồ 3.2 nó có sẵn một lần nữa - ví dụ:

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

....

ở trên cho phép bạn làm điều này:

<task:scheduler id="scheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="synchronizer" method="incrementalSync" fixed-delay="600000" initial-delay="initial delay needed for the app to start"/> 
    ... more tasks ... 
</task:scheduled-tasks> 
Các vấn đề liên quan