[英]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.