从Mule 3.5.0 ESB中的存储过程调用获取返回值

时间:2014-09-20 15:54:28

标签: sql-server-2005 stored-procedures mule

使用Mule CE 3.5.0& SQL Server 2005.

我尝试使用新的Mule连接器调用存储过程db:generic-config& db:stored-procedure然后从存储过程中检索返回值。

出于某种原因,我无法让Mule从存储过程中检索返回值。

以下是示例存储过程代码

CREATE PROCEDURE dbo.sp_AddConnection (@pUserName varchar(30),   
                                       @pPassword varchar(30),   
                                       @opConnectionID bigint OUTPUT)  
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @rc int;

  SET @opConnectionID = 0;

  ....
  --If login is good then 
  --SET @rc = 0
  --SET @opConnectionID = new ConnectionID from Connection table

  --If login is bad then 
  --SET @rc = 1
  --SET @opConnectionID = 0

  ....

  SET NOCOUNT OFF;
  RETURN(@rc);
END;

以下Mule代码用于检索ConnectionID输出参数。

<db:generic-config  name="MSSQL" 
                    url="jdbc:sqlserver://local:1433;user=username;password=password;applicationName=Mule-ESB;databaseName=db1;" 
                    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
                    doc:name="Generic Database Configuration"/>

<flow name="jdbctestFlow1" doc:name="jdbctestFlow1">
    <quartz:inbound-endpoint    jobName="CronJobSchedule" 
                                doc:name="Quartz"
                                repeatInterval="0" 
                                responseTimeout="10000" 
                        cronExpression="00 29 01 ? * *"> <!-- Change as necessary --->                  
        <quartz:event-generator-job/>              
    </quartz:inbound-endpoint>
    <db:stored-procedure config-ref="MSSQL" doc:name="Database">
        <db:parameterized-query><![CDATA[{ CALL dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID) }]]></db:parameterized-query>
        <db:in-param name="pEmail" type="VARCHAR" value="user1"/>
        <db:in-param name="pPassword" type="VARCHAR" value="1234"/>
        <db:inout-param name="opConnectionID" type="BIGINT" value="0"/>                        
    </db:stored-procedure>
    <logger message="opConnectionID = #[message.payload['opConnectionID']]" level="INFO" doc:name="Logger"/>
</flow>  

上面的Mule流程可行,我可以 我可以使用#[message.payload['opConnectionID']]获取ConnectionID输出变量。

接下来我更改了db:stored-procedure元素以尝试获取返回值。

<flow name="jdbctestFlow1" doc:name="jdbctestFlow1">
    <quartz:inbound-endpoint    jobName="CronJobSchedule" 
                                doc:name="Quartz"
                                repeatInterval="0" 
                                responseTimeout="10000" 
                        cronExpression="00 29 01 ? * *"> <!-- Change as necessary --->                  
        <quartz:event-generator-job/>              
    </quartz:inbound-endpoint>
    <db:stored-procedure config-ref="MSSQL" doc:name="Database">
        <db:parameterized-query><![CDATA[{ CALL :returnValue = dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID) }]]></db:parameterized-query>
        <db:out-param name="returnValue" type="INTEGER"/>
        <db:in-param name="pEmail" type="VARCHAR" value="user1"/>
        <db:in-param name="pPassword" type="VARCHAR" value="1234"/>
        <db:inout-param name="opConnectionID" type="BIGINT" value="0"/>                        
    </db:stored-procedure>
    <logger message="Finish SP call" level="INFO" doc:name="Logger"/> <!-- doens't make it here -->
    <logger message="opConnectionID = #[message.payload['opConnectionID']]" level="INFO" doc:name="Logger"/>
    <logger message="returnValue = #[message.payload['returnValue']]" level="INFO" doc:name="Logger"/>
</flow> 

Mule抛出以下错误,

********************************************************************************
Message               : Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException). Message payload is of type: NullPayload
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException)
  java.util.LinkedList:-1 (null)
2. Index: 5, Size: 5 (java.lang.IndexOutOfBoundsException). Message payload is of type: NullPayload (org.mule.api.MessagingException)
  org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:32 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
    at java.util.LinkedList.checkElementIndex(Unknown Source)
    at java.util.LinkedList.get(Unknown Source)
    at org.mule.module.db.internal.domain.executor.AbstractExecutor.doProcessParameters(AbstractExecutor.java:51)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************  

我认为这可能是Mule CE vs Mule EE的事情,但我在参考文档中没有看到任何内容,说这个功能仅在Mule EE中可用。

也许我只是错误地调用db:stored-procedure。

任何指出我正确方向的线索都将受到赞赏 提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为问题在于您没有在存储过程中定义参数returnValue。

你应该有这样的东西:

CREATE PROCEDURE dbo.sp_AddConnection (@pUserName varchar(30),   
                                       @pPassword varchar(30),   
                                       @opConnectionID bigint OUTPUT,
                                       @returnValue int OUTPUT) 

以及参数化查询:

<db:parameterized-query><![CDATA[{ CALL :returnValue = dbo.sp_Add_Connection(:pUserName, :pPassword, :opConnectionID, :returnValue) }]]></db:parameterized-query>