首页 > 解决方案 > 从 muleContext.getRegistry() 与 message.getInvocationProperty(...) 获取属性的区别

问题描述

这是骡子3.9

我的组织正在为我们的应用程序外部化所有属性。对于部署在 cloudhub 中的应用程序,属性都将在运行时管理器中设置。对于本地开发,我们使用context:property-placeholder从本地机器上的文件中加载属性。

我们的一个项目有一个 Java 转换器,它使用muleContext.getRegistry().get(propName). 不幸的是,使用context:property-placeholder加载的属性不会出现在注册表中。(这些属性以前在mule-app.properties中。)我们试图将与外部化属性相关的更改保持在最低限度。我想我们可以使用属性值设置 flowVars 并将转换器更改为使用message.getInvocationProperty(propName). 我担心这种变化可能会产生我没有考虑的后果。编写 Java 转换器的开发人员不再在这里,所以我不能问他为什么要从注册表中获取值。

muleContext.getRegistry().get(propName)using和之间的功能区别是什么message.getInvocationProperty(propName)?从一个切换到另一个时需要考虑哪些影响(相对于内存、性能、错误处理等)?

标签: mulemule-esb

解决方案


调用属性是流变量(或 flowVars)的另一个名称。它们与配置属性完全无关。后者来自 mule-app.properties 和 context:property-placeholder 等属性文件,并在部署时设置。前者设置的是流内部的执行时间。

我不建议尝试直接从自定义 Java 代码访问配置属性。你提到的问题是一个原因。此外,组件在属性上的耦合过于紧密。

使用流变量来设置值并读取它们message.getInvocationProperty,从 Java API 的角度来看,这将更加干净,尽管它仍然将代码耦合得太紧,现在与变量耦合。

在这两种情况下,组件的用户都不清楚更改属性或流变量对转换器的影响,除非他们阅读了 Java 代码。

我认为更清楚的是将Java转换器用作Java bean,并将值作为自定义组件的Spring属性传递,因此该组件不依赖于任何一个。您需要使用 setter 定义每个值,并<spring:property>在 Mule 流上使用以从配置属性、变量或常量值传递值。

通过这种方式,也可以从流量侧看到发送到变压器的值。

例子:

骡子配置:

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

推荐阅读