Spring Integration日志消息不是顺序的

时间:2017-07-24 11:34:31

标签: spring-integration

我们在项目中使用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]

1 个答案:

答案 0 :(得分:0)

通过将生成动态数据源的java类作为线程安全

来修复数据源问题