mule - 从 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)
?从一个切换到另一个时需要考虑哪些影响(相对于内存、性能、错误处理等)?
解决方案
调用属性是流变量(或 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;
}
}
推荐阅读
- angular - Angular 2中的自动完成在选择后在输入框中显示id而不是名称
- angular - 日期列排序在 Primeng 中不起作用
- java - 在 Spring Container 中,@Autowire 如何跟踪在 setter 方法中注入的依赖项
- node.js - 有没有一种方法可以比 .populate() 更有效地验证 mongoose 中的相关文档并将其聚合在一起
- sql - 如何通过另一个表设置唯一键检查
- javascript - "IndexOf" function in ReactJS doesn't work like the vanilla JS approach
- java - 获取 ul 中 li 元素的数量而不存储在列表中
- python - 更改“py.exe”的窗口大小
- angular6 - 如何重定向到 Angular 6 中的特定选项卡?
- callback - Twilio 项目 - 修改来电显示名称和号码