MQ 响应仅写入 1 个请求 JAVA
MQ Response only writing 1 request JAVA
我有一个程序可以一次向队列写入 4 个响应,但它只写入第一个响应,我试过这段代码。但它只向队列写入一个响应。我正在使用 ibm m 队列,以获取所有请求。但是当涉及到将请求放入队列时,第一个响应只是写入并且循环只执行一次。不知道发生了什么
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;
}
你截断了方法的开头部分,所以我猜测 paymentResponse
是一个 ArrayList 对象。
But when it comes to putting request into the queue the first response
is only writing and the loop executes only one time . Dont know what
is happening
您应该使用 IDE 中的调试器,因为没有看到输出,我的第一个猜测是 paymentResponse[1]
为 NULL。因此,它跳出循环并进入异常捕获。因此,只有 1 条消息被放入队列。
您有几项违反编码最佳实践。
- 您的 try/catch 绝不能超宽。即包含多行代码。
- 如果您的代码连接到某个东西,那么您的代码必须确保它正确地断开连接。
- 如果您的代码打开了某些东西,那么您的代码必须确保正确关闭它。
- 永远不要依赖系统为你工作。
- 您在使用变量之前不检查它们。
- 不要使用
MQEnvironment
class 因为它不是线程安全的。
- 您设置了
CCSID
和 Encoding
而不是使用平台默认值。您的数据是否采用与本地平台不同的格式或编码?
- 如果您要向原始请求发送响应消息,则正确的消息类型是
MQMT_REPLY
。
- 为什么要使用
MQPMO_ASYNC_RESPONSE
的 MQPMO 选项?什么对您的回复消息如此重要以至于代码不能等待 MQ 完成?
- 您似乎在使用各种 MQ classes 作为常量。为什么?即
MQC
和 MQConstants
使用 CMQC
class 或 MQConstants
class。不要使用 MQC,因为它已贬值。
- 您没有为队列管理器的连接设置用户 ID 和密码。您应该始终从一开始就实施适当的安全措施。
您的代码应如下所示:
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);
}
}
我有一个程序可以一次向队列写入 4 个响应,但它只写入第一个响应,我试过这段代码。但它只向队列写入一个响应。我正在使用 ibm m 队列,以获取所有请求。但是当涉及到将请求放入队列时,第一个响应只是写入并且循环只执行一次。不知道发生了什么
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;
}
你截断了方法的开头部分,所以我猜测 paymentResponse
是一个 ArrayList 对象。
But when it comes to putting request into the queue the first response is only writing and the loop executes only one time . Dont know what is happening
您应该使用 IDE 中的调试器,因为没有看到输出,我的第一个猜测是 paymentResponse[1]
为 NULL。因此,它跳出循环并进入异常捕获。因此,只有 1 条消息被放入队列。
您有几项违反编码最佳实践。
- 您的 try/catch 绝不能超宽。即包含多行代码。
- 如果您的代码连接到某个东西,那么您的代码必须确保它正确地断开连接。
- 如果您的代码打开了某些东西,那么您的代码必须确保正确关闭它。
- 永远不要依赖系统为你工作。
- 您在使用变量之前不检查它们。
- 不要使用
MQEnvironment
class 因为它不是线程安全的。 - 您设置了
CCSID
和Encoding
而不是使用平台默认值。您的数据是否采用与本地平台不同的格式或编码? - 如果您要向原始请求发送响应消息,则正确的消息类型是
MQMT_REPLY
。 - 为什么要使用
MQPMO_ASYNC_RESPONSE
的 MQPMO 选项?什么对您的回复消息如此重要以至于代码不能等待 MQ 完成? - 您似乎在使用各种 MQ classes 作为常量。为什么?即
MQC
和MQConstants
使用CMQC
class 或MQConstants
class。不要使用 MQC,因为它已贬值。 - 您没有为队列管理器的连接设置用户 ID 和密码。您应该始终从一开始就实施适当的安全措施。
您的代码应如下所示:
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);
}
}