通过 Camel Blueprint 中的属性配置 SQL 数据源(在 Karaf 中)
Configure SQL datasource through properties in Camel Blueprint (within Karaf)
鉴于使用 camel-archetype-blueprint
生成的非常简单的 Karaf Camel 包,我想添加一个通过属性配置的数据源,而不是在 blueprint.xml
.
中
我尝试配置 PropertiesComponent
并以各种方式访问 MySQL 数据源的 property
值内的 属性,但 none 似乎工作。但是,在记录消息时,可以访问这些属性。
如何使用属性文件中的参数值配置数据源?
我特别需要它来为多个包使用相同的数据源配置并区分 production/test 环境。我考虑过在构建期间使用 Maven 编写属性,具体取决于目标环境。关于如何解决此数据源问题,还有其他最佳实践吗?
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location" value="classpath:config.properties" />
</bean>
<bean id="dataSourceMySQL" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
<property name="url" value="jdbc:mysql://127.0.0.1/test_database" />
<!-- This causes an error, as it tries to connect with
`${mysqlUser}`@`localhost` without any evaluation -->
<property name="user" value="${mysqlUser}" />
<property name="password" value="${mysqlPassword}" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSourceMySQL">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mysqlDatasource" />
</service-properties>
</service>
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSourceMySQL" />
</bean>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route id="messageQuery">
<from uri="sql:SELECT * FROM messages" />
<log message="The user property is: {{mysqlUser}}, the query result is: ${body}" />
</route>
</camelContext>
</blueprint>
仅供概览,项目布局如下所示:
你好,我可以看到两件事。第一个是您没有说配置文件位于 class 路径中的哪个文件夹中。除非尚未扫描 OSGI-INF 文件夹,否则您应该:
第二件事是关于如何引用属性。除非另有定义,否则 属性 prefixToken 和 suffixToken 默认为 "{{" 和"}}"
http://camel.apache.org/properties.html
这意味着您需要将 ${mysqlUser} 替换为 {{mysqlUser}}
a) 与 xml 捆绑在一起的数据源和捆绑属性
您可以使用包属性。下面的示例可选地使用 etc/org.camel.demo.cfg
:
中的捆绑配置
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<!-- etc/org.camel.demo.cfg -->
<cm:property-placeholder persistent-id="org.camel.demo" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
<cm:default-properties>
<cm:property name="mysqlUser" value="root"/>
<cm:property name="mysqlPassword" value=""/>
</cm:default-properties>
</cm:property-placeholder>
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location" value="classpath:config.properties" />
</bean>
<bean id="dataSourceMySQL" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
<property name="url" value="jdbc:mysql://127.0.0.1/test_database" />
<property name="user" value="${mysqlUser}" />
<property name="password" value="${mysqlPassword}" />
</bean>
</blueprint>
b) 共享数据源
另一种选择是使用共享数据源。只需部署一个仅包含数据源的蓝图文件(下面的示例使用 postgres)。
您也可以将其与配置属性结合使用,如上所示。
提供 OSGi 服务
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<!-- use config properties if needed -->
<bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" destroy-method="close">
<property name="serverName" value=":"/>
<property name="user" value="postgres"/>
<property name="password" value="postgres"/>
<property name="dataSourceName" value="demo"/>
<property name="initialConnections" value="2"/>
<property name="maxConnections" value="4" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/demo"/>
</service-properties>
</service>
</blueprint>
从另一个包引用
然后您可以在您的包中查找数据源 osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/demo)
要在 SqlComponent
中使用此数据源,必须像这样创建引用:
<reference id="dataSource" interface="javax.sql.DataSource"
filter="(osgi.jndi.service.name=jdbc/mysql)">
</reference>
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSource" />
</bean>
使用persistence.xml
确保导入 org.demo.osgi.datasource.**
。这是 persistence.xml
:
的用法示例
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" >
<persistence-unit name="demo" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/demo)</jta-data-source>
<mapping-file>META-INF/foo.xml</mapping-file>
</persistence-unit>
</persistence>
c) 使用 jdbc-特征(可选)
可以使用 jdbc
功能创建和管理上面的 xml 文件。是否可用取决于您的版本:
JBossFuse:admin@545074693af1> features:install jdbc hibernate jndi
JBossFuse:admin@545074693af1> install mvn:org.postgresql/postgresql/9.4.1208
Bundle ID: 292
JBossFuse:admin@545074693af1> resolve 292
JBossFuse:admin@545074693af1> jdbc:create -t postgres -u postgres -p postgres -url ${postgres.addr}:${postgres.port} demo
P.S.: 如果您想从配置文件中删除明文密码,请使用类似 jasypt 的东西。
鉴于使用 camel-archetype-blueprint
生成的非常简单的 Karaf Camel 包,我想添加一个通过属性配置的数据源,而不是在 blueprint.xml
.
我尝试配置 PropertiesComponent
并以各种方式访问 MySQL 数据源的 property
值内的 属性,但 none 似乎工作。但是,在记录消息时,可以访问这些属性。
如何使用属性文件中的参数值配置数据源?
我特别需要它来为多个包使用相同的数据源配置并区分 production/test 环境。我考虑过在构建期间使用 Maven 编写属性,具体取决于目标环境。关于如何解决此数据源问题,还有其他最佳实践吗?
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location" value="classpath:config.properties" />
</bean>
<bean id="dataSourceMySQL" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
<property name="url" value="jdbc:mysql://127.0.0.1/test_database" />
<!-- This causes an error, as it tries to connect with
`${mysqlUser}`@`localhost` without any evaluation -->
<property name="user" value="${mysqlUser}" />
<property name="password" value="${mysqlPassword}" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSourceMySQL">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mysqlDatasource" />
</service-properties>
</service>
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSourceMySQL" />
</bean>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route id="messageQuery">
<from uri="sql:SELECT * FROM messages" />
<log message="The user property is: {{mysqlUser}}, the query result is: ${body}" />
</route>
</camelContext>
</blueprint>
仅供概览,项目布局如下所示:
你好,我可以看到两件事。第一个是您没有说配置文件位于 class 路径中的哪个文件夹中。除非尚未扫描 OSGI-INF 文件夹,否则您应该:
第二件事是关于如何引用属性。除非另有定义,否则 属性 prefixToken 和 suffixToken 默认为 "{{" 和"}}" http://camel.apache.org/properties.html
这意味着您需要将 ${mysqlUser} 替换为 {{mysqlUser}}
a) 与 xml 捆绑在一起的数据源和捆绑属性
您可以使用包属性。下面的示例可选地使用 etc/org.camel.demo.cfg
:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<!-- etc/org.camel.demo.cfg -->
<cm:property-placeholder persistent-id="org.camel.demo" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
<cm:default-properties>
<cm:property name="mysqlUser" value="root"/>
<cm:property name="mysqlPassword" value=""/>
</cm:default-properties>
</cm:property-placeholder>
<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location" value="classpath:config.properties" />
</bean>
<bean id="dataSourceMySQL" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
<property name="url" value="jdbc:mysql://127.0.0.1/test_database" />
<property name="user" value="${mysqlUser}" />
<property name="password" value="${mysqlPassword}" />
</bean>
</blueprint>
b) 共享数据源
另一种选择是使用共享数据源。只需部署一个仅包含数据源的蓝图文件(下面的示例使用 postgres)。
您也可以将其与配置属性结合使用,如上所示。
提供 OSGi 服务
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<!-- use config properties if needed -->
<bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" destroy-method="close">
<property name="serverName" value=":"/>
<property name="user" value="postgres"/>
<property name="password" value="postgres"/>
<property name="dataSourceName" value="demo"/>
<property name="initialConnections" value="2"/>
<property name="maxConnections" value="4" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/demo"/>
</service-properties>
</service>
</blueprint>
从另一个包引用
然后您可以在您的包中查找数据源 osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/demo)
要在 SqlComponent
中使用此数据源,必须像这样创建引用:
<reference id="dataSource" interface="javax.sql.DataSource"
filter="(osgi.jndi.service.name=jdbc/mysql)">
</reference>
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSource" />
</bean>
使用persistence.xml
确保导入 org.demo.osgi.datasource.**
。这是 persistence.xml
:
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" >
<persistence-unit name="demo" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/demo)</jta-data-source>
<mapping-file>META-INF/foo.xml</mapping-file>
</persistence-unit>
</persistence>
c) 使用 jdbc-特征(可选)
可以使用 jdbc
功能创建和管理上面的 xml 文件。是否可用取决于您的版本:
JBossFuse:admin@545074693af1> features:install jdbc hibernate jndi
JBossFuse:admin@545074693af1> install mvn:org.postgresql/postgresql/9.4.1208
Bundle ID: 292
JBossFuse:admin@545074693af1> resolve 292
JBossFuse:admin@545074693af1> jdbc:create -t postgres -u postgres -p postgres -url ${postgres.addr}:${postgres.port} demo
P.S.: 如果您想从配置文件中删除明文密码,请使用类似 jasypt 的东西。