我有cron表达式触发弹簧集成流程类似如下:
<int-ftp:inbound-channel-adapter id="my-input-endpoint" ...>
<int:poller trigger="my-trigger"/>
</int-ftp:inbound-channel-adapter>
<bean id="my-trigger"
class="org.springframework.scheduling.support.CronTrigger">
<constructor-arg value="0 * * * * *" />
</bean>
它工作正常。 但现在我必须(在同一时间点只有一个群集节点上执行作业)延长实施,使其集群就绪。
我的愿望是使用Quartz框架在集群模式下(坚持在数据库中的作业状态)来触发这个集成流程。 Quartz提供一个beautful解决方案开箱即用。 唯一的问题是如何将石英与现有inbout-channer适配器集成? 在“轮询”的“触发”属性只接受org.springframework.scheduling.Trigger的子类。 我找不到“轮询触发”和Quartz框架之间的桥梁。
提前谢谢了!
这里有一种方法...
设置输入适配器为false,自动启动属性。
创建一个自定义触发,仅触发一次,立即...
public static class FireOnceTrigger implements Trigger {
boolean done;
public Date nextExecutionTime(TriggerContext triggerContext) {
if (done) {
return null;
}
done = true;
return new Date();
}
public void reset() {
done = false;
}
}
在您的石英工作,去触发和参考SourcePollingChannelAdapter
。
当石英触发火灾,有石英工作
- adapter.stop()
- trigger.reset()
- adapter.start()
加里解决方案的工作。 这是我的Spring上下文:
<int-ftp:inbound-channel-adapter id="my-endpoint"
auto-startup="false">
<int:poller trigger="my-endpoint-trigger"/>
</int-ftp:inbound-channel-adapter>
<bean id="my-endpoint-trigger" class="com.my.FireOnceTrigger"/>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="my-job-trigger" />
</list>
</property>
<property name="schedulerContextAsMap">
<map>
<entry key="inputEndpoint"><ref bean="my-input-endpoint" /></entry>
<entry key="inputEndpointTrigger"><ref bean="my-endpoint-trigger" /></entry>
</map>
</property>
</bean>
<bean id="my-job-trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="cronExpression" value="0 * * * * ?" />
<property name="jobDetail" ref="my-job" />
</bean>
<bean name="my-job" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.my.MyActivatorJob " />
</bean>
和MyActivatorJob类:
public class MyActivatorJob extends QuartzJobBean implements {
private AbstractEndpoint inputEndpoint;
private FireOnceTrigger inputEndpointTrigger;
public void setInputEndpoint(final AbstractEndpoint pInputEndpoint) {
this.inputEndpoint = pInputEndpoint;
}
public void setInputEndpointTrigger(final FireOnceTrigger pInputEndpointTrigger) {
this.inputEndpointTrigger = pInputEndpointTrigger;
}
@Override
protected void executeInternal(final JobExecutionContext pParamJobExecutionContext)
throws JobExecutionException {
inputEndpoint.stop();
inputEndpointTrigger.reset();
inputEndpoint.start();
}
}
作为下一个步骤今年春天背景下不得不进行重构,以取代schedulerContextAsMap的东西更灵活的使用,并能够定义更多的就业机会来启用和停用许多不同的端点。
由于加里至今!
试图石英和春季整合,你提出,但面对其他两个问题:
1)IncompatibleClassChangeError异常使用Quartz 2.x和春天3.x的时 这是一个众所周知的问题,但我没有找到任何解决方案。
2)其他的Spring bean的注入石英硅作业实例。 我找到了一些解决方案,但没有一个人对我的作品。 我已经试过了一个使用
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory">
<bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory" />
</property>
<property name="triggers">
...
</property>
<property name="schedulerContextAsMap">
<map>
<entry key="inputEndpoint" value-ref="my-endpoint" />
</map>
</property>
</bean>
注入其他bean到作业,但增加该属性为不被执行的作业通过SchedulerFactoryBean后(我没有看到任何异常)。 删除属性“schedulerContextAsMap”出来,使作业再次运行。
我还没有尝试过,但看到石英2和Spring兼容性问题似乎已经被固定在春天3.1.1。 见https://jira.springsource.org/browse/SPR-8889