【发布时间】:2016-03-04 04:22:35
【问题描述】:
我有一个从 postgres 加载数据的流程,我希望这个流程在其他流程之前执行,我有很多流程。我正在尝试在 Mule 3.7 中执行此操作
我有串行的 http 入站,几乎所有这些都需要这个从 postgres 加载数据的流,所以它们不能是私有的
我该怎么做?
【问题讨论】:
标签: mule
我有一个从 postgres 加载数据的流程,我希望这个流程在其他流程之前执行,我有很多流程。我正在尝试在 Mule 3.7 中执行此操作
我有串行的 http 入站,几乎所有这些都需要这个从 postgres 加载数据的流,所以它们不能是私有的
我该怎么做?
【问题讨论】:
标签: mule
您要稍后执行的所有流程,使其初始状态停止如下:- <flow name="..." initialState="stopped">
现在,部署应用程序时,您不想执行的所有流都不会运行。
现在在从 postgres 加载数据的流程结束时,在从 DB 加载数据后,启动所有停止的流程如下:-
<scripting:component>
<scripting:script engine="groovy">
muleContext.registry.lookupFlowConstruct('targetFlow').start()
</scripting:script>
</scripting:component>
这将启动所有其他已停止的流程,并将在您想要的流程之后执行,我希望这能满足您的要求。
【讨论】:
在您的问题中提供有限的上下文的情况下,一种方法是将您想要运行的流程设为public(意思是,定义一个入站端点)并将其他流程设为private,您称之为明确使用flow-ref
编辑:你可以在对象存储中定义一个变量loadCache,初始值为false,当你运行其他流程时,他们首先检查loadCache是否是仍然是false,然后调用loadData 流和loadData 流在完成时会将变量的值设置为true。所以任何其他需要缓存数据的流,都会检查这个变量并基于它使用cache数据或调用函数来加载数据
类似这样的:
<flow...>
....
<!-- flows with http or other inbounds -->
<objectstore:retrieve config-ref="ObjectStore__Configuration" key="cacheLoad" defaultValue-ref="#[false]" targetProperty="flowVars.cacheLoad" doc:name="retrieve cacheLoad"/>
</flow>
<flow> ...
<!--load data from postgress-->
<objectstore:store config-ref="ObjectStore__Configuration" key="cacheLoad" value-ref="#[true]" doc:name="store cacheLoad"/>
</flow>
对象存储参考https://docs.mulesoft.com/mule-user-guide/v/3.7/mule-object-stores
另一种选择是使用注册表对象而不是对象存储https://docs.mulesoft.com/mule-user-guide/v/3.7/storing-objects-in-the-registry
【讨论】:
您可以在停止状态下加载所有依赖流并让您的核心流首先启动,一旦成功启动,您就可以按照您想要的顺序触发其余流的启动。
【讨论】: