我有一个数据源作为全局元素,是否可以从 Java 组件中引用它。我正在使用 Mule 3.4 版本
2 回答
如果可以的话,我会使用 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");
那么实际上这不是正确的答案。没有像 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 上运行,你仍然可以做到。带着一点点汗水。