错误处理:Spring集成

时间:2014-05-29 17:27:20

标签: error-handling spring-integration

我对Spring Integration完全不熟悉。以下是我的要求:

我必须为一个文件(具有给定模式 - 由regex定义)轮询一个给定位置(比如一个间隔为5秒的目录)。如果发现文件我必须对文件执行某些操作(比如记录消息"找到文件",将文件保存到另一个位置等),如果找不到文件然后程序需要记录一条消息说 - "轮询间隔5秒......文件未找到"。该计划还需要轮询9小时。之后它应该停止轮询,即程序应该退出。

我想处理各种错误情况,例如:

1)文件夹不存在:如果正在轮询该文件的文件夹(目录)不存在,会发生什么?我的最新代码如下:

<int-event:inbound-channel-adapter
channel="contextStartedEventChannelChannel" event-      types="org.springframework.context.event.ContextRefreshedEvent"
payload-expression="new java.io.File('${myapp.incomingFile.path}').exists()" />

<int:router input-channel="contextStartedEventChannelChannel"
    expression="payload">
    <int:mapping value="true" channel="trueChannel" />
    <int:mapping value="false" channel="falseChannel" />
</int:router>

<int:outbound-channel-adapter id="trueChannel"
    expression="@'incomingFiles.adapter'.start()" />

<int:outbound-channel-adapter id="falseChannel"
    ref="errorTracker" method="processError" />

入站通道适配器代码:

<int-file:inbound-channel-adapter id="incomingFiles"
        directory="file:${myapp.incomingFile.path}" prevent-duplicates="true"
        filename-regex="${ETD.filenameRegex}"  auto-create-directory="false"
        auto-startup="false">

问题:

1)但现在发生的事情是,当我有目的地删除轮询目录然后按预期我们得到一个异常,但它在控制台上作为堆栈跟踪而不是错误通道。

2)目前我们只处理一个错误情况,即轮询目录不存在。我还想实现其他错误情况,例如网络关闭等等,并且只想在记录器上显示一条消息(即传递错误信道)并优雅地退出程序。

请善意提出错误。

以下是我得到的例外情况:

  

线程中的异常&#34; main&#34;   org.springframework.beans.factory.BeanCreationException:错误   使用name&#39; incomingFiles.adapter创建bean&#39;:无法解析   对bean&quot; incomingFiles.adapter.source&#39;的引用设置bean时   财产来源&#39 ;;嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   使用name&#39; incomingFiles.adapter.source&#39;:FactoryBean创建bean   在对象创建上抛出异常;嵌套异常是   java.lang.IllegalArgumentException:源目录   [C:\ TEMP \ incomingFile] 不存在。在   org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)     在   org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)     在   org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)     在   org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:681)     在   org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)     在   org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)     在   org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)     在   org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83)     在com.jefferies.fileutility.App.main(App.java:31)引起:   org.springframework.beans.factory.BeanCreationException:错误   使用name&#39; incomingFiles.adapter.source&#39;:FactoryBean创建bean   在对象创建上抛出异常;嵌套异常是   java.lang.IllegalArgumentException:源目录   [C:\ TEMP \ incomingFile]不存在。在   org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:151)     在   org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1514)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:252)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)     在   org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320)     ... 15更多引起:java.lang.IllegalArgumentException:来源   目录[C:\ TEMP \ incomingFile]不存在。 at   org.springframework.util.Assert.isTrue(Assert.java:65)at   org.springframework.integration.file.FileReadingMessageSource.onInit(FileReadingMessageSource.java:237)     在   org.springframework.integration.context.IntegrationObjectSupport.afterPropertiesSet(IntegrationObjectSupport.java:133)     在   org.springframework.integration.file.config.FileReadingMessageSourceFactoryBean.initSource(FileReadingMessageSourceFactoryBean.java:170)     在   org.springframework.integration.file.config.FileReadingMessageSourceFactoryBean.getObject(FileReadingMessageSourceFactoryBean.java:111)     在   org.springframework.integration.file.config.FileReadingMessageSourceFactoryBean.getObject(FileReadingMessageSourceFactoryBean.java:40)     在   org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:144)     ......还有20个

1 个答案:

答案 0 :(得分:0)

某些错误被视为硬错误(在bean初始化期间检测到)并阻止上下文初始化。在这种情况下,要防止出现此错误,您需要设置自动创建目录。

所需条件位于onInit() ...

    if (!this.directory.exists() && this.autoCreateDirectory) {
        this.directory.mkdirs();
    }
    Assert.isTrue(this.directory.exists(),
            "Source directory [" + directory + "] does not exist.");
    Assert.isTrue(this.directory.isDirectory(),
            "Source path [" + this.directory + "] does not point to a directory.");
    Assert.isTrue(this.directory.canRead(),
            "Source directory [" + this.directory + "] is not readable.");

其他,运行时,错误确实会转到轮询器配置的error-channel(默认情况下为errorChannel)。