2014-12-31 50 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>