【问题标题】:Mule ESB, "IN" operator within a JDBC transformerMule ESB,JDBC 转换器中的“IN”运算符
【发布时间】:2014-02-28 19:44:34
【问题描述】:

让我们想象一下我想将一个列表传递给一个 JDBC 转换器。

例如,我在流程中创建列表:

<scripting:transformer><scripting:script engine="groovy"><scripting:text>
    // Some calculations and stuff

    def single_quote_alias = "'"
    def listString = seasonMbIds.join("',' ")           
    return single_quote_alias + listString + single_quote_alias // now it's like:  '11','22','33' 
</scripting:text></scripting:script></scripting:transformer>

然后将列表传递给另一个转换器:

<jdbc:outbound-endpoint connector-ref="XYZ" queryKey="someName" exchange-pattern="request-response" />

这是实际的查询:

<jdbc:query key="someName" 
                value="SELECT anID FROM aTable WHERE aField IN (#[payload:])" />

它给了我“超出范围的索引异常”:

Message               : java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Index: 0, Size: 0 (java.lang.IndexOutOfBoundsException)
  java.util.ArrayList:635 (null)
2. java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)

可能有一些转义问题。我使用了不同的分隔符,问题仍然存在......

有什么建议吗?

【问题讨论】:

  • 顺便说一句,您使用的是什么版本?我看到 #[payload:] 所以我在想 3.2 或更高版本?否则就是#[message.payload]...
  • "3.3.1 企业版" ...
  • 顺便说一句,我制作了一个自定义转换器(在 Java 中)来解析该查询字符串并对其进行处理。我不太清楚为什么 IN 运算符不起作用
  • 这是一个脚本错误,而不是 JDBC 错误:您确定 seasonMbIds 包含某些内容吗?这个.join("',' ") 也会产生'11',' 22',' 33'。最后,您是 EE 用户,因此您应该使用 JDBC EE 连接器,它比 CE 连接器更强大。还可以考虑联系 MuleSoft 专业支持,因为您使用的是 EE。
  • join 中的那个空格是 stackoverflow 编辑器中的拼写错误。是的,seasonMbIds 是一个包含元素的普通列表。我正在使用带有 EE 连接器的 JDBC。尽管如此,我还是以其他形式解决了它。现在无需致电支持。非常感谢您的回答和关注:)

标签: java mule esb mule-el


【解决方案1】:

由于查询格式化选项有限,将 Mule 用于更高级的 JDBC 内容可能非常非常痛苦。我知道您有两个选择:1)编写一个使用您的 jdbc 连接器执行查询的脚本,或者 2)为您的 jdbc 连接器定义一个自定义查询策略。这是一个简单的技巧,您可以使用它使单个查询与选项 2 一起使用(尽管会破坏所有其他选择查询...):

包括您的自定义 Java 类:

<jdbc:connector name="Database" dataSource-ref="MySQL_Data_Source" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database">
    <jdbc:sqlStatementStrategyFactory class="org.mule.transport.jdbc.sqlstrategy.MySqlStatementStrategyFactory"/>
</jdbc:connector>

编写您的自定义工厂 Java 类:

package org.mule.transport.jdbc.sqlstrategy;

public class MySqlStatementStrategyFactory extends DefaultSqlStatementStrategyFactory {

  public MySqlStatementStrategyFactory()
  {
    super();
    selectSQLStrategy = new MySelectSqlStatementStrategy();
  }

}

创建你的策略类并从here复制默认选择策略的源代码

替换复制源代码中的类定义:

public  class MySelectSqlStatementStrategy extends SelectSqlStatementStrategy

找到创建查询结果的两行并替换为您自己的实现,例如:

result = connector.getQueryRunnerFor(endpoint).query(connection, readStmt.replace("?", (String)params[0]),
      connector.getResultSetHandler());

【讨论】:

  • 感谢@Anton.. 我制作了一个自定义转换器(在 Java 中)来解析该查询字符串并对其进行处理..
猜你喜欢
  • 2015-07-16
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2014-07-03
相关资源
最近更新 更多