【问题标题】:Mule connector config needs dynamic attributesMule 连接器配置需要动态属性
【发布时间】:2017-07-10 09:07:31
【问题描述】:

我开发了一个新的连接器。这个连接器需要配置两个参数,比如说:

  • default_trip_timeout_milis
  • default_trip_threshold

挑战是,我想从 API 读取 ${myValue_a} 和 ${myValue_a},使用 HTTP 调用,不是从文件或内联值。

由于这是一个连接器,我需要在初始化连接器之前在某处进行此 API 调用。

FlowVar 不是一个选项,因为它们是使用 Flows 初始化的,而这在 Mule 应用程序生命周期之前就发生过。

我的想法是创建一个实现 Initialisable 的 Spring Bean,因此它将在连接器初始化之前被调用,在这里,使用任何基于 java 的库(Spring RestTemplate?),调用 API,获取值,并将它们存储在某个地方(上下文?objectStore?),以便连接器可以访问它们。

有意义吗?还有其他想法吗?

谢谢!

【问题讨论】:

    标签: spring mule mule-component


    【解决方案1】:

    嗯,您可以创建一个类,该类将在启动时创建属性,并在此类中通过 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;
        }
     }
    

    现在您应该可以使用以下命令加载此属性类:

      <context:property-placeholder properties-ref="propertyInit"/>
    

    希望你喜欢这个想法。我在之前的项目中使用了这种方法。

    【讨论】:

      【解决方案2】:

      我想首先给你一个强烈的警告。如果你走这条路,那么你就有可能以非常奇怪的方式破坏你的应用程序,因为如果任何其他组件依赖于这个组件,那么你在启动时就有动态组件,你会破坏它们,你应该考虑是否有其他方法来实现这一点行为而不是使用属性。

      也就是说,这样做的方法是使用代理模式,它是您在更改属性时重新创建的组件的代理。所以你需要创建一个扩展Circuit Breaker 的类,它封装了Circuit Breaker 的实例,只要它的属性发生变化,就会重新创建它。这些属性不能在代理类之外使用,因为其他组件可能会在启动时读取这些属性然后不刷新,您必须记住这一点,任何可能直接或间接访问这些属性的东西都不能在它们的初始化阶段或您的应用程序将中断。

      值得一看 SpringCloudConfig,它允许您拥有一个属性服务器,然后您的所有应用程序都可以在运行时热重新加载这些属性,当它们发生变化时。如果 SpringCloud 还支持的话,不确定你是否可以在 Mule 中走这条路,但知道存在是件好事。

      【讨论】:

      • 非常感谢。我会调查所有可能的方法!
      猜你喜欢
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多