Проблема была решена после прочтения документа https://docs.solace.com/Solace-JMS-API/Creating-Durable-Topic-S.htm.
У меня есть 2 подписки, и я не смог добавить подписку в аннотации. Если имя подписки отсутствует, Spring будет использовать имя по умолчанию «org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter» в качестве имени подписки. Согласно документу, один сеанс не может подписаться на одну и ту же конечную точку темы дважды. Так что была выдана ошибка.
Мой наконец-то потребительский код выглядит так:
@Component
@Slf4j
public class MessageConsumer {
@JmsListener(destination = "com.schindler.ioee.gdcs.Callback", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Callback")
public void processCallback(Message message) {
// message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());
}
@JmsListener(destination = "com.schindler.ioee.gdcs.Symptom", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Symptom")
public void processSymptom(Message message) {
// message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());
}
@JmsListener(destination = "com.schindler.ioee.gdcs.Equipment", containerFactory = "pubSubContainerFactory", subscription = "com.schindler.ioee.gdcs.Equipment")
public void processEquipment(Message message) {
// message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), message.getPayload());
}
@JmsListener(destination = "t/cn/rtc/*/status", subscription = "sms_mqtt_subscription", containerFactory = "pubSubContainerFactory")
public void processStatus(Message message) {
// message.getHeaders().entrySet().forEach(item -> log.info("{}:{}", item.getKey(), item.getValue()));
log.info("[CONSUMER] topic={}, message={}", message.getHeaders().get("jms_destination"), new String((byte[]) message.getPayload()));
}
}