如何在 Spring Boot 中使用 JmsListenerEndpointRegistry 阻止 @JmsListener 侦听队列?

问题描述 投票:0回答:1
@Component
public class MyJmsListener{
    @Autowired
    private MyService myService;

    @JmsListener(destination="${queue.nameOne}")
    void receiveMessageOne(Message message){
        myService.process(message);
    }
    @JmsListener(destination="${queue.nameTwo}")
    void receiveMessageTwo(Message message){
        myService.process(message);
    }

    @JmsListener(destination="${queue.nameThree}")
    void receiveMessageThree(Message message){
        myService.process(message);
    }


}

**我尝试使用 @Conditional(demoClass Implements Condition) 注释,这将使 bean 基于我的 demoClass 并且创建了 bean。问题是MyJmsListener类有三个@JmsListener,如果我不制作MyJmsListener类的bean,那么我所有的@JmsListener都会失效。 **我的查询是根据Spring Boot中的某些条件停止和启动@JmsListener。

java spring-boot jms
1个回答
0
投票

我的理解是您希望 MyJmsListener 根据属性停止/开始侦听队列。为此,您可以使用 ConditionalOnProperty,如下所示:

@ConditionalOnProperty(前缀=“jms”,名称=“启用”,havingValue =“true”)

您必须声明 jms.enabled=true,您将获得所需的开关。

如果您需要在队列之间切换并一次只听一个,那么您需要将它们分成 3 个不同的 bean,并让它们基于类似于上面的属性启动。

要以编程方式执行此操作,您可以使用 JmsListenerEndpointRegistry

@RestController
@RequestMapping("/jms")
public class JmsListenerController {

@Autowired
ApplicationContext ctx;

@RequestMapping(value="/stop", method= RequestMethod.GET)
public @ResponseBody
String stopJmsListener() {
    JmsListenerEndpointRegistry jmsRegistry=
            ctx.getBean("jmsRegistry", JmsListenerEndpointRegistry.class);
    jmsRegistry.stop();
    return "Jms Listeners Stopped";
}

您可以创建类似的东西来启动应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.