Spring Integration xml to java dsl - 如何定义入站/出站通道适配器,轮询器等

时间:2015-07-30 05:15:47

标签: java xml spring spring-integration dsl

这是我的春季整合xml:我用来学习的一个简单的东西......

<int-file:inbound-channel-adapter id="executionMessageFileInputChannel"
                                  directory="file:${fpml.messages.input}"
                                  prevent-duplicates="false" filename-pattern="*.xml">
    <int:poller fixed-delay="20000" max-messages-per-poll="20"/>
</int-file:inbound-channel-adapter>

<int:service-activator input-channel="executionMessageFileInputChannel"
                       output-channel="executionMessageFileArchiveChannel"
                       ref="dummyService" method="myMethod"/>


<int-file:outbound-channel-adapter id="executionMessageFileArchiveChannel"
                                   directory="file:${fpml.messages.archive}"
                                   delete-source-files="true" auto-create-directory="true"/>

我真的找不到这方面的好教程..请你指点一下 集成java dsl的好教程? 另外,请帮我将其从xml转换为dsl。

更新:(在Gary's Response之后):

我设法将其翻译为此。

@MessagingGateway
public interface Archive {
    @Gateway(requestChannel = "archiveFile.input")
    void archive();
}

@Bean
    public IntegrationFlow archiveFile() {
        return IntegrationFlows
                .from(Files.inboundAdapter(new File(dirPath))
                                .patternFilter("*.xml")
                                .preventDuplicatesFilter(false),
                        e -> e.poller(Pollers.fixedDelay(20000)
                                .maxMessagesPerPoll(20)))
                .handle("app","myMethod")
                .handle(Files.outboundAdapter(new File(outDirPath)).deleteSourceFiles(true).autoCreateDirectory(true))
                .get();
    }

不确定我是否正确行事。我翻译后立即发布,将测试出来。

测试它:收到以下错误:

  

org.springframework.beans.factory.BeanCreationException:错误   创建名为&#39; archiveFile&#39;的bean定义于   si.jdsl.App:Bean实例化通过   工厂方法失败;嵌套异常是   org.springframework.beans.BeanInstantiationException:失败   实例化[org.springframework.integration.dsl.IntegrationFlow]:   工厂方法&#39; archiveFile&#39;抛出异常;嵌套异常是   java.lang.IllegalArgumentException:&#39;过滤器&#39;   (org.springframework.integration.file.filters.CompositeFileListFilter@48e64352)   已经为FileReadingMessageSource配置了

有什么想法吗?

更新2:

感谢Gary,这解决了过滤器问题:服务激活器出现问题。以下是我的服务激活者:

@Bean
    @ServiceActivator(inputChannel = "archiveFile.input")
    public Message<File> myMethod (File inputFile){
        Map<String, Object> contextHeader = new HashMap<String, Object>();
        return new GenericMessage<File>(inputFile, contextHeader);
    }
  

bean初始化失败;嵌套异常是   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为&#39; myMethod&#39;的bean时出错定义于   si.jdsl.App:不满意的依赖   通过类型为索引0的构造函数参数表示   [java.io.File] ::找不到类型为[java.io.File]的限定bean   依赖:预计至少有1个bean有资格成为autowire   这种依赖的候选人。依赖注释:{};嵌套   例外是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   为依赖项找到类型[java.io.File]的限定bean:expected   至少有一个bean有资格作为autowire候选者   依赖。依赖注释:{}

请让我知道我错过了什么?

2 个答案:

答案 0 :(得分:2)

使用Files命名空间工厂。见the DSL reference manual。这是一个通用教程here,它通过咖啡馆示例应用程序的逐行转换。 (Java 6/7版本here)。

修改

这看起来像一个错误,DSL抱怨你设置了两个过滤器并且它不会允许它。

在这种情况下,你实际上并不需要这个

.preventDuplicatesFilter(false),

因为当你提供另一个过滤器时它是默认值。

如果您确实需要撰写过滤器,可以使用

.filter(myFilter())

其中myFilter是带有模式过滤器等的CompositeFileListFilter bean。

编辑2

@Bean是在初始化时构建的,显然这是一个运行时方法。

See the documentation

@Bean注释@ServiceActivator时,它必须是MessageHandler类型。要使用POJO消息传递,您需要@MessageEndpoint bean ...

@Bean
public MyPojo myPojo() {
    return new MyPojo();
}

@MessageEndpoint
public static class MyPojo {

    @ServiceActivator(inputChannel = "archiveFile.input")
    public Message<File> myMethod (File inputFile){
        Map<String, Object> contextHeader = new HashMap<String, Object>();
        return new GenericMessage<File>(inputFile, contextHeader);
    }

}

您可以在POJO中使用多种消息传递方法。

答案 1 :(得分:0)

If _
    ARange(1).Value = "John" Or ARange(1).Value = "Thomson" Or _
    ARange(1).Value = "Mattson" Or ARange(1).Value = "Powers" Or _
    ARange(1).Value = "Hermkens" Or ARange(1).Value = "Licka" Or _
    ARange(1).Value = "Fout" Or ARange(1).Value = "Marrin" Or _
    ARange(1).Value = "Fleming" Or ARange(1).Value = "Waiblinger" Or _
    ARange(1).Value = "Lambertson" Or ARange(1).Value = "Solis" Or _
    ARange(1).Value = "Deot" Or ARange(1).Value = "Large" Or _
    ARange(1).Value = "Gannon" Or ARange(1).Value = "FAUGHNAN" Or _
    ARange(1).Value = "COMPLIANCE" Or ARange(1).Value = "Jacobs" Or _
    ARange(1).Value = "Powers" Or ARange(1).Value = "TSH" Or _
    ARange(1).Value = "WRONG LOCATION CODE" _
Then
    If DRange Is Nothing Then
        Set DRange = ARange
    Else
        Set DRange = Union(DRange, ARange)
    End If
End If