0

我正在使用 Spring Boot 中的一个项目,我需要添加 Spring 集成轮询器以从某个位置轮询文件并在该文件上运行 Spring Batch 以处理它。

我为此使用了弹簧批处理集成(下面的文档参考。)

http://docs.spring.io/spring-batch/trunk/reference/html/springBatchIntegration.html

在 Spring Boot 中,我已在 @Configuration 文件中成功配置了我的轮询器,如下所示

@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(
  fixedRate = "1000"), autoStartup = "true")
public MessageSource<File> filesScanner() {
  CompositeFileListFilter<File> filters = new   CompositeFileListFilter<File>();
  filters.addFilter(new   SimplePatternFileListFilter("*.xml"));
  filters.addFilter(new AcceptOnceFileListFilter<File>());
  filters.addFilter(getLastModifiedFileFilter());
  FileReadingMessageSource source = new FileReadingMessageSource();
  source.setDirectory(new File("F:/DataInput/"));
  source.setFilter(filters);
  return source;
}

这个轮询器是在 java 配置中定义的,而通道是在 xml 中定义的,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:int="http://www.springframework.org/schema/integration"
  xmlns:int-file="http://www.springframework.org/schema/integration/file"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration
    http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/file
    http://www.springframework.org/schema/integration/file/spring-integration-file.xsd">
    <int:channel id="ticketingResponse" />
    <int:channel id="mailFailureTicketData" />
    <int:channel id="moveSuccessTicketingFile" />
    <int:channel id="moveFailureTicketingFile" />
    <int:channel id="ticketingFileInput" />
    <int:channel id="ticketingJobParameters" />
    <!-- <int-file:inbound-channel-adapter id="filePoller"
    channel="inboundFileChannel"
    directory="file:/tmp/myfiles/"
    filename-pattern="*.csv">
  <int:poller fixed-rate="1000"/>
</int-file:inbound-channel-adapter> -->
    <bean id="earliestTicketingFileSelecter" class="com.avios.integration.iqcx.FilesSortingComparator" />
    <bean id="compositeFilesFilter"
        class="org.springframework.integration.file.filters.CompositeFileListFilter">
        <constructor-arg>
            <list>
                <bean
                    class="org.springframework.integration.file.filters.RegexPatternFileListFilter">
                    <constructor-arg name="pattern" value="${ticketing.input.file.pattern}" />
                </bean>
                <bean class="org.springframework.integration.file.filters." />
                <bean
                    class="org.springframework.integration.file.filters.LastModifiedFileListFilter">
                    <property name="age" value="${ticketing.input.file.age}" />
                </bean>
            </list>
        </constructor-arg>
    </bean>
    <bean id="ticketingFilesScanner"
    class="org.springframework.integration.file.FileReadingMessageSource">
    <property name="filter" value="compositeFilesFilter" />
    <property name="directory" value="/tmp/myfiles/" />
</bean>
<int-file:inbound-channel-adapter id="filePoller"
    channel="inboundFileChannel"
    directory="file:/tmp/myfiles/"
    filename-pattern="*.csv">
  <int:poller fixed-rate="1000"/>
</int-file:inbound-channel-adapter><!-- <int-file:inbound-channel-adapter
        directory="${ticketing.input.file.path}" channel="ticketingFileInput"
        comparator="earliestTicketingFileSelecter" auto-startup="true" filter="compositeFilesFilter" >
        <int:poller ></int:poller>
        </int-file:inbound-channel-adapter> -->
    <int:transformer id="iqcxFilesToJobParameters" ref="jobParameterTransformer"
        input-channel="ticketingFileInput" method="addTicketingFileToJobParameter"
        output-channel="ticketingJobParameters"  />
    <int:outbound-channel-adapter channel="ticketingJobParameters"
        ref="iqcxJobLaunchingGateway" method="handleMessage" />

</beans>

我的 XML 配置文件中出现以下错误。

cvc-complex-type.3.2.2:属性“固定速率”不允许出现在元素“int:poller”中。

我在谷歌上检查了这个,发现只有下面的链接没有多大用处,因为我得到了完全相同的错误。

将 Spring Boot 和 Spring 集成与数据库支持的配置一起使用

属性 'fixed-rate' 不允许出现在元素 'int:poller' 中

我使用的 Spring Boot 版本如下。

    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.6.RELEASE</version>

库中的 Spring 集成 jar - Spring-integration-core-4.2.8.RELEASE.jar

我还尝试从批处理集成依赖项中排除集成 jar,并将其单独添加如下,但这也不起作用。

    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-integration</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.integration</groupId>
                <artifactId>spring-integration-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-core -->
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-core</artifactId>
        </dependency>

还检查了 XSD http://www.springframework.org/schema/integration/spring-integration.xsd,它在轮询器中具有固定延迟属性。有什么解决这个问题的建议吗?

4

2 回答 2

0

阅读在线模式中的重要说明:

+++++ 重要 +++++

This schema is for the 1.0 version of Spring Integration Core. We cannot update it to the current schema
 because that will break any applications using 1.0.3 or lower. For subsequent versions, the unversioned
 schema is resolved from the classpath and obtained from the jar.
 Please refer to github:

https://github.com/spring-projects/spring-integration/tree/master/spring-integration-core/src/main/resources/org/springframework/integration/config/xml

for the latest schema. 

在旧模式中,固定速率是轮询器上周期性触发子元素的一部分。

4.2 模式在这里

如果这只是一个 IDE 错误,您可以忽略它,或者将您的 IDE 配置为“spring 感知”。

Spring 在类路径中找到实际的模式。

使用 STS,在项目上启用“春天性质”。

于 2016-10-07T20:44:32.020 回答
0

有时可能是由于 pom.xml 中缺少 spring-boot-starter-integration 和 spring-integration-file 依赖关系。因此,当您使用 spring 集成时,请检查您的项目中是否有实际的 spring-integration-file 依赖项。

于 2016-10-09T02:47:18.113 回答