Java IBM MQ的深度
您能帮助我吗?我正在尝试通过SSL通道通过PCFAgent查找ibm mq深度Java IBM MQ的深度,java,ssl,ibm-mq,pcf,Java,Ssl,Ibm Mq,Pcf,您能帮助我吗?我正在尝试通过SSL通道通过PCFAgent查找ibm mq深度 Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl"); Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl"); System.s
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
System.setProperty("javax.net.ssl.trustStore","abc-dev.jks");
System.setProperty("javax.net.ssl.trustStorePassword","abcdabcd");
System.setProperty("javax.net.ssl.keyStore", "abc-dev.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "abcdabcd");
MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA";
int attrs[] = { 2016, 3 };
System.out.println("parameter creation");
PCFParameter parameters[] = { new MQCFST(2016, "*"), new MQCFIN(20, 1),
new MQCFIL(1002, attrs) };
String name = null;
Integer depth = null;
System.out.println("parameter creation end");
try {
PCFAgent agent;
if (args.length == 1) {
System.out.print("Connecting to local queue manager " + args[0]
+ "... ");
agent = new PCFAgent(args[0]);
} else {
System.out.print("Connecting to queue manager at " + args[0]
+ ":" + args[1] + " over channel " + args[2] + "... ");
agent = new PCFAgent(args[0], Integer.parseInt(args[1]),
args[2]);
}
System.out.println("Connected.");
System.out.print("Sending PCF request... ");
com.ibm.mq.MQMessage responses[] = agent.send(13, parameters);
System.out.println("Received reply.");
for (int i = 0; i < responses.length; i++) {
MQCFH cfh = new MQCFH(responses[i]);
if (cfh.reason == 0) {
for (int j = 0; j < cfh.parameterCount; j++) {
PCFParameter p = PCFParameter
.nextParameter(responses[i]);
switch (p.getParameter()) {
case 2016:
name = (String) p.getValue();
break;
case 3: // '\003'
depth = (Integer) p.getValue();
break;
}
}
System.out.println("Queue " + name + " curdepth " + depth);
} else {
System.out.println("PCF error:\n" + cfh);
for (int j = 0; j < cfh.parameterCount; j++)
System.out.println(PCFParameter
.nextParameter(responses[0]));
}
}
System.out.print("Disconnecting... ");
agent.disconnect();
System.out.println("Done.");
} catch (ArrayIndexOutOfBoundsException abe) {
System.out
.println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel");
} catch (NumberFormatException nfe) {
System.out.println("Invalid port: " + args[1]);
System.out
.println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel");
} catch (MQException mqe) {
System.err.println(mqe);
} catch (IOException ioe) {
System.err.println(ioe);
}
Security.setProperty(“ssl.SocketFactory.provider”、“com.ibm.jsse2.sslsocketfactorympl”);
setProperty(“ssl.ServerSocketFactory.provider”、“com.ibm.jsse2.sslserversocketfactorympl”);
setProperty(“javax.net.ssl.trustStore”、“abc-dev.jks”);
setProperty(“javax.net.ssl.trustStorePassword”、“abcdabcd”);
setProperty(“javax.net.ssl.keyStore”、“abc-dev.jks”);
setProperty(“javax.net.ssl.keystrepassword”、“abcdabcd”);
MQEnvironment.sslCipherSuite=“TLS\u RSA\u带AES\u 128\u CBC\u SHA”;
int attrs[]={2016,3};
System.out.println(“参数创建”);
PCFParameter参数[]={new MQCFST(2016,“*”),new MQCFIN(20,1),
新的MQCFIL(1002,attrs)};
字符串名称=null;
整数深度=空;
System.out.println(“参数创建结束”);
试一试{
PCF试剂;
如果(args.length==1){
System.out.print(“连接到本地队列管理器”+args[0]
+ "... ");
代理=新的PCFAgent(args[0]);
}否则{
System.out.print(“在“+args[0]处连接到队列管理器”
+“:“+args[1]+”通过通道“+args[2]+”);
agent=new PCFAgent(args[0],Integer.parseInt(args[1]),
args[2]);
}
System.out.println(“已连接”);
系统输出打印(“发送PCF请求…”);
com.ibm.mq.MQMessage responses[]=agent.send(13,参数);
System.out.println(“收到回复”);
对于(int i=0;i
当我尝试远程运行此程序时,出现以下异常:
com.ibm.mq.MQException:MQJE001:完成代码2,原因2035
编辑以添加评论中的其他澄清细节:
MQ管理员在应用程序接收2035命令的同时,在与SYSTEM.DEFAULT.MODEL.QUEUE相关的AMQERR01.LOG
中发现错误
当我取下安全设置和密码套件时,相同的程序适用于非SSL通道。好吧,我看不出您在代码中的何处设置了用户ID。因此,您发送的是一个空的UserID,如果通道的MCAUSER为空,则意味着由于旧的安全漏洞,它将成为“mqm”UserID 对于MQ v7.1或更高版本,如果您在“系统”通道上,则默认的CHLAUTH规则将阻止连接。对于MQ v8.0或更高版本,通道可能需要用户ID和密码。您需要查看事件队列或队列管理器日志,了解2035年RC(未授权)的原因 另外,硬编码值是什么?你是否反编译了其他人的程序 为什么不使用IBM MQ提供的定义?下面是它的外观:
int[] attrs = {
CMQC.MQCA_Q_NAME,
CMQC.MQIA_CURRENT_Q_DEPTH
};
PCFParameter[] parameters = {
new MQCFST (CMQC.MQCA_Q_NAME, "*"),
new MQCFIN (CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL),
new MQCFIL (CMQCFC.MQIACF_Q_ATTRS, attrs)
};
PCFAgent
类为来自命令服务器的响应消息创建一个动态队列。默认情况下,使用的模型队列是SYSTEM.default.model.queue
。用户需要在模型队列上具有OAM权限+get+dsp
如果程序在连接到非SSL通道时工作,则连接必须解析为具有针对SYSTEM.DEFAULT.MODEL.QUEUE
的所需OAM权限的其他用户ID
队列管理器的AMQERR01.LOG
中的错误将显示缺少权限的用户ID以及缺少的特定权限
根据您使用的MQ客户机jar文件的版本,如果未指定用户ID,MQ客户机将发送空白用户ID或java进程正在运行的用户ID。在队列管理器端,如果通道的
MCAUSER
属性为空,则它将继承mqm(如果接收到空的UserID)或进程运行时使用的UserID。如果通道的MCAUSER
属性不为空,则表示将用于权限的用户标识。是否仅针对SSL通道需要设置用户标识和密码?因为当我取下安全设置和密码套件时,相同的程序适用于非SSL通道。如果这是因为它是一个SSL通道,请让我知道我需要在这里设置什么用户ID和密码?你认为呢
int[] attrs = {
CMQC.MQCA_Q_NAME,
CMQC.MQIA_CURRENT_Q_DEPTH
};
PCFParameter[] parameters = {
new MQCFST (CMQC.MQCA_Q_NAME, "*"),
new MQCFIN (CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL),
new MQCFIL (CMQCFC.MQIACF_Q_ATTRS, attrs)
};