从 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;
    }
}