如何解决如何解决 - MQJE001:发生 MQException:完成代码 2,原因 2009
连接到 MQQueueManager 时出现异常。异常读取 - MQException:MQJE001:发生 MQException:完成代码 2,原因 2009 MQJE016:MQ 队列管理器在连接期间立即关闭通道 关闭原因 = 2009。下面是我将消息推送到队列的代码。
@SuppressWarnings("unchecked")
public boolean postMessage(String mqMessage,String correlationId) throws TradeException,MQException {
String logStr = TradeUtil.getLoggerPrefix(this.getClass().getSimpleName(),Thread.currentThread().getStackTrace()[1].getmethodName(),"");
boolean result = false;
MQQueueManager queueManager = null;
try {
MQEnvironment.hostname = ConfigFileLoader.getProperty("MQ_HOSTNAME");
MQEnvironment.channel = ConfigFileLoader.getProperty("MQ_CHANNEL");
MQEnvironment.port = Integer.parseInt(ConfigFileLoader.getProperty("MQ_PORT"));
TradeLogger.info(logStr + "MQ HOST NAME : " + MQEnvironment.hostname + " MQ CHANNEL : "
+ MQEnvironment.channel + " MQ PORT : " + MQEnvironment.port);
try {
queueManager = new MQQueueManager(ConfigFileLoader.getProperty("MQ_QUEUE_MANAGER"));
} catch (MQException e) {
TradeLogger.info("queueManager is Busy,try after some time");
Thread.sleep(1000 * 60);
if(maxCount < 3) {
maxCount += 1;
postMessage(mqMessage,correlationId);
}
}
TradeLogger.info(logStr + "MQhostname : " + queueManager + ConfigFileLoader.getProperty("MQ_QUEUE_MANAGER"));
int openoptions = MQC.MQOO_OUTPUT + MQC.MQOO_INPUT_AS_Q_DEF;
MQQueue queue = queueManager.accessQueue(ConfigFileLoader.getProperty("MQ_INPUT_QUEUE_NAME"),openoptions);
TradeLogger.info("INPUT QUEUE NAME : " + queue + ConfigFileLoader.getProperty("MQ_INPUT_QUEUE_NAME"));
if (queueManager.isConnected()) {
TradeLogger.info("queue manager is connected!");
MQPutMessageOptions mqPutMessageOptions = new MQPutMessageOptions();
MQMessage message = new MQMessage();
message.format = MQC.MQFMT_STRING;
message.correlationId = correlationId.getBytes();
message.writeString(mqMessage);
queue.put(message,mqPutMessageOptions);
TradeLogger.info(logStr + "POSTED MESSAGE : " + mqMessage);
result = true;
queue.close();
TradeLogger.info("queue is closed.");
} else {
TradeLogger.error("unable to connect to Queue");
throw new TradeException("Unable to connect to Queue");
}
} catch (MQException e) {
TradeLogger.error(logStr + " MQException : " + e.getMessage());
JSONObject errorjson = new JSONObject();
errorjson.put("errorDesc",e);
throw new TradeException(ResponseStatus.failure,404,"Unable to post message in MQ. Please try after sometime.",errorjson);
} catch (Exception e) {
TradeLogger.error(logStr + " Exception : " + e.getMessage());
JSONObject errorjson = new JSONObject();
errorjson.put("errorDesc","Unable to post message in MQ due to some techical error. Please contact administrator.",errorjson);
} finally {
if (null != queueManager) {
queueManager.disconnect();
TradeLogger.info("queueManager is disconnected!");
}
}
return result;
}
手动重新启动队列管理器后,此问题得到解决。另外,我在某处读到 MQQueueManager() 是同步的。是否有其他线程可能正在访问此队列管理器以建立导致此异常的连接?
解决方法
这不是您得到的 2009 年的答案。我有你的代码的简化版
@SuppressWarnings("unchecked")
public boolean postMessage(String mqMessage,String correlationId) throws MQException {
boolean result = false;
MQQueueManager queueManager = null;
MQQueue queue = null;
MQEnvironment.hostname = "localhost";
MQEnvironment.channel = "SVRCONN_CHN";
MQEnvironment.port = 1414;
try {
queueManager = new MQQueueManager("QM1");
int openOptions = MQC.MQOO_OUTPUT; // Just open for putting message
queue = queueManager.accessQueue("DESTQ",openOptions);
MQPutMessageOptions mqPutMessageOptions = new MQPutMessageOptions();
MQMessage message = new MQMessage();
message.format = MQC.MQFMT_STRING;
message.correlationId = correlationId.getBytes();
message.writeString(mqMessage);
queue.put(message,mqPutMessageOptions);
result = true;
} catch (MQException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (queue != null)
queue.close();
if (queueManager != null)
queueManager.disconnect(); // Call disconnect
}
return result;
}
,
首先,不要使用 MQEnvironment 类,因为它不是线程安全的。我希望 IBM 会弃用该类。您应该将您的连接信息放在一个 Hashtable 中,并将该 Hashtable 传递给 MQQueueManager 对象。
Java 示例:
Hashtable<String,Object> mqht = new Hashtable<String,Object>();
mqht.put(CMQC.CHANNEL_PROPERTY,ConfigFileLoader.getProperty("MQ_CHANNEL"));
mqht.put(CMQC.HOST_NAME_PROPERTY,ConfigFileLoader.getProperty("MQ_HOSTNAME"));
mqht.put(CMQC.PORT_PROPERTY,Integer.parseInt(ConfigFileLoader.getProperty("MQ_PORT"));
mqht.put(CMQC.USER_ID_PROPERTY,ConfigFileLoader.getProperty("MQ_USERID")));
mqht.put(CMQC.PASSWORD_PROPERTY,ConfigFileLoader.getProperty("MQ_PASSWORD")));
queueManager = new MQQueueManager(ConfigFileLoader.getProperty("MQ_QUEUE_MANAGER"),mqht);
C# .NET 示例:
Hashtable mqht = new Hashtable();
mqht.Add(MQC.CHANNEL_PROPERTY,ConfigFileLoader.getProperty("MQ_CHANNEL"));
mqht.Add(MQC.HOST_NAME_PROPERTY,ConfigFileLoader.getProperty("MQ_HOSTNAME"));
mqht.Add(MQC.PORT_PROPERTY,System.Int32.Parse(ConfigFileLoader.getProperty("MQ_PORT"));
mqht.Add(MQC.USER_ID_PROPERTY,ConfigFileLoader.getProperty("MQ_USERID")));
mqht.Add(MQC.PASSWORD_PROPERTY,ConfigFileLoader.getProperty("MQ_PASSWORD")));
mqht.Add(MQC.TRANSPORT_PROPERTY,MQC.TRANSPORT_MQSERIES_MANAGED);
queueManager = new MQQueueManager(ConfigFileLoader.getProperty("MQ_QUEUE_MANAGER"),mqht);
此外,为了适当的安全性,您应该为与队列管理器的连接设置用户 ID 和密码。
最后,确保关闭所有打开的队列,正如 Shashi 在他的代码示例中所指出的那样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。