当需要轮询器并且具有属性max-messages-per-poll时,具有入站通道适配器属性“ max-rows”有什么意义?

时间:2019-06-10 19:39:17

标签: spring-integration

int-jdbc:inbound-channel-adapter需要int:poller才能工作,两者都分别具有max-rows和max-messages-per-poll。

a)为什么入站通道适配器需要轮询器。为什么不能内置默认轮询器?

b)如果max-rows和max-messages-per-poll具有不同的值怎么办?

c)为什么在轮询和处理一组消息时poller(o.s.i.e.SourcePollingChannelAdapter)保持轮询(或尝试这样做)?

<int-jdbc:inbound-channel-adapter 
    query="${poller.deliveryLocator.dnd.get}"
    max-rows="${poller.deliveryLocator.dnd.maxRow}"
    row-mapper="deliveryLocatorPollerRowMapper" data-source="dataSource" 
    channel="deliveryLocatorChannel">
    <int:poller fixed-rate="500" time-unit="MILLISECONDS" max-messages-per-poll="${poller.deliveryLocator.dnd.maxRow}">
        <int:transactional />
    </int:poller>

</int-jdbc:inbound-channel-adapter>

对于问题“ c”,我确实为org.springframework设置了调试级别记录器,并通过在行映射器处设置断点来阻止了程序。

我注意到poller一直在轮询数据库(这些调试语句正在重复),但是它没有选择任何记录,因为inbound-channel-adapter被阻止了。

2019-06-10 15:16:29 [task-scheduler-1] DEBUG 
o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name 
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.orm.jpa.JpaTransactionManager - Opened new EntityManager [SessionImpl(1259297282<open>)] for JPA transaction
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.orm.jpa.JpaTransactionManager - Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@621f9b19]
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.jdbc.core.JdbcTemplate - Executing prepared SQL query
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.jdbc.core.JdbcTemplate - Executing prepared SQL statement
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.i.e.SourcePollingChannelAdapter - Received no Message during the poll, returning 'false'
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction commit
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [SessionImpl(1259297282<open>)]
2019-06-10 15:16:29 [task-scheduler-1] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [SessionImpl(1259297282<open>)] after transaction

1 个答案:

答案 0 :(得分:0)

a)您可以定义默认轮询器(请参见the documentation)。

b)最大行数是一种限制每次轮询获取的行数的方式(消息有效负载是行或映射对象的集合); max-messages-per-poll是轮询间隔之间轮询数据库的次数。

c)仅当您将工作移交给另一个线程时,才会这样做。如果您在轮询线程上处理结果,则直到当前轮询完成后才进行下一次轮询。

我不知道您的意思是“ ...被阻止”。