Làm cách nào để tham số hóa @Schediated (fixedDelay) với ngôn ngữ biểu thức Spring 3.0?


125

Khi sử dụng khả năng Spring 3.0 để chú thích một tác vụ theo lịch trình, tôi muốn đặt fixedDelaytham số làm tệp từ tệp cấu hình của mình, thay vì nối cứng nó vào lớp tác vụ của mình, như hiện tại ...

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

Thật không may, dường như với các phương tiện của Ngôn ngữ biểu thức mùa xuân (SpEL) @Valuetrả về một đối tượng Chuỗi mà đến lượt nó không thể được tự động đóng hộp thành một giá trị dài theo yêu cầu của fixedDelaytham số.

Câu trả lời:


26

Tôi đoán các @Scheduledchú thích là ra khỏi câu hỏi. Vì vậy, có lẽ một giải pháp cho bạn sẽ là sử dụng task-scheduledcấu hình XML. Hãy xem xét ví dụ này (được 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 đến Long không hoạt động, đại loại như thế này sẽ:

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

Một lần nữa, tôi đã không 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.


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

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

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

422

Spring v3.2.2 đã thêm các tham số String vào 3 tham số dài ban đầu để xử lý việc này. fixedDelayString, fixedRateStringinitialDelayStringbây giờ cũng có sẵn.

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

3
@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

@ medveshonok117 Đã hiểu. Cảm ơn
Avi

51

Bạn có thể sử dụng @Scheduledchú thích, nhưng chỉ với crontham số:

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

Khoảng thời gian 5 giây của bạn có thể được thể hiện là "*/5 * * * * *". Tuy nhiên, theo tôi hiểu, bạn không thể cung cấp độ chính xác dưới 1 giây.


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

4

Trong Spring Boot 2, chúng ta có thể sử dụng Ngôn ngữ biểu thức mùa xuân (SpPL) cho @Scheduledcác thuộc tính chú thích:

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

Các application.propertiestập tin sẽ trông như thế này:

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI

Đó là nó. Dưới đây là một bài viết giải thích lập kế hoạch nhiệm vụ chi tiết.


1

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 thử điều đó , nhưng tôi đoán cách tiếp cận tương tự như sau có thể hữu ích cho bạn:

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

Ở đâu:

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

Cảm ơn, nghe có vẻ như một cách, nhưng thành thật mà nói, tôi đã hy vọng cho một giải pháp ("mùa xuân") thanh lịch hơn :-)
ngeek

2
Thật không may, điều này sẽ không hoạt động, vì thuộc tính chú thích @Schediated fixedDelay yêu cầu một hằng số (dài) được gán.
ngeek

À, đúng rồi. Vì vậy, tôi đoán bạn không thể làm điều đó với @Scheduledchú thích sau đó.
Grzegorz Oledzki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.