我们在项目中使用spring-integration 4和jboss-eap 6.4。解释和理解这个问题有点复杂。我请你忍受我。我们在多个文件中添加了spring集成组件(我们称之为作业),并按如下所示加载所有文件:
<import resource="spring-integration/Jobs/*.xml"/>
我们添加了一个路由器,根据作业名称将消息路由到特定频道:
<int:chain input-channel="multipartMessageChannel" >
<int:router expression="${routing.jobChannel}"/>
</int:chain>
我们在应用程序中配置了多个数据源,以确保某些作业只应使用特定数据和其他一些不同的数据源。我们通过扩展org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
和实施org.springframework.context.ApplicationContextAware
来实现这一目标。
在我们的一项工作中,我们配置了chain
,如下所示:
<int:channel id="PQContactHistory-fetch-cases-Count"/>
<!-- Get Cases count based on the FOLDTYPE and FOLDERID -->
<int:chain input-channel="PQContactHistory-fetch-cases-Count" output-channel="PQContactHistory-fetch-cases-sources-Channel">
<int:service-activator ref="msgHandler" method="buildRequestBasedDataSource" />
<int:header-enricher default-overwrite="true" should-skip-nulls="true" >
<int:header name="responseWithoutCount" expression="payload" />
</int:header-enricher>
<int-jdbc:stored-proc-outbound-gateway
id="PQContactHistory-StoredProcedure-CaseCount"
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="ZSPPQFOLDCALLISSLKPCOUNT"
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_FOLDERID" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_UNITCD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_FOLDTYPE" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_BCRDATTIM" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ECRDATTIM" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_FOLDERID" expression="#xpath(payload, '//folderId')" />
<int-jdbc:parameter name="P_UNITCD" expression="#xpath(payload, '//businessArea')" />
<int-jdbc:parameter name="P_FOLDTYPE" expression="#xpath(payload, '//foldType')" />
<int-jdbc:parameter name="P_BCRDATTIM" expression="#xpath(payload, '//fromDate')" />
<int-jdbc:parameter name="P_ECRDATTIM" expression="#xpath(payload, '//toDate')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
<int:service-activator ref="msgHandler" method="buildMessageFromExtSysResponse" />
<int-xml:xpath-splitter iterator="false">
<int-xml:xpath-expression expression="//COUNT"/>
</int-xml:xpath-splitter>
<int:service-activator ref="msgHandler" method="addCountToResponse" />
<int:header-enricher default-overwrite="true" should-skip-nulls="true" >
<int:header name="${headerNames.originalPayloadDuplicate}" expression="payload" />
</int:header-enricher>
</int:chain>
同样地,我在不同的工作中有更多chain
个组件。 data-source
的值由服务激活器管理。在上面的链组件中,数据源值应为&#34; awd&#34; (buildRequestBasedDataSource
之前的服务激活方法stored-proc-outbound-gateway
正在返回正确的数据源,即&#34; awd&#34;根据我们的配置。我通过调试java代码确认了这一点。
奇怪的是,弹簧集成分配给上述data-source
的{{1}}值不是&#34; awd&#34;事实上。我通过查看日志文件确认了它。还有一件事是,我可以在其他链组件中看到与上述stored-proc-outbound-gateway
的存储过程ZSPPQFOLDCALLISSLKPCOUNT
相关的信息,但不能在上面的链stored-proc-outbound-gateway
内看到。请记住,我们的应用程序中没有重复使用存储过程或链名称。
为什么日志文件包含错误位置的存储过程信息?
为什么存储过程无法获取正确的数据源?
是因为Jboss连接池问题还是Spring集成问题?
以下是一些日志文件:
预先发送频道&#39; PQClaimSearch-XsltTransformOutputChannel&#39;,message:GenericMessage [payload =
ZSPPQFOLDCALLISSLKPCOUNT(?,?,?,?,?)} {P_UNITCD = CS2XSTEPP,P_BCRDATTIM = 0000-00-00-00:00:00.000000,P_ECRDATTIM = 9999-99-99 99:99 :99.999999,P_FOLDERID = SUZMEM101,P_FOLDTYPE = MEMBER} 23:14:31,667 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,667 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal]以下参数用于call {用{P_UNITCD = CS2XSTEPP,P_BCRDATTIM = 0000-00-00-00:00:00.000000,P_ECRDATTIM = 9999-99-99 99:99:99.999999,P_FOLDERID = SUZMEM101调用ZSPPQFOLDCALLISSLKPCOUNT(?,?,?,?,?)} ,P_FOLDTYPE =会员}
23:14:31,668 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)1:rowMapper,SQL type 0,type name null,parameter class [org .springframework.jdbc.core.SqlReturnResultSet] 23:14:31,669 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,668 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 1:rowMapper,SQL type 0, type name null,参数类[org.springframework.jdbc.core.SqlReturnResultSet]
23:14:31,670 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)2:P_FOLDERID,SQL类型12,类型名称null,参数类[org .springframework.jdbc.core.SqlParameter] 23:14:31,671 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,670 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 2:P_FOLDERID,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,672 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)3:P_UNITCD,SQL类型12,类型名称null,参数类[org .springframework.jdbc.core.SqlParameter] 23:14:31,673 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,672 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 3:P_UNITCD,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,674 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)4:P_FOLDTYPE,SQL类型12,类型名称null,参数类[org .springframework.jdbc.core.SqlParameter] 23:14:31,675 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,674 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 4:P_FOLDTYPE,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,676 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)5:P_BCRDATTIM,SQL type 12,type name null,parameter class [org .springframework.jdbc.core.SqlParameter] 23:14:31,677 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,676 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 5:P_BCRDATTIM,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,678 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-4)6:P_ECRDATTIM,SQL类型12,类型名称null,参数类[org .springframework.jdbc.core.SqlParameter] 23:14:31,679 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,678 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 6:P_ECRDATTIM,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,680 DEBUG [org.springframework.jdbc.core.JdbcTemplate](http- / 0.0.0.0:8080-4)调用存储过程[{call ZSPPQFOLDCALLISSLKPCOUNT(?,?,?,?,?) }] 23:14:31,681 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,680 DEBUG [org.springframework.jdbc.core.JdbcTemplate.execute]调用存储过程[{call ZSPPQFOLDCALLISSLKPCOUNT(?, ?,?,?,?)}]
23:14:31,681 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils](http- / 0.0.0.0:8080-4)从DataSource获取JDBC连接 23:14:31,682 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,681 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection]从DataSource获取JDBC连接
23:14:31,683 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory](http- / 0.0.0.0:8080-4)返回单例bean的缓存实例&#39; powerstepp_cs2xstepp&#39; 23:14:31,684 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,683 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBean]返回单例bean的缓存实例&# 39; powerstepp_cs2xstepp&#39;
23:14:31,685 DEBUG [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool](http- / 0.0.0.0:8080-4)PowerSTEPP_CS2XSTEPP:getConnection(null,WrappedConnectionRequestInfo @ 5ffc3ffb [userName = POWERQD])[0/20] 23:14:31,686 INFO [stdout](http- / 0.0.0.0:8080-4)23:14:31,685 DEBUG [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool.getConnection] PowerSTEPP_CS2XSTEPP:getConnection( null,WrappedConnectionRequestInfo @ 5ffc3ffb [userName = POWERQD])[0/20]
23:14:31,721 DEBUG [org.springframework.jdbc.core.JdbcTemplate](http- / 0.0.0.0:8080-5)CallableStatement.getUpdateCount()返回-1 23:14:31,722 INFO [stdout](http- / 0.0.0.0:8080-5)23:14:31,721 DEBUG [org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults] CallableStatement.getUpdateCount()返回-1
23:14:31,723 DEBUG [org.springframework.jdbc.core.JdbcTemplate](http- / 0.0.0.0:8080-5)SQLWarning被忽略:SQL状态&#39; 0100C&#39;,错误代码&# 39; 466&#39;,消息[[SQL0466] 1个结果集可从* N中的过程PQELGENR获得。 23:14:31,723 INFO [stdout](http- / 0.0.0.0:8080-5)23:14:31,723 DEBUG [org.springframework.jdbc.core.JdbcTemplate.handleWarnings] SQLWarning被忽略:SQL状态&#39; 0100C& #39;,错误代码&#39; 466&#39;,消息[[SQL0466] 1个结果集可从* N中的过程PQELGENR获得。]
23:14:31,802 INFO [stdout](http- / 0.0.0.0:8080-2)23:14:31,587 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall.executeCallInternal] 2:P_USERID,SQL类型12,类型名称null,参数类[org.springframework.jdbc.core.SqlParameter]
23:14:31,803 DEBUG [org.springframework.jdbc.core.simple.SimpleJdbcCall](http- / 0.0.0.0:8080-2)3:P_FOLDERID,SQL类型12,类型名称null,参数类[org .springframework.jdbc.core.SqlParameter] 23:14:31,804 INFO [stdout](http- / 0.0.0.0:8080-3)23:14:31,596 DEBUG [org.springframework.integration.handler.MessageHandlerChain.handleMessage]
答案 0 :(得分:0)
通过将生成动态数据源的java类作为线程安全
来修复数据源问题