【问题标题】:Configure SQL datasource through properties in Camel Blueprint (within Karaf)通过 Camel 蓝图中的属性配置 SQL 数据源(在 Karaf 内)
【发布时间】:2023-03-16 07:35:02
【问题描述】:

给定一个使用camel-archetype-blueprint 生成的非常简单的Karaf Camel 包,我想添加一个通过属性配置的数据源,而不是在blueprint.xml 中。

我尝试配置PropertiesComponent 并以各种方式访问​​MySQL 数据源的property 值内的属性,但似乎都不起作用。但是,在记录消息时,可以访问这些属性。

如何使用属性文件中的参数值配置数据源?

我特别需要它来为多个捆绑包使用相同的数据源配置并区分生产/测试环境。我考虑在构建期间使用 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>

只是为了概览,项目布局如下所示:

【问题讨论】:

  • 您能否尝试将您的 config.properties 文件放在 src/main/resource 下的一个文件夹中
  • 你不是需要放置你的属性文件的FOLDER子么。您正在使用 OSGI,所以这个文件夹可能已经被扫描,但如果它只是 Spring,您需要将文件夹放入该文件。
  • 试试
  • 也将 ${mysqlUser} 替换为 {{mysqlUser}}

标签: java apache-camel datasource apache-karaf blueprint


【解决方案1】:

a) 包含 xml 和 bundle 属性的数据源

您可以使用捆绑属性。下面的示例可选地使用 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-feature(可选)

可以使用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 之类的东西。

【讨论】:

  • 很好的答案,谢谢!选项 2 看起来很有希望,但是否也可以创建骆驼SqlComponent 并使其使用 OSGi 数据源?
  • 我会想象这样的事情,不幸的是它不起作用:&lt;property name="dataSource" ref="osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysql)" /&gt;
  • 你需要声明一个蓝图reference在这里看一个例子github.com/apache/servicemix/blob/master/examples/camel/…
  • 太棒了,作品。非常感谢! (可以在6小时内奖励赏金,并会给你)
  • 谢谢!,我已经更新了答案以包含 camel-sql 数据源参考(供未来的访问者使用)
【解决方案2】:

您好,我可以看到两件事。第一个是您没有说配置文件驻留在类路径中的哪个文件夹中。除非尚未扫描 OSGI-INF 文件夹,否则您应该有:

第二件事是关于如何引用属性。除非另有定义,否则属性 prefixTokensuffixToken 默认为 "{{""}}" http://camel.apache.org/properties.html

这意味着您需要将您的 ${mysqlUser} 替换为 {{mysqlUser}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2015-06-20
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多