Spring 轮询 + 休眠

Spring polling + Hibernate

场景:每 'n' 秒轮询一次数据库并检索列表。做一些内部业务 validations.If 验证仅成功,将检索到的列表发送到外部 system.Receive 来自该系统的确认响应(收到此后,轮询器应发送下一个列表)。然后执行一些业务操作,如调用不需要轮询的其他系统。 谁能告诉我如何处理这种情况?

poller.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
 xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc"
 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:task="http://www.springframework.org/schema/task" 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/task http://www.springframework.org/schema/task/spring-task-4.1.xsd
            http://www.springframework.org/schema/integration
            http://www.springframework.org/schema/integration/spring-integration-4.1.xsd
               http://www.springframework.org/schema/integration/http
    http://www.springframework.org/schema/integration/http/spring-integration-http-4.1.xsd
            http://www.springframework.org/schema/integration/jdbc
            http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc-4.1.xsd
            http://www.springframework.org/schema/jdbc
            http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd">

 <import resource="persistence-config.xml" />

 <int:channel id="inchannel">
 </int:channel>

 <int:channel id="outchannel">
 <int:dispatcher task-executor="taskExecutor"/> 
  </int:channel>
  
 <task:executor id="taskExecutor" pool-size="2"/>


 <bean id="poller" class="main.java.com.as.poller.PollerService" />


 <int:service-activator input-channel="inchannel"
  output-channel="outchannel" ref="poller" method="sendMessage" />


 <int-jdbc:inbound-channel-adapter
  query="select loyalty_id from TBL_RECEIPT where  receipt_status=0"
  channel="inchannel" data-source="dataSource" max-rows-per-poll="1">
  <int:poller fixed-rate="5000">
  </int:poller>
 </int-jdbc:inbound-channel-adapter>


</beans>

ackage main.java.com.as.poller;
 

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.stereotype.Component;


 @Component
public class PollerService{
    public void sendMessage()
    {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "AS-servlet.xml");
     DirectChannel directChannel = (DirectChannel) context.getBean("inchannel");
    }

     
}

我添加了一个直接通道来轮询 DB.Also 添加了一个执行器通道..但是我得到了异常

Error creating bean with name 'org.springframework.integration.config.ServiceActivatorFactoryBean#0': Cannot resolve reference to bean 'executerChannel' while setting bean property 'outputChannel'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'executerChannel' is defined
rg.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1477)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1222)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)

谁能帮忙解决这个问题...我只创建了 PollerService.java 并且不知道如何实现 执行器通道和任务执行器

如果您使用 fixed-delay 选项并且您的下游流是单线程的(仅 DirectChannels),<poller> 默认会为您执行此操作。在这种情况下,下一个轮询任务(在您的情况下使用 JPA 读取数据库)将在上一个轮询任务完成之前以及像 fixed-delay 这样的时间开始。参见 PeriodicTrigger,顺便说一句。

关于你的"Then perform some business operations"。您应该将 "Receive an acknowledgment response" 之后的下一个频道设为 ExecutorChannel 以释放下一次投票的投票线程。

您真的应该阅读 Spring 集成参考手册,尤其是 Poller