我一直在努力寻找能够动态读取骡子流中轮询频率的工作。目前我正在使用Spring的Propertyplaceholder在启动时从文件中读取该值,即使改变了fie(我们都知道),值也保持不变。
由于poll标签需要成为流程中的第一个组件,因此我无法阅读" live"文件更新。
有什么办法可以设置从文件中动态读取的轮询频率(不需要重启)?
供参考:
<spring:beans>
<context:property-placeholder location="file:///C:/Users/test/config.properties" />
</spring:beans>
<flow name="querying-database-pollingFlow1" doc:name="querying-database-pollingFlow1">
<poll doc:name="Poll3e3">
<fixed-frequency-scheduler frequency="${pollinginterval}"/>
<db:select config-ref="MySQL_Configuration1" doc:name="Perform a query in MySQL">
<db:dynamic-query><![CDATA[select empId,empName from employer where status='active';]]></db:dynamic-query>
</db:select>
</poll>
....</flow>
答案 0 :(得分:1)
<fixed-frequency-scheduler frequency="${pollinginterval}"/>
绝对没有问题,因为您可以从属性文件中动态读取轮询频率...
我唯一担心的是: - <context:property-placeholder location="file:///C:/Users/test/config.properties" />
由于您正在读取类路径之外的属性文件,因此最好尝试以下方法: -
<context:property-placeholder
location="file:C:/Users/test/config.properties" />
还有一件事......如果您使用Spring bean作为属性文件,请使用以下方法: -
<spring:beans>
<spring:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<spring:property name="locations">
<spring:list>
<spring:value>file:C:/Users/test/config.properties</spring:value>
</spring:list>
</spring:property>
</spring:bean>
</spring:beans>
答案 1 :(得分:1)
使用FixedFrequencyScheduler的干净方式不存在。你可以去注册表,按名称获取你的流,然后获取MessageSource并将其转换为FixedFrequencyScheduler设置新的间隔和停止 - 开始,但是如果你看看code你会看到那里不是它的反对者和反思它太脏了。
答案 2 :(得分:1)
我肯定会建议不要使用热部署来解决这个问题,特别是如果你需要经常更改频率。这可能会导致permgen内存不足的问题。
相反,您可以使用具有相对较低频率的石英端点的流。然后添加一个过滤器,只允许以所需频率通过消息。
过滤器可以查看属性文件以进行更改,也可以通过JMX公开属性以允许您更改频率。这样的事情。
<spring:beans>
<spring:bean id="frequencyFilter" class="FrequencyFilter" />
</spring:beans>
<flow name="trigger-polling-every-second" doc:name="trigger-polling-every-second">
<quartz:inbound-endpoint repeatInterval="1000" doc:name="Quartz" responseTimeout="10000" jobName="poll-trigger">
<quartz:event-generator-job>
<quartz:payload>Scheduled Trigger</quartz:payload>
</quartz:event-generator-job>
</quartz:inbound-endpoint>
<filter ref="frequencyFilter" />
<vm:outbound-endpoint path="query-database" />
</flow>
<flow name="query-database">
<vm:inbound-endpoint path="query-database" />
<db:select config-ref="databaseConfig" doc:name="Perform a query in database">
<db:dynamic-query><![CDATA[select empId,empName from employer where status='active']]></db:dynamic-query>
</db:select>
<logger level="ERROR" message="#[payload]"/>
</flow>