Spring 集成 - 文件写入操作的服务参与者抛出错误
Spring Integration - service actor throwing error for file write operation
我目前正在编写一个示例测试程序来获取文件并简单地移动到另一个目录(我将添加代码来处理文件内容)。
我正在使用:Spring 引导 (2.1.9.RELEASE) 和 Spring 集成 (5.1.8.RELEASE)
我的代码出错了。 (查看 post 底部的错误详细信息)
Gradle 文件:
implementation 'org.springframework.boot:spring-boot-starter-integration'
implementation 'org.springframework.integration:spring-integration-file'
@EnableIntegration
@IntegrationComponentScan
@SpringBootApplication
public class IntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(CpKiboIntegrationApplication.class, args);
}
@Bean
public FileWritingMessageHandler fileWritingMessageHandler() {
return new FileWritingMessageHandler(new File("outDir"));
}
@Bean
@InboundChannelAdapter(channel = "fileInputChannel", poller = @Poller(fixedDelay = "5000"))
public MessageSource<File> pollableFileSource() {
FileReadingMessageSource fileReadingMessageSource = new FileReadingMessageSource();
fileReadingMessageSource.setDirectory(new File("inputDir"));
fileReadingMessageSource.setFilter(new SimplePatternFileListFilter("*.txt"));
return fileReadingMessageSource;
}
}
@Service
public class ActivatorService {
@Autowired
private FileWritingMessageHandler fileWritingMessageHandler;
@ServiceActivator(inputChannel = "fileInputChannel")
public MessageHandler fileReceiver(Message<?> message) {
fileWritingMessageHandler.setFileExistsMode(FileExistsMode.REPLACE);
fileWritingMessageHandler.setDeleteSourceFiles(true);
fileWritingMessageHandler.setExpectReply(false);
fileWritingMessageHandler.setAutoCreateDirectory(true);
return fileWritingMessageHandler;
}
}
启动时没有错误,但是一旦我将文件放入 "inputDir" 文件夹中,我就会收到以下警告,然后出现错误:(注意:它确实执行了预期的操作,文件从源文件和新文件在 outDir 文件夹中创建。)
o.s.i.expression.ExpressionUtils : 创建没有 beanFactory 的 EvaluationContext
错误:
在 org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:86) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:116) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:102) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:172) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:160) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.file.DefaultFileNameGenerator.generateFileName(DefaultFileNameGenerator.java:70) ~[spring-integration-file-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.file.FileWritingMessageHandler.handleRequestMessage(FileWritingMessageHandler.java:494) ~[spring-integration-file-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:176) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
在 com.ignitiv.cpkibointegration.ActivatorService.fileReceiver(ActivatorService.java:36) ~[类/:na]
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:na]
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
在 java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
原因:
原因:org.springframework.messaging.core.DestinationResolutionException:没有 output-channel 或 replyChannel header 可用
在 org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:426)
在 org.springframework.integration.handler.AbstractMessageProducingHandler.doProduceOutput(AbstractMessageProducingHandler.java:284)
在 org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:265)
在 org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:223)
在 org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
在 org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
... 还有 26 个
FileWritingMessageHandler
必须是 @Bean
。
您是自己打电话给 new
,因此它不受 Spring 管理。
无论如何,您都不希望每条消息都有一个新的处理程序。
@Bean
@ServiceActivator(inputChannel = "fileInputChannel")
public MessageHandler fileReceiver() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File("outDir"));
handler.setFileExistsMode(FileExistsMode.REPLACE);
handler.setDeleteSourceFiles(true);
handler.setExpectReply(false);
handler.setAutoCreateDirectory(true);
return handler;
}
我目前正在编写一个示例测试程序来获取文件并简单地移动到另一个目录(我将添加代码来处理文件内容)。 我正在使用:Spring 引导 (2.1.9.RELEASE) 和 Spring 集成 (5.1.8.RELEASE)
我的代码出错了。 (查看 post 底部的错误详细信息)
Gradle 文件:
implementation 'org.springframework.boot:spring-boot-starter-integration'
implementation 'org.springframework.integration:spring-integration-file'
@EnableIntegration
@IntegrationComponentScan
@SpringBootApplication
public class IntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(CpKiboIntegrationApplication.class, args);
}
@Bean
public FileWritingMessageHandler fileWritingMessageHandler() {
return new FileWritingMessageHandler(new File("outDir"));
}
@Bean
@InboundChannelAdapter(channel = "fileInputChannel", poller = @Poller(fixedDelay = "5000"))
public MessageSource<File> pollableFileSource() {
FileReadingMessageSource fileReadingMessageSource = new FileReadingMessageSource();
fileReadingMessageSource.setDirectory(new File("inputDir"));
fileReadingMessageSource.setFilter(new SimplePatternFileListFilter("*.txt"));
return fileReadingMessageSource;
}
}
@Service
public class ActivatorService {
@Autowired
private FileWritingMessageHandler fileWritingMessageHandler;
@ServiceActivator(inputChannel = "fileInputChannel")
public MessageHandler fileReceiver(Message<?> message) {
fileWritingMessageHandler.setFileExistsMode(FileExistsMode.REPLACE);
fileWritingMessageHandler.setDeleteSourceFiles(true);
fileWritingMessageHandler.setExpectReply(false);
fileWritingMessageHandler.setAutoCreateDirectory(true);
return fileWritingMessageHandler;
}
}
启动时没有错误,但是一旦我将文件放入 "inputDir" 文件夹中,我就会收到以下警告,然后出现错误:(注意:它确实执行了预期的操作,文件从源文件和新文件在 outDir 文件夹中创建。)
o.s.i.expression.ExpressionUtils : 创建没有 beanFactory 的 EvaluationContext
错误:
在 org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:86) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:116) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:102) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:172) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:160) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.file.DefaultFileNameGenerator.generateFileName(DefaultFileNameGenerator.java:70) ~[spring-integration-file-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.file.FileWritingMessageHandler.handleRequestMessage(FileWritingMessageHandler.java:494) ~[spring-integration-file-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:176) ~[spring-integration-core-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 com.ignitiv.cpkibointegration.ActivatorService.fileReceiver(ActivatorService.java:36) ~[类/:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
原因:
原因:org.springframework.messaging.core.DestinationResolutionException:没有 output-channel 或 replyChannel header 可用 在 org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:426) 在 org.springframework.integration.handler.AbstractMessageProducingHandler.doProduceOutput(AbstractMessageProducingHandler.java:284) 在 org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:265) 在 org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:223) 在 org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129) 在 org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169) ... 还有 26 个
FileWritingMessageHandler
必须是 @Bean
。
您是自己打电话给 new
,因此它不受 Spring 管理。
无论如何,您都不希望每条消息都有一个新的处理程序。
@Bean
@ServiceActivator(inputChannel = "fileInputChannel")
public MessageHandler fileReceiver() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File("outDir"));
handler.setFileExistsMode(FileExistsMode.REPLACE);
handler.setDeleteSourceFiles(true);
handler.setExpectReply(false);
handler.setAutoCreateDirectory(true);
return handler;
}