2014-12-31 45 views
0

我一直在努力寻找解决办法,以便能够动态读取骡子流中的轮询频率。目前我正在使用spring的Propertyplaceholder在启动时读取该文件,并且即使更改了fie,值也保持不变(因为我们都知道)。动态确定骡子轮询频率

由于poll标签需要是流中的第一个组件,没有什么我可以做的来阅读“实时”文件更新。

有什么办法可以设置从文件动态读取轮询频率(无需重启)?

相关信息:

<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)首先,我不知道这是否是正确的方法2)我不知道如何覆盖propertyplaceholder的属性值映射并更新场景后面的新值(只是从文件中读取),以便mule可以使用更新的值来确定轮询频率。 –

+0

对于未来的读者,下面是快速回答:接受的答案是做热部署,虽然它不是一个好主意在prod服务器。其他建议是使用JMX –

回答

1

没有与<fixed-frequency-scheduler frequency="${pollinginterval}"/>绝对没有问题,你可以动态读取轮询频率从属性文件...

的唯一的事情我在这里关注的是: - <context:property-placeholder location="file:///C:/Users/test/config.properties" />

因为你是从属性文件中读取你的classpath外,更尝试以下操作: -

<context:property-placeholder 
     location="file:C:/Users/test/config.properties" /> 

一件事。如果您在使用Spring豆属性文件使用方式如下: -

<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> 
+0

感谢您的意见。你能解释一下它是如何动态读取这些属性的(意思是在应用程序启动后更新文件)?顺便说一句,其实我有我的类路径属性文件,为了清晰读者,我补充了..我不认为这是一个问题。 –

+0

投票赞成spring bean的属性列表和值。 –

+0

如果在应用程序启动后更新了文件,那么要么您必须重新启动服务器才能选择更改,或者如果您不想重新启动服务器但仍希望应用程序要阅读更新的值,那么你需要去骡热部署: - http://www.milesoft.org/documentation/display/current/Hot+Deployment ...,如果你有属性文件在**类路径** ,那么你需要使用'classpath:'而不是'file:'。并且关于你的固定频率调度器频率= $ {pollinginterval}“/>'查询..它将读取属性文件中的值并且我已经测试了它 –

1

使用FixedFrequencyScheduler的清洁方式是不存在的。你可能会去注册表中,通过名字获取流,然后获取MessageSource并将其转换为FixedFrequencyScheduler来设置新的时间间隔并停止启动,但是如果您看一下code,则会看到没有设置用于它和反射它太脏了。

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

+0

Jmx似乎并不复杂,但在逻辑上是可行的。我希望骡子应该为它提供一些开箱即用的解决方案。 –

1

我绝对建议不要使用热部署来解决这个问题,特别是如果你需要经常更改频率。存在这样的风险,即这会导致毛发内存不足的问题。

相反,您可以使用具有石英端点的流量,该端点的发射频率相对较低。然后添加一个只允许以所需频率通过消息的过滤器。

过滤器可以观察属性文件进行更改,也可以通过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>