2
返回值使用騾子CE 3.5.0 & SQL Server 2005的從存儲過程調用獲取騾子3.5.0 ESB
我試圖使用新的騾子連接器分貝調用存儲過程:仿製配置& db:存儲過程,然後從存儲過程中檢索返回值。
由於某些原因,我無法讓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;
以下騾代碼工作以檢索的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>
以上騾子流作品,我可以 我可以#[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>
騾子引發以下錯誤,
********************************************************************************
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)
********************************************************************************
我想它可能是一個騾子CE VS騾子EE的事情,但我沒有看到任何的參考文檔說這個功能僅可在Mule EE中找到。
也可能是我只是不正確地調用db:stored-procedure。
任何線索指向我在正確的方向將不勝感激。
在此先感謝。
從MS SQL Server存儲過程可以返回一個狀態代碼,是不是在參數列表中。通過閱讀各種網站和Mulesoft的Github(?),看起來這是一個將在未來版本中修復的問題。 – KPB 2014-09-23 21:44:07