我对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个
答案 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
)。