动态确定骡子中的轮询频率

时间:2014-12-31 18:44:47

标签: java spring mule esb

我一直在努力寻找能够动态读取骡子流中轮询频率的工作。目前我正在使用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>

3 个答案:

答案 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你会看到那里不是它的反对者和反思它太脏了。

我的第一选择可能是利用quartz端点,然后利用石英能力通过jmx/rmi公开配置​​。

答案 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>