Spring Integration 5.07使用Java DSL在两个JMS队列之间进行桥接

时间:2018-08-10 16:48:56

标签: spring-integration spring-integration-dsl

我需要限制某些JMS(activeMQ)队列之间的消息移动,以确保我不会超出消息处理期间使用的外部服务。

我过去曾经和Camel一起做过,但是考虑到这个项目完全是基于Spring的,我想我会给Spring-Integration带来些许惊喜。

我很高兴看到Java DSL在5.0.7版本中处于核心地位,并且真的想使用它代替xml。

但是...我似乎找不到使用DSL来完成简单的事情(例如为JMS创建输入和输出messageChannels)的优秀/最新文档。

任何人都可以指出我当前使用Java DSL创建可用于消费和产生消息的通道的示例,然后再在应用了某些节流功能的桥中使用吗?

1 个答案:

答案 0 :(得分:0)

好吧,就像Java DSL示例的参考手册泄漏中的JMS章节一样,例如,到目前为止,与AMQP相似:

https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/amqp.html#_configuring_with_the_java_dsl_2

https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/amqp.html#_configuring_with_the_java_dsl_4

我相信我们也可以在JMS章节中添加类似的段落。请提出关于此事的JIRA,我们将尽快解决。同时,我建议您打开org.springframework.integration.jms.dsl.Jms工厂,以使用适当的构建器。

另一方面,我建议您研究一下一些可能配置的现有测试用例:https://github.com/spring-projects/spring-integration/blob/master/spring-integration-jms/src/test/java/org/springframework/integration/jms/dsl/JmsTests.java

例如,要从队列中读取信息,您需要这样的配置:

    @Bean
    public IntegrationFlow jmsMessageDrivenFlow() {
        return IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(jmsConnectionFactory(), DefaultMessageListenerContainer.class)
                        .outputChannel(jmsMessageDrivenInputChannel())
                        .destination("jmsMessageDriven")
                .configureListenerContainer(c -> c.clientId("foo")))
                .<String, String>transform(String::toLowerCase)
                .channel(jmsOutboundInboundReplyChannel())
                .get();
    }

要发送到JMS,您需要这样的东西:

    @Bean
    public IntegrationFlow jmsOutboundFlow() {
        return f -> f
                .handle(Jms.outboundAdapter(jmsConnectionFactory())
                        .destinationExpression("headers." + SimpMessageHeaderAccessor.DESTINATION_HEADER)
                        .configureJmsTemplate(t -> t.id("jmsOutboundFlowTemplate")));
    }