【发布时间】:2021-03-26 21:51:37
【问题描述】:
我正在使用带有 mq-jms-spring-boot-starter 的 Spring Boot 创建一个 JMS 侦听器应用程序,该应用程序从队列中读取消息,对其进行处理并将消息转发到另一个队列。
如果出现有毒消息情况,我会尝试生成警报。但是,为了不对同一消息生成多个警报,我正在考虑将 JMSXDeliveryCount 与 BOTHRESH 值进行比较,并在发送到 BOQ 之前的最后一次重新交付中生成警报。
为源队列配置BOTHRESH 和BOQNAME。
@JmsListener(destination = "${sourceQueue}")
public void processMessages(Message message) {
TextMessage msg = (TextMessage) message;
int boThresh;
int redeliveryCount;
try {
boThresh = message.getIntProperty("<WHAT COMES HERE>");
redeliveryCount = message.getIntProperty("JMSXDeliveryCount");
String processedMessage = this.processMessage(message);
this.forwardMessage("destinationQueue", processedMessage);
} catch (Exception e) {
if (redeliveryCount >= boThresh) {
//generate alert here
}
}
}
我应该如何在这里获得BOTHRESH 的值?有可能吗?我尝试使用getPropertyNames() 方法获取所有可用属性,以下是我看到的所有属性。
JMS_IBM_FormatJMS_IBM_PutDateJMS_IBM_Character_SetJMSXDeliveryCountJMS_IBM_MsgTypeJMSXUserIDJMS_IBM_EncodingJMS_IBM_PutTimeJMSXAppIDJMS_IBM_PutApplType
【问题讨论】:
-
如果您为队列定义了 BOTHRESH 和 BOQNAME 属性,MQ JMS 会自动将有害消息(主要是在传递计数超过 BOTHRESH 时)移动到 BOQNAME。
-
@Shashi,是的,没错。但我需要在将有害消息移动到 BOQNAME 之前从 Java 应用程序生成警报。而且我只想为一条消息生成一次此警报。
-
BOTHRESH 和 BOQNAME 或 IBM MQ 特定队列属性,它们不是 JMS 规范的一部分。因此,您无法使用 JMS API 获取这些详细信息。为此,您将需要 IBM MQ 提供的 PCF 类。为什么不在消息到达 BOQ 后生成警报?
-
@Shashi 我明白了。那时我将不得不考虑另一种方法。 BOQ 可能包含其他不相关的消息,因此可能是不可能的。感谢您的评论。
标签: java spring-boot websphere ibm-mq spring-jms