2010-04-08 32 views
93

Khi sử dụng khả năng mùa xuân 3,0 để chú thích một nhiệm vụ theo lịch trình, tôi muốn thiết lập các fixedDelay như tham số từ tập tin cấu hình của tôi, thay vì cứng dây nó vào lớp nhiệm vụ của tôi, như hiện tại ...Làm cách nào để tham số hóa @Scheduled (fixedDelay) bằng ngôn ngữ biểu thức Spring 3.0?

@Scheduled(fixedDelay = 5000) 
public void readLog() { 
     ... 
} 

Thật không may có vẻ như với các phương tiện của ngôn ngữ biểu thức mùa xuân (Spel) @Value trả về một đối tượng String mà lần lượt là không thể được tự động đóng hộp thành một giá trị dài theo yêu cầu của tham số fixedDelay.

Trả lời

26

Tôi đoán @Scheduled chú thích là ra các câu hỏi. Vì vậy, có thể một giải pháp cho bạn sẽ là sử dụng cấu hình XML task-scheduled. Chúng ta hãy xem xét ví dụ này (sao chép từ Spring doc):

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
       fixed-rate="#{YourConfigurationBean.stringValue}"/> 
</task:scheduled-tasks> 

... hoặc nếu các diễn viên từ String để lâu không làm việc, cái gì đó như sẽ này:

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
      fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/> 
</task:scheduled-tasks> 

lần nữa, tôi thiên đường' Tôi đã thử bất kỳ thiết lập nào trong số này, nhưng tôi hy vọng nó có thể giúp bạn một chút.

+0

Cảm ơn, cấu hình XML đã thực hiện thủ thuật. Tôi hơi ngạc nhiên rằng chú thích dường như bị ràng buộc với các giá trị chuỗi, anyways, tôi đi với cách học cũ ;-) – ngeek

+1

Có bất kỳ Java tương đương cho cấu hình trên? – amique

+0

@Grzegorz Oledzki giá trị của "someObject" trong thẻ . Nếu một bộ điều khiển có nhiều phương thức cần độ trễ cố định và độ trễ ban đầu thì xử lý sẽ như thế nào? – Moitt

0

Tôi đoán bạn có thể tự chuyển đổi giá trị bằng cách xác định một bean. Tôi đã không cố gắng mà, nhưng tôi đoán là cách tiếp cận tương tự như sau có thể có ích cho bạn:

<bean id="FixedDelayLongValue" class="java.lang.Long" 
     factory-method="valueOf"> 
    <constructor-arg value="#{YourConfigurationBean.stringValue}"/> 
</bean> 

nơi:

<bean id="YourConfigurationBean" class="..."> 
     <property name="stringValue" value="5000"/> 
</bean> 
+0

Cảm ơn, mà âm thanh như một cách, nhưng phải trung thực tôi đã hy vọng cho một thanh lịch hơn ("springish") giải pháp :-) – ngeek

+1

Đáng tiếc là điều này sẽ không làm việc, kể từ khi chú thích @Scheduled thuộc tính fixedDelay đòi hỏi một (dài) liên tục được chỉ định. – ngeek

+0

Ah, đúng vậy. Vì vậy, tôi đoán bạn không thể làm điều đó với chú thích '@ Scheduled' sau đó. –

43

Bạn có thể sử dụng @Scheduled chú thích, nhưng cùng với sự chỉ cron tham số:

@Scheduled(cron = "${yourConfiguration.cronExpression}") 

khoảng 5 giây của bạn có thể được diễn tả như "*/5 * * * * *". Tuy nhiên, tôi hiểu rằng bạn không thể cung cấp độ chính xác dưới 1 giây.

+7

Biểu thức cron mà bạn đã hiển thị tương đương với fixedRate, khác với fixedDelay – codebox

305

Spring v3.2.2 đã thêm tham số chuỗi vào 3 tham số dài ban đầu để xử lý. , fixedRateStringinitialDelayString hiện đã có sẵn.

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}") 
public void readLog() { 
     ... 
} 
+0

Tại sao điều này không được đánh dấu là câu trả lời đúng? – Avi

+0

@Avi Câu trả lời này xuất hiện ba năm sau câu hỏi của OP. Tại thời điểm câu hỏi (và câu trả lời được chấp nhận) tính năng này không tồn tại. – medveshonok117

+0

@ medveshonok117 OK. Cảm ơn – Avi

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