0

我有一个数据源作为全局元素,是否可以从 Java 组件中引用它。我正在使用 Mule 3.4 版本

4

2 回答 2

3

如果可以的话,我会使用 setter 注入:

<component>
  <singleton-object class="SomeJavaComponent">
    <property key="dataSource" value-ref="jdbcDataSource"/>
  </singleton-object>
</component>

在您的组件中定义的 setter 类似于以下内容: private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource
}

或者,这不是最好的方法,但您可以从注册表中获取它:

this.muleContext.getRegistry.lookupObject("jdbcDataSource");
于 2013-08-14T13:40:12.577 回答
-1

那么实际上这不是正确的答案。没有像 DataSource 这样的动物。这是一个工作(测试)示例,Mule 3.5,独立的 Mule CE 3.4.1:

<component doc:name="callDynamicQuery">
    <singleton-object class="org.fiuze.trasnsformers.DynamicSql">
        <property key="dataSource" value="null" value-ref="MySqlDataConnector"/>
    </singleton-object>
 </component>

请注意,MySqlDataConnector 是 jdbc:mysql-data-source (jdbc-ee:mysql-data-source) 而不是 jdbc:connector (jdbc-ee:connector)。

java类是这样的:

package org.fiuze.trasnsformers;

import java.sql.SQLException;

import org.enhydra.jdbc.standard.StandardDataSource;

import java.sql.Connection;


public class DynamicSql {

    private StandardDataSource dataSource;

    public StandardDataSource getConn() {
        return dataSource;
    }

    public void setConn(StandardDataSource conn) {
        this.dataSource = conn;
    }

    public void callSql(String sql) throws SQLException {
        Connection connection = this.dataSource.getConnection(); 
        try {
            connection.prepareStatement(sql).execute();
        } catch (SQLException sqlE) {
            connection.close();
            throw new SQLException(sqlE);
        } finally {
            connection.close();
        }
    }
}

只要您的示例具有有效的数据源,此示例就可以工作。

当我尝试上述答案时,Mule 没有初始化属性,因为没有合适的类。

鉴于我将其部署到生产中,我正在扩展上述答案。Studio CE 中的自动装配功能似乎没有选择数据源。不要让你失望,让你像我一样花几个小时,这是你的解决方案:

package org.fiuze.trasnsformers;

import java.sql.SQLException;
import org.enhydra.jdbc.standard.StandardDataSource;
import org.mule.api.MuleContext;
import org.mule.api.annotations.expressions.Lookup;
import org.mule.api.context.MuleContextAware;

import java.sql.Connection;




public class DynamicSql implements MuleContextAware {

    @Lookup
    private MuleContext muleContext;
    private StandardDataSource dataSource;

    public StandardDataSource getConn() {
        return dataSource;
    }

    public void setConn(StandardDataSource conn) {
        this.dataSource = conn;
    }

    public void callSql(String sql) throws SQLException {
        if (this.dataSource == null) {
            this.dataSource = this.muleContext.getRegistry().lookupObject("MySqlDataConnector");
        }
        Connection connection = this.dataSource.getConnection(); 
        try {
            connection.prepareStatement(sql).execute();
        } catch (SQLException sqlE) {
            connection.close();
            throw new SQLException(sqlE);
        } finally {
            connection.close();
        }
    }

    @Override
    public void setMuleContext(MuleContext context) {
        this.muleContext = context;

    }

}

主要思想是我们可以使用 MuleContext 并从那里获取它。通过一个简单的注释来查看拉上下文的优雅方式。这部署和工作。

最后,您现在可以简化代码。如果你有 EE,你可能不需要在上下文中加载,你的 DynamicSql 类将是轻量级的。如果你计算你的硬币,并在 CE 上运行,你仍然可以做到。带着一点点汗水。

于 2014-11-26T02:35:19.557 回答