Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JMS API访问IBM MQ的BOTHRESH值_Java_Spring Boot_Websphere_Ibm Mq_Spring Jms - Fatal编程技术网

Java 使用JMS API访问IBM MQ的BOTHRESH值

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

我正在使用spring boot和mq jms spring boot starter一起创建一个jms侦听器应用程序,该应用程序从队列中读取消息,对其进行处理并将消息转发到另一个队列

在出现有毒消息的情况下,我正在尝试生成警报。但是,为了避免对同一条消息生成多个警报,我考虑将
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

这听起来像是混合了可重试和不可重试的错误处理。 如果您正在跟踪重新交付并需要发送警报,那么您可能不希望设置BOTHRESH值,而是在客户端代码中对其进行管理

推荐的使用者错误处理模式:

  • 如果消息无效(即错误的JSON或XML),请立即移动到DLQ。消息的质量永远不会提高,没有理由重复重试

  • 如果处理过程中的“下一步”停止(即数据库),则拒绝交付,并允许重新交付延迟和退出重试。这还有一个好处,即允许队列上的其他使用者尝试处理消息,并消除了一个使用者持有消息时存在死路径的问题


  • 同时,考虑使用客户端的消费代码来进行监视和警告可能是有问题的,因为它组合了不同的功能。如果您的目标是跟踪无效消息,那么监视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