如何在 JBoss Fuse 6.2.1 中正确管理功能配置部署?

How to correctly manage feature configuration deployment in JBoss Fuse 6.2.1?

我正在尝试评估 JBoss Fuse 作为一个集成平台,我有以下关于部署的问题。

我正在尝试设置结构并使用配置文件,更具体地说是 camel/blueprint 组件部署的功能存储库。 我在外部化组件配置时遇到以下问题:当我更新配置文件工件的快照时,容器不会获取配置更改。

此外,当我从容器中完全删除配置文件时,PID 配置文件保留在服务器上的 etc/ 文件夹中。

在部署期间还有一个额外的问题,camel 包在加载配置 pid 文件之前被激活,导致白羊座蓝图出现异常,我必须另外手动刷新 osgi 包。

功能存储库文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>  
<features name="fuse-poc">  
    <feature name="fuse-poc-common" version="${project.version}">  
        <bundle>mvn:com.myorg.fuse/common/${project.version}</bundle>  
    </feature>  
    <feature name="fuse-poc-camel" version="${project.version}">  
        <feature>fuse-poc-common</feature>  
        <config name="com.myorg.fuse.poc.camel">  
            test.value=ENC(5XdDgfKwwhMTmbo1z874eQ==)  
        </config>  
        <bundle>mvn:com.myorg.fuse/fuse-poc-camel/${project.version}            </bundle>  
    </feature>  
    <feature name="fuse-poc-activemq" version="${project.version}">  
        <feature>fuse-poc-common</feature>  
        <configfile finalname="etc/com.myorg.fuse.poc.jms.cfg">  
            mvn:com.myorg.fuse/feature/${project.version}/cfg/dev  
        </configfile>  
        <bundle>mvn:com.myorg.fuse/fuse-poc-camel-    activemq/${project.version}</bundle>  
    </feature>  
</features>  

项目本身是简单的骆驼原型项目,其中一个具有带日志记录的基本路由,另一个具有使用 activemq 和 cm:property-placeholder in blueprint.xml

的路由

这是maven中相应的构建部分:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <parent>  
  <groupId>com.myorg.fuse</groupId>  
  <artifactId>fuse-poc-parent</artifactId>  
  <version>1.0.0-SNAPSHOT</version>  
  </parent>  
  <artifactId>feature</artifactId>  
  <packaging>pom</packaging>  


  <name>FUSE PoC Feature Repository</name>  
  <build>  
        <resources>  
            <resource>  
                <directory>src/main/resources</directory>  
                <filtering>true</filtering>  
            </resource>  
        </resources>  
  <plugins>  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-resources-plugin</artifactId>  
                <version>2.6</version>  
                <executions>  
                    <execution>  
                        <id>filter</id>  
                        <phase>generate-resources</phase>  
                        <goals>  
                            <goal>resources</goal>  
                        </goals>  
                    </execution>  
                </executions>  
            </plugin>  
  <plugin>  
  <groupId>org.codehaus.mojo</groupId>  
  <artifactId>build-helper-maven-plugin</artifactId>  
  <version>1.10</version>  
  <executions>  
  <execution>  
  <id>attach-artifacts</id>  
  <phase>package</phase>  
  <goals>  
  <goal>attach-artifact</goal>  
  </goals>  
  <configuration>  
  <artifacts>  
  <artifact>  
  <file>target/classes/fuse-poc.xml</file>  
  <type>xml</type>  
  <classifier>features</classifier>  
  </artifact>  
                                <artifact>  
                                    <file>src/main/resources/env/dev/com.myorg.fuse.poc.jms.cfg</file>  
                                    <type>cfg</type>  
                                    <classifier>dev</classifier>  
                                </artifact>  
  </artifacts>  
  </configuration>  
  </execution>  
  </executions>  
  </plugin>  
  </plugins>  
  </build>  
</project>  

以下是我用来部署该功能的命令:

fabric:version-create 1.1 fabric:profile-create --parent jboss-fuse-full fuse-poc fabric:profile-edit --repository mvn:com.myorg.fuse/feature/1.0.0-SNAPSHOT/xml/features fuse-poc 1.1

fabric:profile-edit --feature fuse-poc-camel fuse-poc 1.1 fabric:profile-edit --feature fuse-poc-activemq fuse-poc 1.1

fabric:container-upgrade 1.1 root fabric:container-add-profile root fuse-poc

在我手动执行 osgi:refresh <bundle id> 捆绑后,它开始正常。

fabric:container-remove-profile root fuse-poc

所有配置 pid 条目都保留在配置中,所有 osgi 包也保持安装状态。我如何正确地取消部署工件,以便容器是干净的,并且可以部署同一工件的更新版本而没有副作用?

我怀疑我做的事情在概念上是错误的,因为最终上述问题会导致以下问题:如果我将 属性 添加到 features 中的元素或 .cfg 文件并安装项目再次使用 maven,然后执行 container-remove-profile、profile-refresh 和 container-add-profile,配置根本没有改变。如果我在控制台中对我的 pid 手动执行 config:delete 命令,它只能正确重新部署。

所以我终于有时间深入研究源代码并交叉引用 karaf、fabric 和 jboss 文档。
它是这样工作的:

  • 通过功能存储库系统负责 loading/unloading 捆绑包的代码位于 fabric-agent-1.2。0.redhat-621084.jar
  • 值得注意的是,class io.fabric8.agent.service.FeatureConfigInstaller 负责配置条目,class io.fabric8.agent.service.Agent 负责整体部署
  • 根本没有卸载配置 file/remove 配置条目的代码。这使得使用 SNAPSHOT 进行开发很麻烦
  • 但是,可以在 <configfile> 元素上指定一个有用的 'override' 属性 - 如果将其设置为 true,配置 PID 文件将在部署时被覆盖这正是我想要的本地开发
  • 对于 <config> 元素,有一个未记录的 'append' 属性,当设置为 true 时,应该将新条目附加到配置中。然而,它被搞笑地窃听了——事实证明,它在尝试追加时也会删除所有已定义的先前存在的属性。结论 - 使用 <configfile> 功能代替
  • 此外,对于外部化环境配置,我得出的结论是最简单的方法是通过不同的 Maven 构建配置文件从同一文件生成多个功能 xml 描述符。因此项目文件如下所示:

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.myorg.fuse</groupId>
        <artifactId>fuse-poc-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>feature</artifactId>
    <packaging>pom</packaging>


    <name>FUSE PoC Feature Repository</name>

    <properties>
        <build.environment>dev</build.environment>
    </properties>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>filter</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>resources</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <id>attach-artifacts</id>
                        <phase>package</phase>
                        <goals>
                            <goal>attach-artifact</goal>
                        </goals>
                        <configuration>
                            <artifacts>
                                <artifact>
                                    <file>target/classes/fuse-poc.xml</file>
                                    <type>xml</type>
                                    <classifier>features-${build.environment}</classifier>
                                </artifact>
                                <artifact>
                                    <file>src/main/resources/env/${build.environment}/com.myorg.fuse.poc.cfg</file>
                                    <type>cfg</type>
                                    <classifier>${build.environment}</classifier>
                                </artifact>
                            </artifacts>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>local</id>
            <properties>
                <build.environment>local-dev</build.environment>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <properties>
                <build.environment>dev</build.environment>
            </properties>
        </profile>      
        <profile>
            <id>uat</id>
            <properties>
                <build.environment>uat</build.environment>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <build.environment>prod</build.environment>
            </properties>
        </profile>      
    </profiles>
</project>

feature.xml:

<?xml version="1.0" encoding="UTF-8"?>
<features name="fuse-poc">
    <feature name="fuse-poc-common" version="${project.version}">
        <bundle>mvn:com.myorg.fuse/common/${project.version}</bundle>
    </feature>
    <feature name="fuse-poc-camel" version="${project.version}">
        <feature>fuse-poc-common</feature>
        <configfile finalname="etc/com.myorg.fuse.poc.cfg" override="true">
            mvn:com.myorg.fuse/feature/${project.version}/cfg/${build.environment}
        </configfile>
        <bundle>mvn:com.myorg.fuse/fuse-poc-camel/${project.version}</bundle>
    </feature>
</features>

这样您可以在创建用于部署功能的配置文件时直接指定环境:

fabric:profile-create --parent jboss-fuse-full fuse-poc fabric:profile-edit --repository mvn:com.myorg.fuse/feature/1.0.0-SNAPSHOT/xml/features-local-dev fuse-poc

注意设置构建集成工具为除'local-dev'之外的所有配置文件构建功能模块,因为开发者需要在本地使用,不应从中央存储库下载

最后一点,一旦我解决了配置处理问题并且捆绑包开始正确部署,平台也会在从容器中删除配置文件时开始正确取消部署捆绑包。我怀疑每当原始部署以失败告终时卸载捆绑包存在一些问题