Mule PlaceHolder文档错了吗?

时间:2017-02-21 14:15:45

标签: java spring deployment mule placeholder

我希望使用正确的属性方式在多个环境中进行部署......但示例并不起作用: 网址:https://docs.mulesoft.com/mule-user-guide/v/3.8/deploying-to-multiple-environments

我创建了一个项目,其http配置如示例所示:

<http:listener-config name="HttpListenerConfiguration"
                    doc:name="HTTP Listener Configuration"
                    host="${mule.env.host}"
                    port="${mule.env.port}"
                    basePath="${mule.env.basePath}" />

他们说的地方

  

此示例使用Spring的属性占位符解析机制。可变位清晰可见:基本路径,主机和端口可能因部署此连接器的每个环境而异。在部署应用程序时,mule.env可以被您正在部署的特定环境动态替换,例如作为qa或prod。

我在java / main / resources中创建了一个名为config.properties的文件:

dev.basePath=test/products
dev.host=localhost
dev.port=8082
prod.basePath=products
prod.host=www.acme.com
prod.port=8081

并设置占位符:

<context:property-placeholder location="config.properties"/>

我的mule-app.properties:

mule.env=dev

当我在AS中运行时:

[Could not resolve placeholder 'mule.env.host' in string value "<http:listener-config name="ejemplop....]

如果我改变了以下值:

 ${mule.env.host} to ${${mule.env}.host} 

并且host属性有效,但是如果我对端口

执行相同的操作
(${${mule.env}.port} 

给我一​​个错误

[..${${mule.env}.port}' is not a valid value of union type 'substitutableInt'....]

但如果我添加我的属性文件

env.port=${${mule.env}.port}

并将连接器更改为:

<http:listener-config name="HttpListenerConfiguration"
                    doc:name="HTTP Listener Configuration"
                    host="${${mule.env}.host}"
                    port="${env.port}"
                    basePath="${mule.env.basePath}" />

它的作品。 有一种奇特或正确的方法吗?

2 个答案:

答案 0 :(得分:1)

CHo,你正朝着多重环境的方向前进,但还没到那里。如果您需要多个属性文件,我会建议您使用多个属性文件,每个属性文件具有相同的属性,但具有相同的名称但环境特定的值。

在你的应用程序中,你会有类似的东西:

<context:property-placeholder location="config_${mule.env}.properties"/>

然后在你的流程中你将拥有:

<http:listener-config name="HttpListenerConfiguration"
                    doc:name="HTTP Listener Configuration"
                    host="${host}"
                    port="${port}"
                    basePath="${basePath}" />

然后您将拥有一个名为config_dev.properties的属性文件,其中包含:

basePath=test/products
host=localhost
port=8082

您将拥有另一个名为config_prod.properties的属性文件:

basePath=products
host=www.acme.com
port=8081

当mule.env设置为dev时,将使用config_dev值。设置为prod时,将使用config_prod值。

答案 1 :(得分:0)

我认为你可以忽略实际用途中提到的Spring。在幕后,我认为全球占位符使用该技术。以下是适用于我的简单步骤:

  1. 在mule-project.xml中,创建一个具有值或dev或qa的mule.env变量。 mule-project-xml variable
  2. 选择项目xml,转到“全局元素”选项卡,然后创建全局属性占位符。
  3. global placeholder element

    1. 将位置设置为:

      $ {mule.env}的.properties

    2. 在/ src / main / app中创建qa.properties文件并定义属性:

      mule.env.host =本地主机

      mule.env.port = 8082

    3. 在src / main / app中创建dev.properties文件并定义属性:

      mule.env.host =本地主机

      mule.env.port = 8081

    4. 在HTTP侦听器配置中,按如下方式设置主机和端口:

      $ {mule.env.host}

      $ {mule.env.port}

    5. 使用步骤1中的qa环境变量运行应用程序时,从端口8081启动应用程序。将环境变量更改为dev并重新部署应用程序。现在,您从端口8082启动应用程序。

      以下是XML示例:

      <?xml version="1.0" encoding="UTF-8"?>
      
      <mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
          xmlns:spring="http://www.springframework.org/schema/beans" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
      http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
      http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-current.xsd">
          <context:property-placeholder location="${mule.env}.properties"/>
          <http:listener-config name="HTTP_Listener_Configuration" host="${mule.env.host}" port="${mule.env.port}" doc:name="HTTP Listener Configuration"/>
          <http:request-config name="HTTP_Request_Configuration" host="jsonplaceholder.typicode.com" port="80" doc:name="HTTP Request Configuration"/>
          <flow name="myprojectFlow">
              <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
              <http:request config-ref="HTTP_Request_Configuration" path="/users" method="GET" doc:name="HTTP"/>
          </flow>
      </mule>