Spring JMS with Websphere MQ (aka MQ Series) -- Part 2 (Sender)
This is the continuation of Spring JMS with Websphere MQ -- Part 1.
Step 5: In Part 1, we configured the Connectionfactory, and in this step configure the JMSTemplate with the @Configurable Spring annotation
package com.myapp.jms;
import java.io.IOException;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
@Configuration
public class MyAppJmsTemplateConfig {
@Value("${my.queue}")
private String myAppQueueName;
@Resource (name = "internalJmsConnectionFactory")
private ConnectionFactory connectionFactory;
@Bean(name = "myAppJmsTemplate")
public JmsTemplate busniessExceptionJmsTemplate() throws JMSException, IOException {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setDefaultDestinationName(myAppQueueName);
return jmsTemplate;
}
}
Step 6: Define the Spring context xml file META-INF/spring/myApp-applicationContext.xml file.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:jms="http://www.springframework.org/schema/integration/jms"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">
<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false" />
<property name="location" value="classpath:calculation/validation.properties" />
</bean>
<context:component-scan base-package="com.myapp.jms">
</beans>
Step 7: Define the message sender class that publishes the message to the default queue that was configured earlier.
package com.myapp.service.impl;
import com.google.common.base.Stopwatch;
import com.myapp.service.MyAppService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.annotation.concurrent.ThreadSafe;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
/**
* Asynchronously submits a string to the JMS queue
*/
@Component
@ThreadSafe
public class MyAppServiceImpl implements MyAppService
{
private static final Logger LOG = LoggerFactory.getLogger(MyAppServiceImpl.class);
@Resource(name = "myAppJmsTemplate")
private JmsTemplate jmsTemplate;
@Value("${my.publishers.count}")
int publisherCount;
private ExecutorService pooledSender;
@PostConstruct
void init()
{
pooledSender = Executors.newFixedThreadPool(publisherCount);
}
@Override
public void send(final String msg)
{
pooledSender.execute(new Runnable()
{
@Override
public void run()
{
send(msg);
}
private void send(final String msg, int retryCount)
{
Stopwatch stopwatch = new Stopwatch().start();
try
{
jmsTemplate.send(new MessageCreator()
{
@Override
public Message createMessage(Session session) throws JMSException
{
return session.createTextMessage(msg);
}
});
}
catch (Exception e)
{
LOG.warn("Unable to send message to JMS Queue {}", msg);
}
LOG.info(" message sent to JMS Queue in {} ms", stopwatch.elapsedMillis());
}
});
}
}
Step 8: Finally, the JUnit test class that
package com.myapp.service.impl;
import com.myapp.service.MyAppExecutionService;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:META-INF/spring/myApp-applicationContext.xml")
@PropertySource(
{
"classpath:jms/internalConnection.properties"
})
public class MyAppServiceImplSenderIntegrationTest
{
private static final Logger LOG = LoggerFactory.getLogger(MyAppServiceImplSenderIntegrationTest.class);
@Resource
private MyAppExecutionService executionService;
@Test
public void myAppIntegrationTest()
{
for (int i = 0; i < 1; i++)
{
final Map<String, String> detailMap = new HashMap<String, String>();
detailMap.put("KeyA", "ValueA" + i);
detailMap.put("KeyB", "ValueB" + i);
executionService.send(detailMap.toString());
}
}
}
Labels: JMS, Websphere MQ

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