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