繁体   English   中英

Spring 集成与IBM MQ

[英]Spring Integration and IBM MQ

帮助我尝试连接 Spring Integration Ibm mq,我在做什么:

public Publisher<Message<String>> jmsReactiveSource() {
        return IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(ibmConnectionFactory)
                        .destination("DEV.QUEUE.1"))
                .channel(MessageChannels.queue())
                .log(org.springframework.integration.handler.LoggingHandler.Level.DEBUG)
                .log()
                .toReactivePublisher();
    }

    @GetMapping("/event")
    public Mono<String> getEvent() {
        return Mono.from(jmsReactiveSource())
                .log()
                .map (Message::getPayload);
    }
    

    @GetMapping("/pub")
    public void produce() {
        jmsTemplateIbm.convertAndSend("DEV.QUEUE.1", "MESSAGE");
    }

当我在调用 /pub 之后调用 /event 时,什么也没有发生,消息没有被扣除,我做错了什么,我需要使 ibm mq 成为非阻塞的,因为大量资源被用于等待 ibm mq 的响应。

请参阅 Spring 集成文档,了解 Java DSL: https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-dsl 我们在示例中无处不在谈论将IntegrationFlow制作为@Bean 只有这样IntegrationFlowBeanPostProcessor才能理解 DSL 定义并在应用程序上下文中注册相应的 bean。 带有那些@GetMapping方法的整个 class 和这个用于@Bean jmsReactiveSource()的 @Bean 必须作为一个@Configuration来使jmsReactiveSource()方法调用作为来自应用程序上下文的 bean 请求。 否则,如果您不想将此@RestController设为这样,则应考虑将此流 bean 移至单独的@Configuration class 中。 然后您需要将该Publisher<Message<String>> bean 自动装配到这个 controller class 中。

更新

对于您对早期消费的第二个担忧,您必须将Jms.messageDrivenChannelAdapter()标记为 autoStartup autoStartup(false)并使用其doOnRequest()getEvent()中的Mono启动它。 适配器上有一个id()选项供您考虑正确自动连接该端点。 你是对的:即使它最终是反应性的,开始也不是而且必须分别对待以在请求之前不消耗。

您也可以考虑返回Flux而不是Mono :整个过程被认为是无界的。 这样的REST请求应该也改成SSE: https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-codecs-streaming

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM