我正在将 Mule 1.3 应用程序升级到 Mule 3.2.1(最新版本)。 Mule 1.3 配置文件有一个“model”元素和许多“mule-descriptor”子元素。
<model name="theModel">
<mule-descriptor name="theName" implementation="com.company.SomeClass">
<inbound-router>
<endpoint address="servlet://service/foo" transformers="ACustomTransformer" responseTransformers="AnotherCustomTransformer" />
<endpoint address="vm://anEndpoint"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="Authenticator">
<properties>
<property name="propName" value="propValue" />
</properties>
</endpoint>
<filter expression="/data = null" className="org.mule.routing.filters.xml.JXPathFilter" />
</router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="RequestValidator" />
</router>
</outbound-router>
<properties>
<property name="someProp" value="someValue" />
</properties>
</mule-descriptor>
<!-- more <mule-descriptor> elements -->
</model>
如何将其转换为 Mule 3 等效项?谢谢。
编辑 - 2012 年 5 月 29 日
1) 一些 mule 描述符具有指向自身的入站路由器。
<mule-descriptor name="theName" implementation="com.company.SomeClass">
<inbound-router>
<endpoint address="theName" />
</inbound-router>
</mule-descriptor>
如何将它们转换为 Mule 3 流程?当我使用您答案中的信息将它们转换为流时,我在启动时收到一条错误消息,这似乎表明它无法引用该流,因为它仍在创建中(如循环依赖项):
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ref:RequestValidator.20': Cannot resolve reference to bean 'RequestValidator' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'RequestValidator': Cannot create inner bean '(inner bean)' of type [org.mule.config.spring.factories.InboundEndpointFactoryBean] while setting bean property 'messageSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': 1 constructor arguments specified but no matching constructor found in bean '(inner bean)' (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
2) 一个 mule 描述符使用 BridgeComponent
来自 Mule API 的类作为其实现。这些应该如何处理呢? Mule 3 中不存在此类。
<mule-descriptor name="theName" implementation="org.mule.components.simple.BridgeComponent">
<inbound-router>
<endpoint address="vm://theInboundAddress" />
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="vm://theOutboundAddress" />
</router>
</outbound-router>
</mule-descriptor>
3) 另一个 mule 描述符在其 <outbound-router>
中有一个“matchAll”属性。元素。应如何将其转换为 Mule 3 流程?
<mule-descriptor name="theName" implementation="com.company.SomeClass">
<inbound-router>
<endpoint address="servlet://theInboundEndpoint" />
</inbound-router>
<outbound-router matchAll="true">
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="firstOutboundEndpoint" />
</router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter" transformer="MyTransformer">
<endpoint address="vm://secondOutboundEndpoint" />
<filter pattern="Error*" className="org.mule.routing.filters.WildcardFilter" />
</router>
</outbound-router>
</mule-descriptor>
4) Mule 1.x 配置有一些 <endpoint-identifier>
名称与 <mule-descriptor>
中某些元素的名称相同的元素元素。这些名称也用作 <mule-descriptor>
中的端点地址。 。例如:
<endpoint-identifiers>
<endpoint-identifier name="TheEndpointName" value="vm://theEndpointAddress" />
</endpoint-identifiers>
...
<model name="...">
<mule-descriptor name="TheEndpointName" implementation="...">
<inbound-router>
<endpoint address="TheEndpointName" />
</inbound-router>
...
</mule-descriptor>
...
</model>
我的猜测是 Mule 3 的等效代码应该类似于下面的代码。这是正确的吗?
<flow name="TheEndpointName">
<!--
My first guess was:
<inbound-endpoint ref="TheEndpointName" />
-->
<vm:inbound-endpoint path="theEndpointAddress" />
...
</flow>
再次感谢您。
编辑 2012 年 5 月 30 日
5) 一些 mule 描述符使用 RestServiceWrapper
来自 Mule API 的类。当我将其转换为 Mule 3 <flow>
,我收到此错误:
The required object/property 'serviceUrl' is null
我注意到 Mule 1.x 配置中的 mule-descriptor 设置了一个名为“urlFromMessage”的属性,这似乎是说,URL 不是在 XML 配置文件中提供,而是作为属性提供到骡子消息。然而,“urlFromMessage”属性在 Mule 3 版本的 RestServiceWrapper
中不存在。类(class)。我应该在 Mule 3 中使用不同的组件类吗?由于此类是 Mule API 的一部分,我是否应该使用标准 XML 标记来代替?谢谢。
<mule-descriptor name="theName" implementation="org.mule.components.rest.RestServiceWrapper">
<inbound-router>
...
</inbound-router>
<properties>
<property name="urlFromMessage" value="true" />
</properties>
</mule-descriptor>
最佳答案
模型
已被弃用。flow
已替换mule-descriptor
还有更多,请查看为 Mule 3 转换的配置:
<flow name="theName">
<composite-source>
<vm:inbound-endpoint path="anEndpoint">
<transformer ref="ACustomTransformer" />
<response>
<transformer ref="AnotherCustomTransformer" />
</response>
</vm:inbound-endpoint>
<servlet:inbound-endpoint path="/service/foo" />
</composite-source>
<component>
<singleton-object class="com.company.SomeClass">
<property key="someProp" value="someValue" />
</singleton-object>
</component>
<outbound-endpoint ref="Authenticator">
<expression-filter expression="/data = null"
evaluator="jxpath" />
<property key="propName" value="propValue" />
</outbound-endpoint>
<outbound-endpoint ref="RequestValidator" />
</flow>
注意:此配置对 Mule 3.2.1 有效,但我不能保证它完全符合您的要求,您必须测试和调整它!
更多答案:
1) 对流和端点使用不同的名称,它们现在在后台注册为单独的 bean,因此不能共享相同的名称。这给出:
<flow name="theFlowName">
<inbound-endpoint ref="theInboundName" />
<component>
<singleton-object class="com.company.SomeClass" />
</component>
</flow>
2) 使用Bridge pattern :
<pattern:bridge name="theName"
inboundAddress="vm://theInboundAddress"
outboundAddress="vm://theOutboundAddress" />
3) 使用all
routing message processor并使用processor-chain
将多个消息处理器分组为一个:
<flow name="theName">
<servlet:inbound-endpoint path="/theInboundEndpoint" />
<component>
<singleton-object class="com.company.SomeClass" />
</component>
<all>
<outbound-endpoint ref="firstOutboundEndpoint" />
<processor-chain>
<transformer ref="MyTransformer" />
<wildcard-filter pattern="Error*" />
<vm:outbound-endpoint path="secondOutboundEndpoint" />
</processor-chain>
</all>
</flow>
4) 你不能在流中声明全局端点,并且需要对端点和流使用不同的名称,因此实际的 Mule 3 配置等效为:
<vm:endpoint name="TheEndpointName" path="theEndpointAddress" />
<flow name="TheFlowName">
<inbound-endpoint ref="TheEndpointName" />
<component>
<singleton-object class="..." />
</component>
</flow>
5) 大多数 Mule 默认组件现在都可以作为 XML 元素使用,因此您确实需要使用:
<http:rest-service-component serviceUrl="..." />
urlFromMessage
消失了:您可以使用 Mule expression以动态方式从传输中的消息中提取 URL。例如,如果在名为 svcURL
的入站属性中提供 URL,请使用:
<http:rest-service-component serviceUrl="#[header:INBOUND:svcURL]" />
关于mule - 将 Mule 1.3 "model"元素转换为 Mule 3 等效元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638206/