春季轮询+休眠

问题描述:

场景:每'n'秒轮询数据库并检索列表。做一些内部业务验证。如果验证只是成功的,则将检索到的列表发送到外部系统。接收来自该系统的确认响应(接收到该请求后,轮询器应发送下一个列表)。然后执行一些业务操作,如调用其他系统不需要轮询。 任何人都可以告诉我这种情况如何处理?春季轮询+休眠

poller.xml

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

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

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

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

 

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

 

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

 

 
\t <int-jdbc:inbound-channel-adapter 
 
\t \t query="select loyalty_id from TBL_RECEIPT where receipt_status=0" 
 
\t \t channel="inchannel" data-source="dataSource" max-rows-per-poll="1"> 
 
\t \t <int:poller fixed-rate="5000"> 
 
\t \t </int:poller> 
 
\t </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"); 
 
    \t DirectChannel directChannel = (DirectChannel) context.getBean("inchannel"); 
 
    } 
 

 
     
 
}

我添加了一个直接通道轮询DB.Also增加了一个执行者channel..But我得到例外

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) 
 
\t at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
 
\t at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1477) 
 
\t at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1222) 
 
\t at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
 
\t at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)

谁能请帮助这个......我只创建了PollerService.java和不要有任何想法来实现执行器通道和任务执行者

+0

这个问题实在太宽泛;阅读[Spring集成参考手册](http://docs.spring.io/spring-integration/reference/html/)。当你了解基本概念时;阅读JPA支持部分。有[很多示例](https://github.com/spring-projects/spring-integration-samples),至少包括一个使用JPA和hibernate的示例。当你做完所有事情后,如果你有特定的问题,请回到这里。 –

<poller>做对于默认情况下,如果您使用fixed-delay选项,并且您的下游流为单线程(仅限于DirectChannel s)。在这种情况下,下一个轮询任务(在使用JPA读取数据库的情况下)将不会在上一个轮询任务完成之前开始,并且会像fixed-delay那样。参见PeriodicTrigger,顺便说一下。

关于您的“然后执行一些业务操作”。您应该在“接收确认响应”之后将下一个频道设置为ExecutorChannel,以释放下一次轮询的轮询线程。

您应该在Spring集成参考手册中详细阅读更多内容,特别是关于Poller

+0

..我可以得到一个可以处理我的场景的示例java代码片段.. – Jill

+0

???不知道你有什么问题,但我们无法帮助你编码,你应该向我们展示一些PoC,并指出卡住的位置。否则,它听起来像:请为我写下申请! –

+0

好吧,我说过它是如何处理的:只使用'fixed-delay'和'DirectChannels'。您只应将该外部服务的回复转移到ExecutorChannel中执行下一个逻辑并释放当前的线程以便下一个轮询任务通过Hibernate检索新的实体列表。你还想听听什么? –