2010-08-25 39 views
15

Tôi đang thiết lập lược đồ nhiệm vụ theo lịch vào mùa xuân, sử dụng không gian tên nhiệm vụ.Lập lịch nhiệm vụ chạy một lần, sử dụng không gian tên nhiệm vụ Spring

Tôi muốn lên lịch hầu hết các tác vụ để kích hoạt theo biểu thức cron và một số chỉ kích hoạt sau một lần, sau khi khởi động và sau đó không bao giờ trở lại (tức là thiết lập repeatCount thành 0 trên SimpleTriggerBean sẽ đạt được).

Có thể đạt được điều này trong vùng tên tác vụ hay không, hoặc tôi có cần hoàn nguyên về việc xác định đậu cho trình kích hoạt của mình không?

Trả lời

7

Nếu bạn có một cái nhìn tại Task namespace XSD, bạn sẽ thấy rằng chỉ có ba loại cấu hình khác nhau: fixed-delay, fixed-ratecron.

Và nếu bạn nhìn vào nguồn của ScheduledTasksBeanDefinitionParser, bạn sẽ thấy rằng không có nhiều hơn một trong các giá trị này được đánh giá. Đây là phần có liên quan:

String cronAttribute = taskElement.getAttribute("cron"); 
if (StringUtils.hasText(cronAttribute)) { 
    cronTaskMap.put(runnableBeanRef, cronAttribute); 
} 
else { 
    String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); 
    if (StringUtils.hasText(fixedDelayAttribute)) { 
     fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); 
    } 
    else { 
     String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); 
     if (!StringUtils.hasText(fixedRateAttribute)) { 
      parserContext.getReaderContext().error(
        "One of 'cron', 'fixed-delay', or 'fixed-rate' is required", 
        taskElement); 
      // Continue with the possible next task element 
      continue; 
     } 
     fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); 
    } 
} 

Vì vậy, không có cách nào để kết hợp các thuộc tính này. Tóm lại: không gian tên sẽ không đưa bạn đến đó.

13

dụ làm việc của tôi:

<bean id="whateverTriggerAtStartupTime" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="whateverJob"/> 
    <property name="repeatCount" value="0"/> 
    <property name="repeatInterval" value="10"/> 
</bean> 
3

này hoạt động và là cách dễ dàng hơn so với câu trả lời khác.

// Will fire the trigger 1 + repeatCount number of times, start delay is in milliseconds 
    simple name: 'mySimpleTrigger', startDelay: 5000, repeatCount: 0 
+1

Cú pháp này là gì? –

15

Nếu bạn không cần một sự chậm trễ ban đầu, bạn có thể làm cho nó chạy 'chỉ một lần' khi khởi động như sau:

<task:scheduled-tasks> 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run on startup 
        and not run again for 3E8 years --> 
    <task:scheduled ref="myThing" method="doStuff" 
       fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" /> 
</task:scheduled-tasks> 

(Tất nhiên, nếu bạn nghĩ rằng mã của bạn sẽ chạy lâu hơn 3E8 years, bạn có thể cần một cách tiếp cận khác ...)

Nếu bạn cần chậm trễ ban đầu, bạn có thể định cấu hình như sau (Tôi đang thử nghiệm với Spring 3.1.1) - điều này không yêu cầu bất kỳ phụ thuộc bổ sung nào và bạn không phải viết trình kích hoạt của riêng mình, nhưng bạn phải định cấu hình PeriodicTrigger do Spring cung cấp:

<bean id="onstart" class="org.springframework.scheduling.support.PeriodicTrigger" > 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run 5s after startup and 
       not run again for 3E8 years --> 
    <constructor-arg name="period" value="#{ T(java.lang.Long).MAX_VALUE }" /> 
    <property name="initialDelay" value="5000" /> 
</bean> 
<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" trigger="onstart" /> 
</task:scheduled-tasks> 

Mùa xuân 3.2 dường như hỗ trợ trực tiếp thuộc tính "ban đầu", nhưng tôi chưa thử nghiệm điều này; Tôi đoán công trình này hoạt động:

<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" 
         fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" 
         initial-delay="5000"/> 
</task:scheduled-tasks> 
Các vấn đề liên quan