วิธีกำหนดพารามิเตอร์ @Scheduled (fixedDelay) ด้วยภาษานิพจน์ Spring 3.0


126

เมื่อใช้ความสามารถ Spring 3.0 เพื่อใส่คำอธิบายประกอบงานที่กำหนดเวลาไว้ฉันต้องการตั้งค่าfixedDelayพารามิเตอร์ as จากไฟล์คอนฟิกูเรชันของฉันแทนที่จะเดินสายไฟลงในคลาสงานของฉันอย่างหนักเช่นในปัจจุบัน ...

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

น่าเสียดายที่ดูเหมือนว่าด้วยวิธีการของ Spring Expression Language (SpEL) @Valueจะส่งคืนอ็อบเจกต์ String ซึ่งจะไม่สามารถใส่กล่องอัตโนมัติเป็นค่ายาวได้ตามที่fixedDelayพารามิเตอร์ต้องการ

คำตอบ:


26

ฉันเดาว่า@Scheduledคำอธิบายประกอบไม่ตรงประเด็น ดังนั้นวิธีแก้ปัญหาสำหรับคุณคือใช้task-scheduledการกำหนดค่า XML ลองพิจารณาตัวอย่างนี้ (คัดลอกจากSpring doc ):

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

... หรือถ้าการร่ายจาก String to Long ใช้ไม่ได้สิ่งนี้จะ:

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

อีกครั้งฉันยังไม่ได้ลองตั้งค่าใด ๆ เลย แต่หวังว่ามันอาจช่วยคุณได้บ้าง


ขอบคุณการกำหนดค่า XML เป็นเคล็ดลับ ฉันแปลกใจเล็กน้อยที่คำอธิบายประกอบดูเหมือนจะผูกมัดกับค่าสตริงอย่างไรก็ตามฉันใช้วิธีแบบโรงเรียนเก่า ;-)
ngeek

1
มี Java เทียบเท่าสำหรับ config ด้านบนหรือไม่?
amique

@Grzegorz Oledzki ค่าของ "someObject" ภายใต้แท็ก <งาน: กำหนดเวลา> จะเป็นอย่างไร หากคอนโทรลเลอร์มีมากกว่าหนึ่งวิธีที่ต้องการความล่าช้าคงที่และการหน่วงเวลาเริ่มต้นจะจัดการอย่างไร?
Mohit Singh

423

Spring v3.2.2 ได้เพิ่มพารามิเตอร์ String ลงในพารามิเตอร์แบบยาว 3 ตัวเพื่อจัดการกับสิ่งนี้ fixedDelayString, fixedRateStringและinitialDelayStringตอนนี้มีมากเกินไป

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

3
@Avi คำตอบนี้เกิดขึ้นสามปีหลังจากคำถามของ OP ในช่วงเวลาของคำถาม (และคำตอบที่ยอมรับ) ไม่มีคุณลักษณะนี้
medveshonok117

@ medveshonok117 ได้เลย. ขอบคุณ
Avi

51

คุณสามารถใช้@Scheduledคำอธิบายประกอบ แต่ร่วมกับcronพารามิเตอร์เท่านั้น:

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

5 "*/5 * * * * *"วินาทีของคุณช่วงเวลาอาจจะแสดงเป็น อย่างไรก็ตามตามที่ฉันเข้าใจคุณไม่สามารถให้ความแม่นยำน้อยกว่า 1 วินาทีได้


9
นิพจน์ cron ที่คุณแสดงนั้นเทียบเท่ากับ fixedRate ซึ่งแตกต่างจาก fixedDelay
codebox

4

ใน Spring Boot 2 เราสามารถใช้ Spring Expression Language (SpPL) สำหรับ@Scheduledคุณสมบัติคำอธิบายประกอบ:

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

application.propertiesไฟล์จะมีลักษณะเช่นนี้

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

แค่นั้นแหละ. นี่คือบทความที่อธิบายรายละเอียดการจัดตารางงาน


1

ฉันเดาว่าคุณสามารถแปลงค่าด้วยตัวคุณเองโดยการกำหนดถั่ว ฉันไม่ได้ลองแต่ฉันเดาว่าวิธีการที่คล้ายกับต่อไปนี้อาจเป็นประโยชน์สำหรับคุณ:

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

ที่อยู่:

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

ขอบคุณที่ฟังดูเหมือนวิธีเดียว แต่พูดตามตรงฉันหวังว่าจะได้โซลูชันที่หรูหรากว่านี้ ("สปริง") :-)
ngeek

2
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้เนื่องจากแอตทริบิวต์คำอธิบายประกอบ @Scheduled fixedDelay ต้องการค่าคงที่ (long) ในการกำหนด
ngeek

อ่าถูกต้องแล้ว ดังนั้นฉันเดาว่าคุณไม่สามารถทำได้ด้วย@Scheduledคำอธิบายประกอบในตอนนั้น
Grzegorz Oledzki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.