Mule 连接器配置需要动态属性
Mule connector config needs dynamic attributes
我开发了一个新的连接器。此连接器需要配置两个参数,比方说:
- default_trip_timeout_milis
- default_trip_threshold
挑战是,我想使用 HTTP 调用从 API 中读取 ${myValue_a} 和 ${myValue_a}, 而不是 来自文件或内联值。
由于这是一个连接器,我需要在初始化连接器之前在某处进行此 API 调用。
FlowVars 不是一个选项,因为它们是使用 Flows 初始化的,并且这在 Mule 应用程序生命周期之前就已经发生了。
我的想法是创建一个 Spring Bean 实现 Initialisable,因此它将在连接器初始化之前被调用,在这里,使用任何 java基于库 (Spring RestTemplate?),调用 API,获取值,并将它们存储在某处(上下文?objectStore?),以便连接器可以访问它们。
有道理吗?还有其他想法吗?
谢谢!
嗯,您可以制作一个 class,它将在启动时创建属性,并在此 class 中通过 http 请求获取 API 属性。示例如下:
public class PropertyInit implements InitializingBean,FactoryBean {
private Properties props = new Properties();
@Override
public Object getObject() throws Exception {
return props;
}
@Override
public Class getObjectType() {
return Properties.class;
}
}
现在您应该可以使用以下方式加载此 属性 class:
<context:property-placeholder properties-ref="propertyInit"/>
希望你喜欢这个主意。我在之前的项目中使用了这种方法。
我想首先强烈警告你这样做。如果你沿着这条路走下去,那么你就有可能以非常奇怪的方式破坏你的应用程序,因为如果任何其他组件依赖于这个组件,你在启动时有动态组件,你会破坏它们,你应该考虑是否有其他方法可以实现这一点行为而不是使用属性。
也就是说,实现此目的的方法是使用代理模式,它是您在组件属性发生更改时重新创建的组件的代理。因此,您将需要创建一个扩展 Circuit Breaker
的 class,它封装 Circuit Breaker
的实例,只要其属性发生变化就会重新创建。这些属性不能在代理之外使用 class 因为其他组件可能会在启动时读取这些属性然后不刷新,你必须记住这一点,任何可能直接或间接访问这些属性的东西都不能在它们的初始化阶段,否则您的应用程序将中断。
SpringCloudConfig 值得一看,它允许您拥有一个属性服务器,然后您的所有应用程序都可以在运行时热重载这些属性,当它们发生变化时。不确定如果支持 SpringCloud,您是否可以在 Mule 中采用该路径,但很高兴知道存在。
我开发了一个新的连接器。此连接器需要配置两个参数,比方说:
- default_trip_timeout_milis
- default_trip_threshold
挑战是,我想使用 HTTP 调用从 API 中读取 ${myValue_a} 和 ${myValue_a}, 而不是 来自文件或内联值。
由于这是一个连接器,我需要在初始化连接器之前在某处进行此 API 调用。
FlowVars 不是一个选项,因为它们是使用 Flows 初始化的,并且这在 Mule 应用程序生命周期之前就已经发生了。
我的想法是创建一个 Spring Bean 实现 Initialisable,因此它将在连接器初始化之前被调用,在这里,使用任何 java基于库 (Spring RestTemplate?),调用 API,获取值,并将它们存储在某处(上下文?objectStore?),以便连接器可以访问它们。
有道理吗?还有其他想法吗?
谢谢!
嗯,您可以制作一个 class,它将在启动时创建属性,并在此 class 中通过 http 请求获取 API 属性。示例如下:
public class PropertyInit implements InitializingBean,FactoryBean {
private Properties props = new Properties();
@Override
public Object getObject() throws Exception {
return props;
}
@Override
public Class getObjectType() {
return Properties.class;
}
}
现在您应该可以使用以下方式加载此 属性 class:
<context:property-placeholder properties-ref="propertyInit"/>
希望你喜欢这个主意。我在之前的项目中使用了这种方法。
我想首先强烈警告你这样做。如果你沿着这条路走下去,那么你就有可能以非常奇怪的方式破坏你的应用程序,因为如果任何其他组件依赖于这个组件,你在启动时有动态组件,你会破坏它们,你应该考虑是否有其他方法可以实现这一点行为而不是使用属性。
也就是说,实现此目的的方法是使用代理模式,它是您在组件属性发生更改时重新创建的组件的代理。因此,您将需要创建一个扩展 Circuit Breaker
的 class,它封装 Circuit Breaker
的实例,只要其属性发生变化就会重新创建。这些属性不能在代理之外使用 class 因为其他组件可能会在启动时读取这些属性然后不刷新,你必须记住这一点,任何可能直接或间接访问这些属性的东西都不能在它们的初始化阶段,否则您的应用程序将中断。
SpringCloudConfig 值得一看,它允许您拥有一个属性服务器,然后您的所有应用程序都可以在运行时热重载这些属性,当它们发生变化时。不确定如果支持 SpringCloud,您是否可以在 Mule 中采用该路径,但很高兴知道存在。