- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这篇文章中,Garry Russell 解释了如何以编程方式创建多个 KafkaListener 来监听多个主题。.[这个设置实际上对我来说很成功] Kafka Spring: How to create Listeners dynamically or in a loop?
现在我也希望对 JMSListener 进行类似的设置 - 我可以在一个类中包含一个 @JMSListener,并且我可以以编程方式创建该 JMSListener 的多个实例,每个实例都注入(inject)自己的queueName。
我找到了这篇文章 Spring JMS start listening to jms queues on request
在这篇文章的最后,加里发表了类似的评论,
If you wish to dynamically create lots of containers, then just create the containers programmatically, call afterPropertiesSet(), then start()
我使用了上面第一篇文章中的设置(与 KafkaListeners 相关),我的多个 JMS 监听器实例正在启动,但没有消耗任何消息。
基本上我不明白我该在哪里做
then just create the containers programmatically, call afterPropertiesSet(), then start()
我对容器这个词感到困惑,我知道有 JMSListener 并且有JmsListenerContainerFactory,在此上下文中什么是容器 - 我猜是 JMSListener?
我已确认队列中有消息。另外,当我不以编程方式创建监听器并且只有一个监听器及其上提到的硬编码队列时,它会很好地消耗消息。
当我以编程方式创建多个 JMS 监听器时,基本上没有监听器正在使用消息
@SpringBootApplication
@EnableJms
public class MqProdConsumerApplication {
private static Logger logger = LogManager.getLogger(MqProdConsumerApplication.class.getName());
private static Consumers consumersStatic;
@Autowired
Consumers consumers;
@PostConstruct
public void init() {
consumersStatic = this.consumers;
}
@Bean
public Gson gson() {
return new Gson();
}
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MqProdConsumerApplication.class, args);
List<QueueInformation> queueInformationList = consumersStatic.getQueueInformationList();
Assert.notEmpty(queueInformationList, "queueInformationList cannot be empty");
logger.debug("queueInformationList ************" + queueInformationList.toString());
for (QueueInformation queueInformation : queueInformationList) {
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
child.setParent(context);
child.register(MQConfig.class);
Properties props = new Properties();
props.setProperty("mqQueueName", queueInformation.getMqQueueName());
//
PropertiesPropertySource pps = new PropertiesPropertySource("listenerProps", props);
child.getEnvironment().getPropertySources().addLast(pps);
child.refresh();
}
}
}
这是具有listenerContainerFactory 的MQConfig
@Configuration
public class MQConfig {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${ibm.mq.user}")
private String mqUserName;
@Bean
public MQListener listener() {
return new MQListener();
}
@PostConstruct
public void afterConstruct() {
logger.debug("************* initialized MQ Config successfully for user =" + mqUserName);
}
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
// Put the MQ username in the PCF environment.
// Otherwise, the connection is identified by PCF's default user, "VCAP"
System.setProperty("user.name", mqUserName);
return factory;
}
}
然后是 MQListener,它具有实际的 @JMSListener
public class MQListener {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${mqQueueName}")
private String mqQueueName;
@PostConstruct
public void afteConstruct() {
logger.debug("************* initialized MQ Listener successfully, will read from =" + mqQueueName);
}
@JmsListener(destination = "${mqQueueName}", containerFactory = "myFactory")
public void receiveMessage(String receivedMessage) throws JAXBException, ExecutionException, InterruptedException {
logger.debug("***********************************************receivedMessage:" + receivedMessage);
}
}
这是我的 application.yml
ibm.mq.queueManager: ABCTOD01
ibm.mq.channel: QMD00.SERVER
ibm.mq.connName: mqdv1.devfg.ABC.com
ibm.mq.user: pmd0app1
ibm.mq.password:
consumers:
queueInformationList:
-
mqQueueName: QMD00.D.SRF.PERSON.LITE.PHONE.LOAD
-
mqQueueName: QMD00.D.SRF.PERSON.PHONE.LOAD
最佳答案
好的,我找到了另一篇帖子,其中加里已经回答了我正在寻找的内容 Adding Dynamic Number of Listeners(Spring JMS)
基本上这就是我的工作解决方案。干得好@GaryRussell - 我现在是粉丝了:)
@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
List<QueueInformation> queueInformationList = consumersStatic.getQueueInformationList();
int i = 0;
for (QueueInformation queueInformation :
queueInformationList) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId("myJmsEndpoint-" + i++);
endpoint.setDestination(queueInformation.getMqQueueName());
endpoint.setMessageListener(message -> {
logger.debug("***********************************************receivedMessage:" + message);
});
registrar.registerEndpoint(endpoint);
logger.debug("registered the endpoint for queue" + queueInformation.getMqQueueName());
}
}
关于java - spring jmsListener 监听多个队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55543440/
我使用 Spring 的 @JmsListener (spring-jms-4.3.4.RELEASE.jar) 使用以下代码从 ActiveMQ 接收消息: @Component public cl
我有一个定义 2 个 JMSListener 的类。 1 个监听器用于客户端从使用 JMS 的服务器接收的消息 MyMessage1。另一个是 MyMessage2,它是由另一个程序生成的,而不是使用
我正在尝试使用具有 JMSListener 的 spring boot 启动一个应用程序以连接到外部 ActiveMQ,即使 ActiveMQ 已关闭,此应用程序也需要启动。 我在连接中使用了故障转移
我目前有一个 JMSListener,如下所示。它使用属性文件中的值选择器。这工作得很好。 @JmsListener(destination = "myQueueDest", select
我有一个 JMS 生产者发送两种消息:业务逻辑和心跳消息。目前,两者都由同一个接收器处理,但我现在尝试通过使用选择器为每个接收器提供专用的类。我遇到的问题是,每当我将选择器添加到接收器时,它就会停止接
我有一个 Spring 应用程序,它具有用 Spring 的 @JmsListener 注释的方法。该应用程序部署在多个节点上。在某些特定节点上,我需要禁用 JMS 监听器,以便它不会将消息从队列中拉
我正在使用 Spring 和 Jaxb 来监听 JMSQueue,然后将 JMS 消息解码到一个 Java 对象中。然后我希望在我的@JmsListener 端点上获得该 Java 对象。但是我得到了
我正在开发一项服务,在该服务中我监听队列、反序列化接收到的消息并将它们保存到数据库 (Oracle)。大致: @JmsListener(destination="some-destination")
我正在制作一个应用程序原型(prototype),以测试 future 应用程序的 Spring 消息传递功能。 我知道我们需要的一件事是在同一应用程序中处理来自 activemq 的主题和队列。因此
我目前正在致力于将 IBM Webshere 应用程序迁移到 Spring Boot。 作为其中的一部分,有一个 MDB 类需要转换为 @JmsListener。该 MDB 有一个监听多个队列的方法。
我使用的是 Spring Boot 版本 1.3.2。我正在使用 @JmsListener 来使用来自 activemq 的消息来获取我使用 JmsTemplate 创建/生成的消息。这是代码: @J
我正在遵循在方法级别使用 JmsListener 注释来使用 Spring JMS 的指南。我认为它可以工作,但由于我无法调试在该方法中设置的断点,或者 log4j 日志记录不起作用,甚至简单的 Sy
在这篇文章中,Garry Russell 解释了如何以编程方式创建多个 KafkaListener 来监听多个主题。.[这个设置实际上对我来说很成功] Kafka Spring: How to cre
我可以将多种类型的实例写入给定的目的地,例如: JmsTemplate template = ... Alpha alpha = new Alpha(...); Beta beta = new Bet
我希望能够从 application.properties 设置 @JMSlistener 目标 我的代码是这样的 @Service public class ListenerService {
有没有具体的方法可以做到这一点?我试图在这里找到解决方案,但找不到我需要的东西。我有一个 Spring Boot 应用程序,它将从命令行接受多个参数。有问题的参数是队列名称(即目的地)。它可以是我们众
几个月前我在这篇文章中问了基本相同的问题:How should a Spring JMS listener handle a message with an empty payload? ,但我得到的
我正在尝试基于@JmsListener 注释创建发布-订阅示例:https://github.com/lkrnac/book-eiws-code-samples/tree/master/05-jms/
我的代码中有一个 Spring JmsListener。它接收并使用了 2 天的消息,但是在这 2 天之后它突然没有收到来自外部 activemq 的消息。但是,它的队列中有一些待处理的消息。当我重置
在我的应用程序中,我有消息从一个队列移动到另一个队列,并且我想在日志中添加消息 ID。我试图弄清楚是否可以在实际处理消息之前拦截消息并在 MDC 字段中设置消息 ID,以便我可以在所有队列中跟踪此消息
我是一名优秀的程序员,十分优秀!