MQ响应仅写入1个JAVA请求
我有一个程序一次向队列写入4个响应,但它只是写入第一个响应,我尝试了以下代码。但它只向队列写入一个响应。我使用一个IBMM队列,以获得所有的请求。但当将请求放入队列时,第一个响应只是写入,循环只执行一次。我不知道发生了什么事MQ响应仅写入1个JAVA请求,java,ibm-mq,Java,Ibm Mq,我有一个程序一次向队列写入4个响应,但它只是写入第一个响应,我尝试了以下代码。但它只向队列写入一个响应。我使用一个IBMM队列,以获得所有的请求。但当将请求放入队列时,第一个响应只是写入,循环只执行一次。我不知道发生了什么事 MQQueueManager queueManager = null; MQQueue queue = null; try { String queueManagerName = "TEST";`
MQQueueManager queueManager = null;
MQQueue queue = null;
try {
String queueManagerName = "TEST";`
String queueName = "REPONSE_QUEUE";
String port = "1452";
String host = "DESKTOP-32F2BVV";
String chanel = "NEW";
log.info("Queue Manager Name : " + queueManagerName);
log.info("Queue Name : " + queueName);
log.info("Port : " + port);
log.info("Host : " + host);
log.info("Chanel : " + chanel);
if (null != host && host != "" && host.trim().length() > 0) {
MQEnvironment.hostname = host;
}
if (null != port && port != "" && port.trim().length() > 0) {
MQEnvironment.port = Integer.parseInt(port);
}
if (null != chanel && chanel != "" && chanel.trim().length() > 0) {
MQEnvironment.channel = chanel;
}
queueManager = new MQQueueManager(queueManagerName.trim());
int option = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
log.info("Open Option : " + option);
queue = queueManager.accessQueue(queueName.trim(), option, null, null, null);
for(int i=0;i<paymentResponse.size();i++) {
System.out.println(paymentResponse.size());
System.out.println(paymentResponse.get(i));
MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options = MQConstants.MQPMO_ASYNC_RESPONSE;
MQMessage mqMessage = new MQMessage();
// mqMessage.messageId = messageId.getBytes();
mqMessage.format = MQC.MQFMT_STRING;
mqMessage.feedback = MQC.MQFB_NONE;
mqMessage.messageType = MQC.MQMT_DATAGRAM;
mqMessage.characterSet = 1208;
mqMessage.encoding = 546;
// mqMessage.replyToQueueName = replayQueue.trim();
// mqMessage.replyToQueueManagerName = replayQueueManager.trim();
// mqMessage.writeUTF(paymentRequest);
// mqMessage.writeString(paymentRequest);
byte[] bytes = paymentResponse.get(i).getBytes("UTF-8");
mqMessage.write(bytes, 0, bytes.length);
queue.put(mqMessage, pmo);
}
} catch (MQException e) {
System.out.println(e);
} catch (Exception e) {
System.out.println(e);
}
return null;
}
MQQueueManager=null;
MQQueue=null;
试一试{
字符串queueManagerName=“TEST”`
字符串queueName=“响应队列”;
字符串端口=“1452”;
String host=“DESKTOP-32F2BVV”;
字符串香奈儿=“新”;
log.info(“队列管理器名称:”+queueManagerName);
log.info(“队列名称:”+queueName);
日志信息(“端口:”+端口);
log.info(“主机:+Host”);
日志信息(“香奈儿:“+香奈儿”);
if(null!=主机和主机!=“”和主机.trim().length()>0){
MQEnvironment.hostname=主机;
}
如果(null!=端口和端口!=“”和端口.trim().length()>0){
MQEnvironment.port=Integer.parseInt(端口);
}
if(null!=香奈儿和香奈儿!=“”和香奈儿.trim().length()>0){
MQEnvironment.channel=chanel;
}
queueManager=新的MQQueueManager(queueManagerName.trim());
int option=MQC.MQOO_输出+MQC.MQOO_失败(如果停止);
log.info(“打开选项:+选项”);
queue=queueManager.accessQueue(queueName.trim(),option,null,null,null);
对于(inti=0;i您截断了方法的开始部分,因此我猜测paymentResponse
是一个ArrayList对象
但在将请求放入队列时,第一个响应
只是写入,循环只执行一次。不知道是什么
正在发生
MQQueueManager queueManager = null;
MQQueue queue = null;
try {
String queueManagerName = "TEST";`
String queueName = "REPONSE_QUEUE";
String port = "1452";
String host = "DESKTOP-32F2BVV";
String chanel = "NEW";
log.info("Queue Manager Name : " + queueManagerName);
log.info("Queue Name : " + queueName);
log.info("Port : " + port);
log.info("Host : " + host);
log.info("Chanel : " + chanel);
if (null != host && host != "" && host.trim().length() > 0) {
MQEnvironment.hostname = host;
}
if (null != port && port != "" && port.trim().length() > 0) {
MQEnvironment.port = Integer.parseInt(port);
}
if (null != chanel && chanel != "" && chanel.trim().length() > 0) {
MQEnvironment.channel = chanel;
}
queueManager = new MQQueueManager(queueManagerName.trim());
int option = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
log.info("Open Option : " + option);
queue = queueManager.accessQueue(queueName.trim(), option, null, null, null);
for(int i=0;i<paymentResponse.size();i++) {
System.out.println(paymentResponse.size());
System.out.println(paymentResponse.get(i));
MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options = MQConstants.MQPMO_ASYNC_RESPONSE;
MQMessage mqMessage = new MQMessage();
// mqMessage.messageId = messageId.getBytes();
mqMessage.format = MQC.MQFMT_STRING;
mqMessage.feedback = MQC.MQFB_NONE;
mqMessage.messageType = MQC.MQMT_DATAGRAM;
mqMessage.characterSet = 1208;
mqMessage.encoding = 546;
// mqMessage.replyToQueueName = replayQueue.trim();
// mqMessage.replyToQueueManagerName = replayQueueManager.trim();
// mqMessage.writeUTF(paymentRequest);
// mqMessage.writeString(paymentRequest);
byte[] bytes = paymentResponse.get(i).getBytes("UTF-8");
mqMessage.write(bytes, 0, bytes.length);
queue.put(mqMessage, pmo);
}
} catch (MQException e) {
System.out.println(e);
} catch (Exception e) {
System.out.println(e);
}
return null;
}
您应该使用IDE中的调试器,因为在没有看到输出的情况下,我的第一个猜测是paymentResponse[1]
为空。因此,它跳出循环并进入异常捕获。因此,只有1条消息被放入队列
您有几个项目不符合编码最佳实践
您的try/catch永远不应该是超宽的,即包含许多行代码
如果您的代码连接到某个东西,那么您的代码必须确保它正确地与之断开连接
如果您的代码打开了某个东西,那么您的代码必须确保它正确地关闭它
永远不要依靠一个系统为你工作
在使用变量之前,不必检查它们
不要使用MQEnvironment
类,因为它不是线程安全的
您设置了CCSID
和Encoding
而不是使用平台默认值。您的数据的格式或编码是否与本地平台不同
如果向原始请求发送响应消息,则正确的消息类型为MQMT\u REPLY
为什么要使用MQPMO\u ASYNC\u RESPONSE
的MQPMO选项?回复消息中有什么如此重要,以至于代码无法等待MQ完成
您似乎使用了一系列MQ类作为常量。为什么?即MQC
和MQConstants
使用CMQC
类或MQConstants
类。不要使用MQC,因为它会贬值
您没有为与队列管理器的连接设置用户标识和密码。您应该始终从一开始就实施适当的安全性
您的代码应该是这样的:
String qMgrName = "TEST";
String queueName = "REPONSE_QUEUE";
String port = "1452";
String host = "DESKTOP-32F2BVV";
String channel = "NEW";
String userId = "myUser";
String password = "myPwd";
MQQueueManager qMgr = null;
MQQueue queue = null;
Hashtable<String,Object> mqht = new Hashtable<String,Object>();
int option = CMQC.MQOO_OUTPUT + CMQC.MQOO_FAIL_IF_QUIESCING;
MQMessage mqMessage;
byte[] bytes = new byte[0];
if (null != host && host != "" && host.trim().length() > 0)
mqht.put(CMQC.HOST_NAME_PROPERTY, host.trim());
if (null != port && port != "" && port.trim().length() > 0) {
try {
mqht.put(CMQC.PORT_PROPERTY, new Integer(Integer.parseInt(port.trim())));
} catch (NumberFormatException e) {
mqht.put(CMQC.PORT_PROPERTY, new Integer(1414)); // default value
}
}
if (null != channel && channel != "" && channel.trim().length() > 0)
mqht.put(CMQC.CHANNEL_PROPERTY, channel.trim());
if (null != userId && userId != "" && userId.trim().length() > 0)
mqht.put(CMQC.USER_ID_PROPERTY, userId.trim());
if (null != password && password != "" && password.trim().length() > 0)
mqht.put(CMQC.PASSWORD_PROPERTY, password.trim());
try {
qMgr = new MQQueueManager(qMgrName.trim(), mqht);
queue = qMgr.accessQueue(queueName.trim(), option);
System.out.println(paymentResponse.size());
for(int i=0; i < paymentResponse.size(); i++) {
System.out.println(paymentResponse.get(i));
if (null != paymentResponse.get(i)) {
mqMessage = new MQMessage();
mqMessage.format = CMQC.MQFMT_STRING;
mqMessage.messageType = CMQC.MQMT_REPLY;
try {
bytes = paymentResponse.get(i).getBytes("UTF-8");
mqMessage.write(bytes, 0, bytes.length);
queue.put(mqMessage, new MQPutMessageOptions());
} catch (MQException e) {
System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
} catch (IOException e) {
System.out.println(e);
} catch (Exception e) {
System.out.println(e);
}
}
}
} catch (MQException e) {
System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
} catch (Exception e) {
System.out.println(e);
}
finally
{
try {
if (queue != null) {
queue.close();
System.out.println("closed: "+ queueName);
}
} catch (MQException e) {
System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
try {
if (qMgr != null) {
qMgr.disconnect();
System.out.println("disconnected from "+ qMgrName);
}
} catch (MQException e) {
System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
}
String qMgrName=“TEST”;
字符串queueName=“响应队列”;
字符串端口=“1452”;
String host=“DESKTOP-32F2BVV”;
字符串通道=“新建”;
字符串userId=“myUser”;
字符串password=“myPwd”;
MQQueueManager qMgr=null;
MQQueue=null;
Hashtable mqht=新的Hashtable();
int option=CMQC.MQOO_输出+CMQC.MQOO_失败(如果停止);
MQMessage MQMessage;
字节[]字节=新字节[0];
if(null!=主机和主机!=“”和主机.trim().length()>0)
mqht.put(CMQC.HOST_NAME_属性,HOST.trim());
如果(null!=端口和端口!=“”和端口.trim().length()>0){
试一试{
put(CMQC.PORT_属性,新整数(Integer.parseInt(PORT.trim())));
}捕获(数字格式){
mqht.put(CMQC.PORT_属性,新整数(1414));//默认值
}
}
if(null!=通道和通道!=“”和通道.trim().length()>0)
mqht.put(CMQC.CHANNEL_属性,CHANNEL.trim());
if(null!=userId&&userId!=“&&userId.trim().length()>0)
mqht.put(CMQC.USER_ID_属性,userId.trim());
if(null!=密码和密码!=“”和密码.trim().length()>0)
mqht.put(CMQC.PASSWORD_属性,PASSWORD.trim());
试一试{
qMgr=新的MQQueueManager(qMgrName.trim(),mqht);
queue=qMgr.accessQueue(queueName.trim(),option);
System.out.println(paymentResponse.size());
对于(int i=0;i