Reputation: 1391
I am using Spring Integration framework in my project. The database is db2 running on AS400. I have to call two stored procedures one after another. My first stored procedure is executed without any issues and passing the message to the second stored-proc-outbound-gateway. Here, weird thing is happening. It appears that the second stored procedure is executed successfully, but strangely the the second stored-proc-outbound-gateway is not producing any reply message.
The following are the log statements after I connect to SQL server:
[org.springframework.jdbc.core.JdbcTemplate.doInCallableStatement] CallableStatement.execute() returned 'true'
[org.springframework.jdbc.core.JdbcTemplate.doInCallableStatement] CallableStatement.getUpdateCount() returned -1
[org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults] CallableStatement.getUpdateCount() returned 1
[org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults] CallableStatement.getUpdateCount() returned -1
The same statements are different when I connect to db2:
DEBUG [org.springframework.jdbc.core.JdbcTemplate.doInCallableStatement] CallableStatement.execute() returned 'false'
DEBUG [org.springframework.jdbc.core.JdbcTemplate.doInCallableStatement] CallableStatement.getUpdateCount() returned 0
DEBUG [org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults] CallableStatement.getUpdateCount() returned -1
Can any one please say what's wrong here? Please feel free to ask me if you need any additional info.
Here is the complete spring-integration file for your reference:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:int-xml="http://www.springframework.org/schema/integration/xml"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:int-http="http://www.springframework.org/schema/integration/http"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/xml
http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/integration/jdbc
http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd
http://www.springframework.org/schema/integration/http
http://www.springframework.org/schema/integration/http/spring-integration-http.xsd ">
<int:channel id="PQPutUserBAInformation-InputChannel" />
<int:chain input-channel="PQPutUserBAInformation-InputChannel" output-channel="PQPutUserBAInformation-SetDateTag" >
<!-- Transformer to transform the resultXml to the user understandable form using XSLT -->
<int-xml:xslt-transformer xsl-resource="${stylesheet.PQPutUserBAInformationSetDateTag}" />
</int:chain>
<int:chain input-channel="PQPutUserBAInformation-SetDateTag" output-channel="PQPutUserBAInformation-SPCall" >
<!-- Split the Search Request Params from Xml -->
<int-xml:xpath-splitter>
<int-xml:xpath-expression expression="//AWDPQContactID" namespace-map="xmlMessageNamespace" />
</int-xml:xpath-splitter>
<!-- Store the original payload in header for future purpose -->
<int:header-enricher default-overwrite="true" should-skip-nulls="true" >
<int:header name="${headerNames.originalPayload}" expression="payload" />
</int:header-enricher>
</int:chain>
<!-- PQPutUserBAInformation Channel -->
<int:channel id="PQPutUserBAInformation-SPCall" />
<int:chain input-channel="PQPutUserBAInformation-SPCall" output-channel="PQPutUserBAInformation-SPCallStage1-Response" >
<int:service-activator ref="msgHandler" method="buildRequestBasedDataSource" />
<int-jdbc:stored-proc-outbound-gateway
id="PQPutUserBAInformation-AWD-StoredProcedure"
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="ZSPPQDELETEUSERIDBA"
skip-undeclared-results="true"
ignore-column-meta-data="true"
use-payload-as-parameter-source = "false"
expect-single-result="true" >
<int-jdbc:sql-parameter-definition name="P_USERID" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_BUSINESSAREA" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_USERID" expression="#xpath(payload, '//CurrentUserID')" />
<int-jdbc:parameter name="P_BUSINESSAREA" expression="#xpath(payload, '//SelectedBusinessArea/Code')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
</int:chain>
<!-- Service Activator to build the Message from the Stored Procedure ResultSet -->
<int:channel id="PQPutUserBAInformation-SPCallStage1-Response" />
<int:service-activator input-channel="PQPutUserBAInformation-SPCallStage1-Response"
output-channel="PQPutUserBAInformation-SPCall2-Translate"
ref="msgHandler"
method="buildMessageFromExtSysResponse" />
<!-- Service Activator to build the Message from the Stored Procedure ResultSet -->
<int:channel id="PQPutUserBAInformation-SPCall2-Translate" />
<int:service-activator input-channel="PQPutUserBAInformation-SPCall2-Translate"
output-channel="PQPutUserBAInformation-SPCall2"
ref="cacheRequestHandler"
method="translatePassword" />
<!-- PQPutUserBAInformation Channel -->
<int:channel id="PQPutUserBAInformation-SPCall2" />
<int:chain input-channel="PQPutUserBAInformation-SPCall2" output-channel="PQPutUserBAInformation-SPCallStage2-Response" >
<int:service-activator ref="msgHandler" method="buildRequestBasedDataSource" />
<int-jdbc:stored-proc-outbound-gateway
id="PQPutUserBAInformation-AWD-StoredProcedure2"
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="ZSPPQINSERTUSERIDBA"
skip-undeclared-results="true"
ignore-column-meta-data="true"
use-payload-as-parameter-source = "false"
expect-single-result="true" >
<int-jdbc:sql-parameter-definition name="P_USERID" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_BUSINESSAREA" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_SELECTEDIND" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_DEFAULTIND" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_LEGACYSYSTEM" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_LEGACYLOGIN" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_LEGACYPASSWORD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_OTHERLOGIN" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_OTHERPASSWORD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ADDSECURLOGIN" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ADDSECURPASSWORD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_LASTUPDATEUSERID" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_LASTUPDATE" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_USERID" expression="#xpath(payload, '//CurrentUserID')" />
<int-jdbc:parameter name="P_BUSINESSAREA" expression="#xpath(payload, '//SelectedBusinessArea/Code')" />
<int-jdbc:parameter name="P_SELECTEDIND" expression="#xpath(payload, '//SelectedBusinessArea/Selected')" />
<int-jdbc:parameter name="P_DEFAULTIND" expression="#xpath(payload, '//SelectedBusinessArea/Default')" />
<int-jdbc:parameter name="P_LEGACYSYSTEM" expression="#xpath(payload, '//SelectedBusinessArea/LegacySystem')" />
<int-jdbc:parameter name="P_LEGACYLOGIN" expression="#xpath(payload, '//SelectedBusinessArea/LegacyLogin')" />
<int-jdbc:parameter name="P_LEGACYPASSWORD" expression="headers.LegacyPassword" />
<int-jdbc:parameter name="P_OTHERLOGIN" expression="#xpath(payload, '//SelectedBusinessArea/OtherLogin')" />
<int-jdbc:parameter name="P_OTHERPASSWORD" expression="headers.otherPassword" />
<int-jdbc:parameter name="P_ADDSECURLOGIN" expression="#xpath(payload, '//SelectedBusinessArea/AddSecurLogin')" />
<int-jdbc:parameter name="P_ADDSECURPASSWORD" expression="headers.addSecurPassword" />
<int-jdbc:parameter name="P_LASTUPDATEUSERID" expression="#xpath(payload, '//userID')" />
<int-jdbc:parameter name="P_LASTUPDATE" expression="#xpath(payload, '//dateTimeStamp')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
</int:chain>
<!-- Service Activator to build the Message from the Stored Procedure ResultSet -->
<int:channel id="PQPutUserBAInformation-SPCallStage2-Response" />
<int:service-activator input-channel="PQPutUserBAInformation-SPCallStage2-Response"
output-channel="PQPutUserBAInformation-Enrich-SPCallStage2"
ref="msgHandler"
method="buildMessageFromExtSysResponse" />
<!-- Service Activator to build the jobResponse xml making use of jobRequestXml and xlst transformed xml-->
<int:channel id="PQPutUserBAInformation-Enrich-SPCallStage2" />
<int:service-activator input-channel="PQPutUserBAInformation-Enrich-SPCallStage2"
output-channel="PQPutUserBAInformation-CleanUp"
ref="msgHandler"
method="enrichPayloadXml" />
<int:chain input-channel="PQPutUserBAInformation-CleanUp" >
<!-- Transformer to transform the resultXml to the user understandable form using XSLT -->
<int-xml:xslt-transformer xsl-resource="${stylesheet.PQPutUserBAInformationCleanUp}" />
</int:chain>
</beans>
Upvotes: 0
Views: 1676
Reputation: 161
I got the same problem, and I fixed it, the exception means the transform step returns null(shouldn't be null) because the message I created cant be properly transformed. Try to debug into the transform step, and see what is the outcome. the exception happened in my second line:
IntegrationFlows.from(testChannel() )
.transform( new ObjectTransformer() )
.<Object, Class<?>>route(Object::getClass,
Upvotes: 1