【问题标题】:dynamically determining polling frequency in mule动态确定 mule 中的轮询频率
【发布时间】:2015-01-04 06:58:59
【问题描述】:

我一直在努力寻找能够动态读取 mule 流中的轮询频率的解决方法。目前我在启动时使用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>

【问题讨论】:

  • 顺便说一句,我还尝试查看一些侦听文件并获取值的东西。 1)首先,我不知道这是否正确 2)我不确定如何覆盖属性占位符的属性值映射并在场景后面更新新值(只需从文件中读取)以便骡子可以使用更新值以确定轮询频率。
  • 对于未来的读者,这是一个快速的答案:接受的答案是进行热部署,尽管它在产品服务器中不是一个好主意。另一个建议是使用 JMX

标签: java spring mule esb


【解决方案1】:

&lt;fixed-frequency-scheduler frequency="${pollinginterval}"/&gt; 绝对没有问题,因为您可以从属性文件中动态读取轮询频率...

我唯一关心的是:- &lt;context:property-placeholder location="file:///C:/Users/test/config.properties" /&gt;

由于您正在从类路径之外的属性文件中读取,因此最好尝试以下操作:-

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

还有一件事 .. 如果您使用 Spring beans 作为属性文件,请使用以下方式:-

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

【讨论】:

  • 感谢 cmets。你能解释一下它是如何动态读取属性的(意味着文件在应用程序启动后更新)?顺便说一句,实际上我的类路径中有属性文件,为了让读者清楚,我编造了它。我认为这不是问题。
  • 如果文件在应用程序启动后更新,那么您必须重新启动服务器以选择更改,或者如果您不想重新启动服务器但仍希望应用程序读取更新的值那么您需要进行 Mule 热部署:- mulesoft.org/documentation/display/current/Hot+Deployment ... 如果您在 classpath 中有属性文件,那么您需要使用 classpath: 而不是 file:。关于您的&lt;fixed-frequency-scheduler frequency="${pollinginterval}"/&gt; 查询.. 它会从属性文件中读取值,我已经对其进行了测试
  • 查询当前正在从文件中读取属性。没有问题,我希望能够在不重新启动服务器的情况下读取属性。热部署是个好主意。我没有考虑过,但想知道是否有任何(软)方式来监听文件更改事件并在文件更改时更新 {pollinginterval} 而无需重新启动应用程序。我知道这是可行的,并且有 r apache commons file utils 会在文件更改时通知但我不确定如何在 mule 中执行此操作
  • 热部署是一个好主意,让服务器在不重新启动服务器的情况下知道属性文件中的更改.. 进行这种热部署的方法很少.. 一种方法是在更新属性文件之后只需在您的 mule config xml 文件中进行一些更改,例如添加 cmets 或只是在 2 个标签之间放置一个空格 ...并保存它.. Mule 将自动重新加载配置而无需重新启动服务器 ...现在,如果您发现答案有用,请点击接受答案接受它
  • 感谢您的回复。我意识到我无法进行热部署,因为文件由另一个流程更新(不是手动)。作为上述流程的一部分,我也可以触摸配置文件,但它看起来很脏。我会再等几天才能接受答案
【解决方案2】:

不存在使用 FixedFrequencyScheduler 的干净方式。您可能会去注册表,按名称获取您的流,然后获取 MessageSource 并将其转换为 FixedFrequencyScheduler 设置新的间隔和停止启动,但是如果您查看code,您会看到没有setter 和 reflexion 它太脏了。

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

【讨论】:

  • Jmx 看起来有点复杂,但在逻辑上是可行的。我希望 mule 应该有一些开箱即用的解决方案。
【解决方案3】:

我绝对建议不要使用热部署来解决这个问题,特别是如果您需要经常更改频率。这可能会导致 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>

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-04-20
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多