Java 使用JMS API访问IBM MQ的BOTHRESH值
我正在使用spring boot和mq jms spring boot starter一起创建一个jms侦听器应用程序,该应用程序从队列中读取消息,对其进行处理并将消息转发到另一个队列 在出现有毒消息的情况下,我正在尝试生成警报。但是,为了避免对同一条消息生成多个警报,我考虑将Java 使用JMS API访问IBM MQ的BOTHRESH值,java,spring-boot,websphere,ibm-mq,spring-jms,Java,Spring Boot,Websphere,Ibm Mq,Spring Jms,我正在使用spring boot和mq jms spring boot starter一起创建一个jms侦听器应用程序,该应用程序从队列中读取消息,对其进行处理并将消息转发到另一个队列 在出现有毒消息的情况下,我正在尝试生成警报。但是,为了避免对同一条消息生成多个警报,我考虑将JMSXDeliveryCount与BOTHRESH值进行比较,并在发送到BOQ之前的最后一次重新交付中生成警报 为源队列配置了BOTHRESH和BOQNAME @JmsListener(destination=“${so
JMSXDeliveryCount
与BOTHRESH
值进行比较,并在发送到BOQ之前的最后一次重新交付中生成警报
为源队列配置了BOTHRESH
和BOQNAME
@JmsListener(destination=“${sourceQueue}”)
公共无效处理消息(消息消息){
TextMessage msg=(TextMessage)消息;
int boThresh;
国际再交付计数;
试一试{
boThresh=message.getIntProperty(“”);
redeliveryCount=message.getIntProperty(“JMSXDeliveryCount”);
String processedMessage=this.processMessage(消息);
this.forwardMessage(“destinationQueue”,processedMessage);
}捕获(例外e){
如果(重新交付计数>=boThresh){
//在此处生成警报
}
}
}
我应该如何在此处获取BOTHRESH
的值?有可能吗?我尝试使用getPropertyNames()
方法获取所有可用的属性,下面是我看到的所有属性
JMS\u IBM\u格式
JMS\u IBM\u PutDate
JMS\u IBM\u字符集
JMSXDeliveryCount
JMS\u IBM\u MsgType
JMSXUserID
JMS\u IBM\u编码
JMS\u IBM\u PutTime
JMSXAppID
JMS\u IBM\u putapptype
同时,考虑使用客户端的消费代码来进行监视和警告可能是有问题的,因为它组合了不同的功能。如果您的目标是跟踪无效消息,那么监视DLQ通常是一种更好的设计模式,它可以从您的用户代码中删除“监视”代码。
这样可以做到,但代码确实需要管理员访问管理员通道,这对于客户端应用程序来说可能不是最佳选择 配置import com.ibm.mq.*;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入com.ibm.mq.constants.CMQC;
导入java.util.Hashtable;
@配置
公共类MQConfiguration{
受保护的最终日志记录器=LogFactory.getLog(getClass());
@值(${ibm.mq.queueManager:QM1}”)
公共字符串qMgrName;
@值(${app.mq.admin.channel:DEV.admin.SVRCONN}”)
专用信道;
@值(${app.mq.host:localhost}”)
私有字符串主机;
@值(${app.mq.host.port:1414}”)
专用int端口;
@值(${app.mq.adminuser:admin})
私有字符串管理员用户;
@值(${app.mq.adminpassword:passw0rd})
私有字符串密码;
@豆子
公共MQQueueManager MQQueueManager(){
试一试{
Hashtable connectionProperties=新的Hashtable();
connectionProperties.put(CMQC.CHANNEL\u属性,adminChannel);
connectionProperties.put(CMQC.HOST\u NAME\u属性,HOST);
connectionProperties.put(CMQC.PORT_属性,端口);
connectionProperties.put(CMQC.USER\u ID\u属性,adminUser);
connectionProperties.put(CMQC.PASSWORD\u属性,PASSWORD);
返回新的MQQueueManager(qMgrName,connectionProperties);
}捕获(MQE异常){
logger.warn(“MQException获取MQQueueManager”);
logger.warn(例如getMessage());
}
返回null;
}
}
获取队列的退出阈值
导入com.ibm.mq.*;
导入com.ibm.mq.constants.CMQC;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.boot.CommandLineRunner;
导入org.springframework.context.annotation.Bean;
导入org.springframework.stereotype.Component;
@组成部分
公开课跑者{
受保护的最终日志记录器=LogFactory.getLog(getClass());
@值(${app.mq.queue:DEV.queue.1}”)
私有字符串queueName=“”;
专用最终MQQueueManager MQQueueManager;
运行程序(MQQueueManager MQQueueManager){
this.mqQueueManager=mqQueueManager;
}
@豆子
CommandLineRunner init(){
返回(args)->{
logger.info(“确定回退阈值”);
试一试{
int[]选择器={
CMQC.MQIA_回退_阈值,
CMQC.MQCA_BACKOUT_REQ_Q_NAME};
int[]intAttrs=新int[1];
byte[]charAttrs=新字节[MQC.MQ_Q_NAME_LENGTH];
int openOptions=MQC.MQOO\u INPUT\u AS\u Q\u D