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
答案 0 :(得分:0)
a)您可以定义默认轮询器(请参见the documentation)。
b)最大行数是一种限制每次轮询获取的行数的方式(消息有效负载是行或映射对象的集合); max-messages-per-poll是轮询间隔之间轮询数据库的次数。
c)仅当您将工作移交给另一个线程时,才会这样做。如果您在轮询线程上处理结果,则直到当前轮询完成后才进行下一次轮询。
我不知道您的意思是“ ...被阻止”。