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

0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home