当前位置: 首页 > 知识库问答 >
问题:

Apache qpid客户端IBMMQ Broker v9.1.0.6请求-回复模式与队列,不工作

澹台昆
2023-03-14

下面是我们试图构建的AMQP客户机的摘要,以使用IBM MQ评估请求/响应消息模式。

当前IBM队列管理器版本=9.1.0.6

具有以下属性的AMQP通道设置,可在

Attributes for COMET.AMQP_SECCLNT
name    COMET.AMQP_SECCLNT
type    AMQP
alteration_date 2021-09-06
alteration_time 08.48.37
no_external_participants    
description COMET Secure SSL Client for AMQP
disc_interval   
hb_interval 
keep_alive_interval 
max_instances   999999999
max_instances_per_client    
max_message_length  4194304
mca_user    
sharing_conversations   
ssl_client_auth REQUIRED
ssl_cipher_spec ECDHE_RSA_AES_256_CBC_SHA384
ssl_peer_name   
cert-label  
status  INACTIVE
canStart    false
canStop false

要通过通道访问现有队列,需要设置订阅-/comet/mediate/claim。订阅已映射到队列endpointCOMET。临时索赔。以下客户端配置为

  1. 发送消息并使用jms关联id从同一队列endpoint拾取消息
  2. 将JMS消息类型设置为MQSTR,而不是MQHRF2
  3. 将对endpoint的回复设置为/comet/middial/claim–创建订阅以访问comet。临时索赔

客户端代码如下

package com.ibm.mq.samples.jms.qpid;

import javax.jms.JMSContext;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import org.apache.qpid.jms.JmsConnectionFactory;

public class TestMessageSender {
       public static void main(String[] args) {

              System.setProperty("javax.net.ssl.keyStore", "cometdesktopmq.jks");
              System.setProperty("javax.net.ssl.trustStore", "cometdesktopmq.jks");
              System.setProperty("javax.net.ssl.keyStorePassword", "<<password>>");
              System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
              try {
                     String requsetUri = "amqps://host_name:5672";
                     String userName = "tgusr";
                     String password = "<<password>>";
                     JmsConnectionFactory factory = new JmsConnectionFactory(userName, password, requsetUri);
                     QueueConnection conn = factory.createQueueConnection();
                     conn.start();
                     System.out.println("conn started");
                     QueueSession sess = conn.createQueueSession(false, 1);
                     System.out.println("queue session created");
                     JMSContext context = factory.createContext(userName, password);
                     System.out.println("context created");
                     Queue q = context.createQueue("/comet/interim/claim");
                     QueueSender qs = sess.createSender(q);
                     System.out.println("queue sender created");
                     TextMessage message = context.createTextMessage("Text content");
                     message.setJMSType("MQSTR");
                     String msgId = message.getJMSMessageID();
                     message.setJMSCorrelationID(msgId);
                     Queue rq = context.createQueue("/comet/interim/claim");
                     message.setJMSReplyTo(rq);
                     qs.send(message);  // Send the message
                     System.out.println("message sent");
                     QueueReceiver reciever = sess.createReceiver(rq, "JMSCorrelationID ='" + msgId + "'");
                     Message reply = reciever.receive(10*1000); // Pickup the message using the id set in correlation id field, timeout = 10 secs
                     Inspector ins = new Inspector(reply);
                     ins.showMessageType();
                     ins.showProperties();
                     ins.showMessageHeaders();
                     ins.showMessageBody();
                     conn.close();
              } catch (Exception e) {
                     e.printStackTrace();
              }
       }
}

在队列COMET上接收的消息。临时索赔如下

RFH [1]\[1] ¸
________________________________________
MQSTR 
MQMD
StrucId:    MD  Version:    1
MsgType:    8   Expiry: -1
Encoding:   546 CodedCharSetId: 1208
Format: MQHRF2  Priority:   0
Report: 0   Feedback:   0
MsgId:  414d5120574d51543532352020202020e4c44561003c722a
CorrelId:   414d5120574d51543532352020202020b6273861033d162d
BackoutCount:   0
AccountingToken:    0531353938370000000000000000000000000000000000000000000000000006
ApplIdentityData:       ApplOriginData: 
ReplyToQ:       ReplyToQMgr:    WMQT525
Persistence:    1   UserIdentifier: mqm
PutApplType:    26  PutApplName:    WMQT525
PutDate:    09/19/2021 22:14:20
GroupId:    000000000000000000000000000000000000000000000000
MsgSeqNumber:   1   Offset: 0
MsgFlags:   0   OriginalLength: -1
Message     
RFH [1]\[1] ¸
________________________________________
MQSTR ¸
________________________________________
ü<mq_amqp><Lis>p910-006-200703</Lis><Ver>1.0</Ver><Hdr><Dur dt='boolean'>1</Dur><Pri dt='i2'>4</Pri><Ttl dt='i8'>0</Ttl><Fac xsi:nil='true'></Fac></Hdr><Prp><Mid>ID:ce297c87-f1f4-46af-8ecb-6f6eb4d97d70:1:1:1-1</Mid><To>/comet/interim/claim</To><Sub>MQSTR</Sub><Rto>/comet/interim/claim</Rto><Aet dt='i8'>0</Aet><Crt dt='i8'>1632107660940</Crt><Gsq dt='i8'>0</Gsq></Prp><Man><x-opt-jms-reply-to>0</x-opt-jms-reply-to><x-opt-jms-dest>0</x-opt-jms-dest><x-opt-jms-msg-type>5</x-opt-jms-msg-type></Man></mq_amqp> 4<jms><Rto>topic:///comet/interim/claim</Rto></jms> Text content

关注-

  1. 格式仍然显示MQHRF2,而不是MQSTR
  2. ReplyToQ属性显示为空。[首先关注的是高优先级]
  3. 消息正文包含as-/comet/middial/claim的标记,这表示什么
  4. 它还包含标签topic:///comet/interim/claim.我们在代码中设置的relyTo目标是一个队列,为什么要将其转换为主题:///

共有1个答案

羊舌高明
2023-03-14

下面是我们试图构建的AMQP客户机的摘要,以使用IBM MQ评估请求/响应消息模式。

当前IBM队列管理器版本=9.1.0.6

如果您想创建一个客户端应用程序来连接到IBMMQ队列管理器,那么为什么不使用MQJava或Java /JMS客户端库来编写它呢?为什么要添加所有这些额外的东西?你给自己带来的麻烦超过了它的价值。

自IBM在IBM MQ v8.0.0.2中添加AMQP通道支持以来,IBM在过去6年中一直在增量地向IBM MQ添加AMQP功能。

您正在使用IBMMQ v9.1,我相信它只支持Pub/Sub,不支持点对点html" target="_blank">消息。对于Pub/Sub,所有消息都将采用JMS消息格式(又名MQRFH2格式)。您应该阅读此页。

如果您将队列管理器升级到IBM MQ v9.2,那么您将获得更多AMQP功能。对于IBM MQ v9.2 AMQP功能,您应该阅读此页面。

 类似资料:
  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 这是文档中的(简化的)示例 文档指出使用是一种反模式,应该避免。但是,它并没有阐明为什么使用以及使用

  • httplib 库主要用来模拟客户端发送 HTTP 请求,类似于 Curl 工具,支持 JQuery 类似的链式操作。使用起来相当的方便;通过如下方式进行安装: go get github.com/astaxie/beego/httplib 如何使用 首先导入包 import ( "github.com/astaxie/beego/httplib" ) 然后初始化请求方法,返回对象 r

  • 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。 下表列出了浏览器端信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息: 信息 描述 Accept 指定浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg Accept-Char

  • 我正在为Angular练习&。 我在从客户端创建查询时遇到了问题。 我已经成功地在后端创建了graphql查询。 无法找到解决方案答案。请帮忙。

  • 我想向https服务器发送POST请求并获得响应。下面是我在curl中所做的,它工作得很好。 这是我在围棋中尝试的代码片段。 程序挂起在最后一行,错误消息为 我觉得我的连接建立代码有问题,而不是服务器的问题,因为服务器与curl完美地工作。