I have 2 queues 1 as listener and the other is used to drop messages to queue,I'm able to read the message but not able to drop it.
Here is the exception I'm getting
JMS attempted to perform an MQOPEN, but IBM MQ reported an error.
Use the linked exception to determine the cause of this error. Check that the specified queue and queue manager are defined correctly.
at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1358)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1313)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.access$800(WMQMessageProducer.java:75)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:900)
at com.ibm.msg.client.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:1288)
at com.ibm.msg.client.wmq.internal.WMQSession.createProducer(WMQSession.java:1128)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1484)
at com.ibm.msg.client.jms.internal.JmsQueueSessionImpl.createSender(JmsQueueSessionImpl.java:121)
at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:143)
at com.ibm.mq.jms.MQQueueSession.createProducer(MQQueueSession.java:248)
at com.cerner.frontend.ftpRouterIn.Utils.MQUtils.send(MQUtils.java:102)
at com.cerner.frontend.ftpRouterIn.listerner.ProcessFtpInQueueListener.onMessage(ProcessFtpInQueueListener.java:93)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:761)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:699)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1186)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1176)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1073)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)```
Here is the code im using it
public void send(SetFileValues afFile, String correlationId, Long expirationTime) throws JMSException {
MessageProducer messageProducer = null;
QueueSession queueSession = null;
QueueConnection queueConnection = null;
TextMessage msg = null;
try {
String message = createMessage(afFile);
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false, 1);
MQQueue mqQueue = new MQQueue();
mqQueue.setBaseQueueName("myQueueName");
Queue queue = mqQueue;
messageProducer = queueSession.createProducer(queue);
msg = queueSession.createTextMessage(message);
msg.setJMSCorrelationID("");
if (expirationTime != null) {
msg.setJMSExpiration(expirationTime);
}
messageProducer.send(msg);
} finally {
try {
if (queueConnection != null) {
queueConnection.close();
}
if (queueSession != null) {
queueSession.close();
}
if (messageProducer != null) {
messageProducer.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Here is my config in spring boot.
@Bean(name = "mqConnectionFactory") public XAQueueConnectionFactory mqCorrespondenceConnectionFactory(SSLContext sslContext) throws JMSException, UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { MQXAQueueConnectionFactory cf = new MQXAQueueConnectionFactory(); cf.setHostName(host); cf.setPort(new Integer(port)); cf.setTransportType(com.ibm.msg.client.wmq.common.CommonConstants.WMQ_CM_CLIENT); cf.setQueueManager(queueManager); cf.setChannel(channel);
if (sslInd) {
cf.setSSLCipherSuite(cipherSuite);
cf.setSSLSocketFactory(sslContext().getSocketFactory());
// To convert JRE CipherSuite to IBM JRE CipherSpec.
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
System.setProperty("com.ibm.mq.cfg.AMQ_DISABLE_CLIENT_AMS", "true");
}
final XAQueueConnectionFactory queueConnectionFactory = cf;
return queueConnectionFactory;
}
@Bean
@Qualifier("listnerQueueName")
public Queue queue() throws JMSException {
return new MQQueue(queueName);
}
@Primary
@Bean
@Qualifier("file2Queue")
public Queue f2queue() throws JMSException {
return new MQQueue(file2Queue);
}
@Bean(name = "cachingConnectionFactory")
public CachingConnectionFactory cachingConnectionFactory()
throws IllegalArgumentException, NoSuchAlgorithmException, JMSException, UnrecoverableKeyException,
KeyManagementException, KeyStoreException, CertificateException, IOException {
CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setSessionCacheSize(5000);
factory.setCacheProducers(true);
factory.setCacheConsumers(true);
factory.setTargetConnectionFactory(mqCorrespondenceConnectionFactory(sslContext()));
factory.setReconnectOnException(true);
factory.afterPropertiesSet();
return factory;
}
@Bean
public MessageListenerContainer listenerContainerOUT(ProcessFtpInQueueListener processFtpInQueueListener)
throws IllegalArgumentException, JMSException, NoSuchAlgorithmException, UnrecoverableKeyException,
KeyStoreException, CertificateException, IOException, KeyManagementException {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(cachingConnectionFactory());
container.setDestinationName(queue().getQueueName());
container.setMessageListener(processFtpInQueueListener);
return container;
}
public SSLContext sslContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
IOException, UnrecoverableKeyException, KeyManagementException {
try (FileInputStream keyStoreInputStream = new FileInputStream(keyStore);
FileInputStream trustStoreInputStream = new FileInputStream(trustStore)) {
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(keyStoreInputStream, keyStorePassword.toCharArray());
KeyStore trustStore = KeyStore.getInstance(trustStoreType);
trustStore.load(trustStoreInputStream, trustStorePassword.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
TrustManagerFactory trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());
trustManagerFactory.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
return sslContext;
}
}
But when I remove the listener it works,Any idea why is this?