如何在 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'之外的所有配置文件构建功能模块,因为开发者需要在本地使用,不应从中央存储库下载
最后一点,一旦我解决了配置处理问题并且捆绑包开始正确部署,平台也会在从容器中删除配置文件时开始正确取消部署捆绑包。我怀疑每当原始部署以失败告终时卸载捆绑包存在一些问题
我正在尝试评估 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'之外的所有配置文件构建功能模块,因为开发者需要在本地使用,不应从中央存储库下载
最后一点,一旦我解决了配置处理问题并且捆绑包开始正确部署,平台也会在从容器中删除配置文件时开始正确取消部署捆绑包。我怀疑每当原始部署以失败告终时卸载捆绑包存在一些问题