There are several ways to connect to IBM MQ:-
com.ibm.mq.MQQueueManager
com.ibm.mq.jms.MQQueueConnectionFactory
com.ibm.msg.client.jms.JmsConnectionFactory
This article shows you how to connect with Spring’s JmsTemplate
.
CONNECTIVITY INFO
Typically, the MQ admin will provide the following connectivity info that allows you to connect to MQ:-
- Queue manager name, ex:
MY.QUEUE.MANAGER
- Host name, ex:
server.com
- Port, ex:
1415
- Channel name, ex:
MY.SSL.CHANNEL
- SSL Cipher Suite, ex:
SSL_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- User, ex:
user
- Password, ex:
password
- Queue name, ex:
MY.QUEUE
DEPENDENCY
Add the following dependency:-
dependencies {
compile 'com.ibm.mq:mq-jms-spring-boot-starter:2.1.1'
}
SPRING CONFIGURATION
While the connectivity info can be hardcoded in Spring Boot’s application.properties
, it’s probably more logical to use Spring @Configuration
to dynamically set the values especially dealing with credential.
So, create a Spring configuration that looks something like this:-
// while all the value are hardcoded here for simplicity sake, you can inject
// sensitive values from DB, through <code>Environment</code>, etc.
@EnableJms
@Configuration
class JmsConfig {
// Adding @Primary will force Spring Boot to use this bean
// instead of the one provided by the dependency
@Primary
@Bean
MQConfigurationProperties mqConfigurationProperties() {
System.setProperty('javax.net.ssl.keyStore', '/path/to/keystore.jks')
System.setProperty('javax.net.ssl.keyStorePassword', 'XXXXXXX')
return new MQConfigurationProperties(
queueManager: 'MY.QUEUE.MANAGER',
channel: 'MY.SSL.CHANNEL',
connName: 'server.com(1415)',
user: 'user',
password: 'password',
userAuthenticationMQCSP: true,
// If the provided SSL cipher suite begins with "SSL",
// replace it with "TLS" instead.
// SSL_* is IBM JRE CipherSuite name.
// TLS_* is Oracle JRE CipherSuite name.
sslCipherSuite: 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256',
// true - if using IBM JRE
// false - if using non-IBM JRE, ex: Oracle, OpenJDK, etc
useIBMCipherMappings: false
)
}
}
USING JMS TEMPLATE
Finally, to listen to the given queue, it is as easy as autowiring JmsTemplate
and start using it.
@Autowired
JmsTemplate jmsTemplate
...
final Message message = jmsTemplate.receive('MY.QUEUE')
println message
Leave a Reply