MQQueueConnectionFactory对象创建中的NullPointerException

时间:2016-03-01 08:44:44

标签: jms ibm-mq

我在使用v8.0.0.4使用com.ibm.mq.jar实例化MQConnectionFactory()对象时遇到以下错误。虽然在com.ibm.mq.jar v6.0.0.1中工作正常但是正常。

维护ThreadPool大小: - false |最大Thr​​eadPool大小: - -1 | ThreadPool非活动超时: - 0 |不可用 - : - com.ibm.msg.client.commonservices.CSIException:JMSCS0002

  

显示java.lang.NullPointerException       在com.ibm.msg.client.jms.internal.JmsFactoryFactoryImpl.getInstance(JmsFactoryFactoryImpl.java:170)       at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.setProviderFactory(JmsConnectionFactoryImpl.java:167)       在com.ibm.mq.jms.MQConnectionFactory。(MQConnectionFactory.java:271)       在com.ibm.mq.jms.MQQueueConnectionFactory。(MQQueueConnectionFactory.java:72)       在com.SendMessage.putToQueue(SendMessage.java:66)       在com.SendMessage.main(SendMessage.java:123)

//Sending the certs
System.setProperty("javax.net.ssl.trustStore","C:\\trustStore.jks");
System.setProperty("javax.net.ssl.keyStore","C:\\keyStore.jks");
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings","false");

//Check for JCE Unlimited Strength Jurisdiction Policy files 
int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES");
System.out.println(maxKeyLen);

host = s;
channel = s1;
port = j;
requestQ = s2;
factory = new MQQueueConnectionFactory();
factory.setTransportType(mqClient);
factory.setQueueManager(qmgr);
factory.setHostName(host);
factory.setChannel(channel);
factory.setPort(port);


//Use this for SSL ciphersuites 
factory.setSSLCipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA");

connection = factory.createQueueConnection();

session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

int i = 1;
sQueue = new MQQueue();
sQueue.setBaseQueueName(requestQ);
sQueue.setPersistence(-1);
sQueue.setExpiry(0L);
sQueue.setTargetClient(i);
sQueue.setPriority(5);

outTextMessage = session.createTextMessage();
outTextMessage.setText(s3);


sender = session.createSender(sQueue);

sender.send(outTextMessage);
msgId = outTextMessage.getJMSMessageID();
System.out.println(msgId);

sender.close();

session.close();

connection.close();

1 个答案:

答案 0 :(得分:0)

host = s; 
channel = s1; 
port = j; 
requestQ = s2;

在我看来,这是一种奇怪而糟糕的编码。你没有给我所有的代码,而是一个片段,但我可以猜测它来自一个名为putToQueue()的方法。因此,您应该将调用的名称命名为正确的名称,而不是进行无用的编码。

sQueue.setExpiry(0L);

你明白这意味着什么吗?这说消息在零毫秒到期!!!!换句话说,消息基本上会在您将其放入队列的那一刻到期。有点无意义。如果您想要无限制,则删除该行或使用“-1L”(即CMQC.MQEI_UNLIMITED)。

sQueue.setPersistence(-1);

同样,你不理解价值的含义。 “-1”表示对主题使用父持久值。您应该使用0表示非持久性(CMQC.MQPER_NOT_PERSISTENT)或1表示持久性(CMQC.MQPER_PERSISTENT)。

connection = factory.createQueueConnection();

OMG。您是否至少可以“假装”了解安全性并在createQueueConnection()方法调用上设置UserID和Password。

最后,你的start()方法在哪里?

connection = factory.createQueueConnection(userId, password);
connection.start();