从 muleContext.getRegistry() 与 message.getInvocationProperty(...) 获取属性的区别
differences in getting properties from muleContext.getRegistry() vs message.getInvocationProperty(...)
这适用于 Mule 3.9
我的组织正在为我们的应用程序外部化所有属性。对于部署在 cloudhub 中的应用程序,属性将全部在 Runtime Manager 中设置。对于本地开发,我们使用 context:属性-placeholder 从本地机器上的文件加载属性。
我们的一个项目有一个 Java 使用 muleContext.getRegistry().get(propName)
访问属性的转换器。不幸的是,使用 context:属性-placeholder 加载的属性不会出现在注册表中。 (这些属性以前在 mule-app.properties 中。)我们试图将与外部化属性相关的更改保持在最低限度。我在想我们可以使用 属性 值设置 flowVars 并将转换器更改为使用 message.getInvocationProperty(propName)
。我担心这种变化可能会产生我没有考虑的后果。编写 Java 转换器的开发人员已不在,所以我不能问他为什么要从注册表中获取值。
使用 muleContext.getRegistry().get(propName)
和 message.getInvocationProperty(propName)
在功能上有什么区别?从一个切换到另一个时需要考虑哪些影响(相对于内存、性能、错误处理等)?
调用属性是流变量(或 flowVars)的另一个名称。它们与配置属性完全无关。后者来自 mule-app.properties 和 context:property-placeholder 等属性文件,并在部署时设置。前者设置为流程内部的执行时间。
我不建议尝试直接从自定义 Java 代码访问配置属性。你提到的问题是原因之一。此外,组件在属性上的耦合过于紧密。
使用流变量设置值并使用 message.getInvocationProperty
读取它们,从 Java API 的角度来看会更干净,尽管它仍然与代码耦合得太紧,现在到变量。
在这两种情况下,组件的用户都不清楚更改 属性 或流量变量对变压器的影响,除非他们阅读 Java 代码。
我认为更清楚的是使用 Java 转换器作为 Java bean,并将值作为自定义组件的 Spring 属性传递,因此组件不是取决于任何一个。您需要使用 setter 定义每个值,并在 Mule 流上使用 <spring:property>
来传递来自配置 属性、变量或常量值的值。
通过这种方式,发送到变压器的值也可以从流侧看到。
示例:
骡子配置:
<custom-transformer class="com.mycompany.test.CustomTransformer" doc:name="Java">
<spring:property name="propA" value="${propA}"/>
</custom-transformer>
Java 变压器:
package com.mycompany.test;
import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractMessageTransformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomTransformer extends AbstractMessageTransformer {
private String propA;
protected Logger logger = LoggerFactory.getLogger(this.getClass());
public CustomTransformer() {}
@Override
public Object transformMessage(MuleMessage arg0, String arg1)
throws TransformerException {
logger.info("propA: {}", propA);
// TODO Your transformation here
return null;
}
/**
* @param propA the propA to set
*/
public void setPropA(String property1) {
this.propA = property1;
}
}
这适用于 Mule 3.9
我的组织正在为我们的应用程序外部化所有属性。对于部署在 cloudhub 中的应用程序,属性将全部在 Runtime Manager 中设置。对于本地开发,我们使用 context:属性-placeholder 从本地机器上的文件加载属性。
我们的一个项目有一个 Java 使用 muleContext.getRegistry().get(propName)
访问属性的转换器。不幸的是,使用 context:属性-placeholder 加载的属性不会出现在注册表中。 (这些属性以前在 mule-app.properties 中。)我们试图将与外部化属性相关的更改保持在最低限度。我在想我们可以使用 属性 值设置 flowVars 并将转换器更改为使用 message.getInvocationProperty(propName)
。我担心这种变化可能会产生我没有考虑的后果。编写 Java 转换器的开发人员已不在,所以我不能问他为什么要从注册表中获取值。
使用 muleContext.getRegistry().get(propName)
和 message.getInvocationProperty(propName)
在功能上有什么区别?从一个切换到另一个时需要考虑哪些影响(相对于内存、性能、错误处理等)?
调用属性是流变量(或 flowVars)的另一个名称。它们与配置属性完全无关。后者来自 mule-app.properties 和 context:property-placeholder 等属性文件,并在部署时设置。前者设置为流程内部的执行时间。
我不建议尝试直接从自定义 Java 代码访问配置属性。你提到的问题是原因之一。此外,组件在属性上的耦合过于紧密。
使用流变量设置值并使用 message.getInvocationProperty
读取它们,从 Java API 的角度来看会更干净,尽管它仍然与代码耦合得太紧,现在到变量。
在这两种情况下,组件的用户都不清楚更改 属性 或流量变量对变压器的影响,除非他们阅读 Java 代码。
我认为更清楚的是使用 Java 转换器作为 Java bean,并将值作为自定义组件的 Spring 属性传递,因此组件不是取决于任何一个。您需要使用 setter 定义每个值,并在 Mule 流上使用 <spring:property>
来传递来自配置 属性、变量或常量值的值。
通过这种方式,发送到变压器的值也可以从流侧看到。
示例:
骡子配置:
<custom-transformer class="com.mycompany.test.CustomTransformer" doc:name="Java">
<spring:property name="propA" value="${propA}"/>
</custom-transformer>
Java 变压器:
package com.mycompany.test;
import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractMessageTransformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomTransformer extends AbstractMessageTransformer {
private String propA;
protected Logger logger = LoggerFactory.getLogger(this.getClass());
public CustomTransformer() {}
@Override
public Object transformMessage(MuleMessage arg0, String arg1)
throws TransformerException {
logger.info("propA: {}", propA);
// TODO Your transformation here
return null;
}
/**
* @param propA the propA to set
*/
public void setPropA(String property1) {
this.propA = property1;
}
}