Spring JMS with Websphere MQ (aka MQ Series) -- Part 1 (configuration)
Messaging systems are used in enterprise applications for scalability. Here is the series of JMS tutorials. Stay tuned for more parts to follow.
Step 1: Add the relevant dependency jars to the pom.xml file.
<!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> </dependency> <!-- JMS/MQ --> <dependency> <groupId>com.ibm.webshere.mq7</groupId> <artifactId>commonservices</artifactId> </dependency> <dependency> <groupId>com.ibm.webshere.mq7</groupId> <artifactId>com-ibm-mqjms</artifactId> </dependency> <dependency> <groupId>com.ibm.webshere.mq7</groupId> <artifactId>com-ibm-mq</artifactId> </dependency> <dependency> <groupId>com.ibm.webshere.mq7</groupId> <artifactId>dhbcore</artifactId> </dependency> <dependency> <groupId>com.ibm.webshere.mq7</groupId> <artifactId>com-ibm-mq-jmqi</artifactId> </dependency> <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </dependency> <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </dependency>
Step 2: Define the JMS properties jms/internalConnection.properties as shown below
#connection factory properties
jms.transportType=1 # i.e. TCP jms.hostName=your_host jms.channel=your.channel jms.port=1414 jms.queueManager=your.que.manager jms.sslEnabled=false jms.sslCipherSuite= jms.ssl.keystore.path= jms.ssl.password=
#destination property
my.queueName=my.queue
Step 3: An abstract class that configures the ConnectionFactory.
package com.myapp.jms; import java.util.Properties; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.DefaultConversionService; import com.ibm.mq.jms.MQConnectionFactory; import com.ibm.mq.jms.MQQueueConnectionFactory; public class AbstractMqJmsConnectionConfig { private static final Logger LOG = LoggerFactory.getLogger(AbstractMqJmsConnectionConfig.class); private final ConfigurableConversionService conversionService = new DefaultConversionService(); protected ConnectionFactory createQueueConnectionFactory(Properties properties) throws JMSException { MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory(); setConnectionFactoryProperties(connectionFactory, properties); return connectionFactory; } private void setConnectionFactoryProperties(MQConnectionFactory connectionFactory, Properties properties) throws JMSException { connectionFactory.setTransportType(conversionService.convert(properties.getProperty("jms.transportType"), Integer.class)); connectionFactory.setHostName(properties.getProperty("jms.hostName")); connectionFactory.setChannel(properties.getProperty("jms.channel")); connectionFactory.setPort(conversionService.convert(properties.getProperty("jms.port"), Integer.class)); connectionFactory.setQueueManager(properties.getProperty("jms.queueManager")); connectionFactory.setClientID(properties.getProperty("jms.clientid")); if (conversionService.convert(properties.getProperty("jms.sslEnabled"), Boolean.class)) { setSSLSystemProperties(properties); connectionFactory.setSSLCipherSuite(properties.getProperty("jms.sslCipherSuite")); } } private void setSSLSystemProperties(Properties properties) { String sslkeystoreFullPath = properties.getProperty("jms.ssl.keystore.path"); LOG.info("Setting sslkeystoreFullPath : {}", sslkeystoreFullPath); System.setProperty("javax.net.ssl.keyStore", sslkeystoreFullPath); System.setProperty("javax.net.ssl.keyStorePassword", properties.getProperty("jms.ssl.password")); } }Note: The ConfigurableConversionService utility class from spring is handy to convert string property values to relevant data types like Integer, Boolean, etc.
Step 4: Define the concrete class that loads the internalConnection.properties and has the Spring @Configuration annotation for the Spring dependency injection.
package com.myapp.jms; import java.io.IOException; import java.util.Properties; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @Configuration public class InternalJmsConnectionFactoryConfig extends AbstractMqJmsConnectionConfig { @Bean (name="internalJmsConnectionFactory") protected ConnectionFactory createQueueConnectionFactory() throws JMSException, IOException { return createQueueConnectionFactory(internalUMJMSProperties()); } private Properties internalJMSProperties() throws IOException { PropertiesFactoryBean factory = new PropertiesFactoryBean(); factory.setLocation(new ClassPathResource("jms/internalConnection.properties")); factory.afterPropertiesSet(); return factory.getObject(); } }
More on JMS
Labels: JMS, Websphere MQ