簡體   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