Spring integration Spring集成-带有错误处理的流程

Spring integration Spring集成-带有错误处理的流程,spring-integration,Spring Integration,我正在继续学习SI,同时我正在尝试构建一个应用程序 我的申请流程如下: 读取XML文件并拆分每个标记 每个标记都定义了一个名为“interval”的属性,我需要根据该值创建一个将重复的作业。 当作业执行终止时,需要调用Web服务来存储信息 如果WBS调用失败,请尝试通过电子邮件发送信息 现在我已经到达了这个流程的第一点(:D),现在我正试图向前推进,首先检查错误处理(流程的第4点) 这是我所拥有的实际配置,它可以很好地拆分标记,然后调用正确的服务激活器: <context:componen

我正在继续学习SI,同时我正在尝试构建一个应用程序

我的申请流程如下:

  • 读取XML文件并拆分每个标记
  • 每个标记都定义了一个名为“interval”的属性,我需要根据该值创建一个将重复的作业。
  • 当作业执行终止时,需要调用Web服务来存储信息
  • 如果WBS调用失败,请尝试通过电子邮件发送信息
  • 现在我已经到达了这个流程的第一点(:D),现在我正试图向前推进,首先检查错误处理(流程的第4点)

    这是我所拥有的实际配置,它可以很好地拆分标记,然后调用正确的
    服务激活器

    <context:component-scan base-package="it.mypkg" />
    
    <si:poller id="poller" default="true" fixed-delay="1000"/>
    
    <si:channel id="rootChannel" />
    
    <si-xml:xpath-splitter id="mySplitter" input-channel="rootChannel" output-channel="routerChannel" create-documents="true">
        <si-xml:xpath-expression expression="//service" />
    </si-xml:xpath-splitter>
    
    <si-xml:xpath-router id="router" input-channel="routerChannel" evaluate-as-string="true">
        <si-xml:xpath-expression expression="concat(name(./node()), 'Channel')" />
    </si-xml:xpath-router>
    
    <si:service-activator input-channel="serviceChannel" output-channel="endChannel">
        <bean class="it.mypkg.Service" />
    </si:service-activator>
    
    
    
    endChannel需要接收来自多个通道(由路由器发送)的所有消息,然后调用WBS现在我正在创建类来检查流是否有效。

    my applicationContext.xml的其余部分如下所示:

      <!-- Create a poller that will be used by endChannel -->
    <si:poller id="poller" default="true" fixed-delay="1000" error-channel="failedInvocationChannel" />
    
    <!--- take messages from serviceChannel and redirect to endChannel, that is responsable to receive messages from all channels created by the router -->
    <si:service-activator input-channel="serviceChannel" output-channel="endChannel">
        <bean class="it.mypkg.Service" />
    </si:service-activator>
    
     <!-- end channel is a queue -->
    <si:channel id="endChannel">
        <si:queue capacity="10"/>
    </si:channel>
    
    <!-- Messages are taken from the queue.. -->
    <si:service-activator input-channel="endChannel">
        <bean class="it.mypkg.Invokator" />
    </si:service-activator>
    
    <!-- Service activator that handle the errors on the queue -->
    <si:channel id="failedInvocationChannel" />
    
    <si:service-activator input-channel="failedInvocationChannel">
        <bean class="it.mypkg.Resubmitter" />
    </si:service-activator>
    
    
    
    但当我运行我的应用程序时,出现了以下错误:

    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.handler.MessageHandlerChain#0': Cannot create inner bean 'org.springframework.integration.handler.MessageHandlerChain#0$child#1.handler' of type [org.springframework.integration.config.ServiceActivatorFactoryBean] while setting bean property 'handlers' with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.handler.MessageHandlerChain#0$child#1.handler': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Target object of type [class org.springframework.integration.channel.QueueChannel] has no eligible methods for handling Messages.
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:838)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:197)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:172)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:158)
    
    线程“main”org.springframework.beans.factory.BeanCreationException中的异常:创建名为“org.springframework.integration.handler.MessageHandlerChain”的bean时出错:无法创建类型为“org.springframework.integration.handler.MessageHandlerChain”的内部bean[org.springframework.integration.config.ServiceActivatorFactoryBean],同时使用键[1]设置bean属性“handlers”;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.integration.handler.MessageHandlerChain#0$child#1.handler”的bean时出错:FactoryBean在创建对象时引发异常;嵌套异常为java.lang.IllegalArgumentException:类型的目标对象[class org.springframework.integration.channel.QueueChannel]没有处理消息的合格方法。
    位于org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313)
    在org.springframework.beans.factory.support.BeanDefinitionValueResolver.ResolveValueIfNeeded上(BeanDefinitionValueResolver.java:122)
    位于org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382)
    在org.springframework.beans.factory.support.BeanDefinitionValueResolver.ResolveValueIfNeeded(BeanDefinitionValueResolver.java:157)上
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481)
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:772)
    位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:838)
    位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
    位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:197)
    位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:172)
    位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:158)
    
    我读了很多书,对所有可以使用的组件都有点困惑…也许我的错误是因为我试图以错误的方式使用组件

    编辑:使用轮询器上的错误通道更新配置,并删除链以处理错误

    
    
    <si:service-activator ref="endChannel" method="dispatch" />
    
    您不能在服务激活器中使用对通道的引用

    另外,最好给像chains这样的元素一个
    id
    ,这样异常就更容易调试


    另外,您通常不应该操纵
    errorChannel
    头;最好向轮询器添加
    error channel
    ,并以这种方式路由错误流。

    我已按照您的建议修复了ref,并为链提供了一个id。现在程序已编译,但我的异常未被捕获(程序“崩溃”)。要编写此代码,我使用了github intermedie/errorhandling中提供的示例。您能告诉我如何将错误通道添加到轮询器吗?我为您编写的流没有问题,或者我做错了…?您需要使用当前配置编辑您的问题。
    。我已经更新了问题,现在似乎可以工作了。W当我引发异常时,将从重新提交者(连接到FailedInvestment通道的service activator使用的类)处理该异常