gpt4 book ai didi

java - 在不阻塞主线程的情况下启动 JMSListener

转载 作者:行者123 更新时间:2023-11-30 12:03:14 30 4
gpt4 key购买 nike

我正在尝试使用具有 JMSListener 的 spring boot 启动一个应用程序以连接到外部 ActiveMQ,即使 ActiveMQ 已关闭,此应用程序也需要启动。

我在连接中使用了故障转移传输协议(protocol),但是当我启动应用程序时,主线程被阻塞,而 JMS 尝试建立连接,应用程序直到建立第一个连接后才启动。

我正在尝试这个解决方案,我在其中扩展了 DefaultMessageListenerContainer 并覆盖了 start 方法以在将释放主线程的新线程中运行。

消费者.java

@SpringBootApplication
public class Consumer {

public static void main(String[] args) {
SpringApplication.run(Consumer.class, args);
System.out.println("Consumer Start");
}
}

接收者

@Component
public class Receiver {

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new MyListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}

@JmsListener(destination = "mailbox", containerFactory = "myFactory")
public void receiveMessage(String email) {
System.out.println("Received <" + email + ">");
}

}

MyListenerContainer.java

public class MyListenerContainer extends DefaultMessageListenerContainer {

@Override
public void start() throws JmsException {
new Thread(() -> {
super.start();
}).start();
}
}

MyListenerContainerFactory.java

public class MyListenerContainerFactory extends DefaultJmsListenerContainerFactory {

@Override
protected DefaultMessageListenerContainer createContainerInstance() {
return new MyListenerContainer();
}
}

1º 问题:这个解决方案有效,但我不确定这是否不会破坏 spring bean 的启动,因为我在创建连接之前完成了启动方法。这会破坏 spring boot 中的 bean 创建过程吗?

2º 问题:除此之外,如果我在同一个应用程序中有一个 JMSListener 和一个 JMSProducer,它们会尝试使用相同的连接还是使用不同的连接?

如果有人有更好的不同解决方案,请分享。

谢谢你的时间和最好的问候

贝尔纳多·内维斯

最佳答案

  1. 使用 factory.setAutoStartup(false); 可能更简洁,这将阻止 Spring 尝试启动容器;准备就绪时使用 container.start()(在任何您想要的线程上)。
@Autowired
private JmsListenerEndpointRegistry registry;

...

registry.start(); // starts all containers
// or
registry.getListenerContainer(myContainerId).start();
  1. 他们将使用相同的连接。

关于java - 在不阻塞主线程的情况下启动 JMSListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57909421/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com