Skip to content

Commit 4138c2c

Browse files
add spring-jms-listener
1 parent d3c046d commit 4138c2c

File tree

11 files changed

+353
-0
lines changed

11 files changed

+353
-0
lines changed

spring-jms-listener/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# spring-jms-listener
2+
3+
[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=com.codenotfound%3Aspring-jms-listener&metric=alert_status)](https://sonarcloud.io/dashboard?id=com.codenotfound%3Aspring-jms-listener)
4+
5+
A detailed step-by-step tutorial on how a Spring JMS listener works in combination with Spring Boot.
6+
7+
[https://codenotfound.com/spring-jms-listener-example.html](https://codenotfound.com/spring-jms-listener-example.html)

spring-jms-listener/pom.xml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>com.codenotfound</groupId>
7+
<artifactId>spring-jms-listener</artifactId>
8+
<version>0.0.1-SNAPSHOT</version>
9+
10+
<name>spring-jms-listener</name>
11+
<description>Spring JMS Listener Example</description>
12+
<url>https://codenotfound.com/spring-jms-listener-example.html</url>
13+
14+
<parent>
15+
<groupId>org.springframework.boot</groupId>
16+
<artifactId>spring-boot-starter-parent</artifactId>
17+
<version>2.1.1.RELEASE</version>
18+
<relativePath /><!-- lookup parent from repository -->
19+
</parent>
20+
21+
<properties>
22+
<java.version>1.8</java.version>
23+
</properties>
24+
25+
<dependencies>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-activemq</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-starter-test</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.apache.activemq.tooling</groupId>
37+
<artifactId>activemq-junit</artifactId>
38+
<version>${activemq.version}</version>
39+
<scope>test</scope>
40+
</dependency>
41+
</dependencies>
42+
43+
<build>
44+
<plugins>
45+
<plugin>
46+
<groupId>org.springframework.boot</groupId>
47+
<artifactId>spring-boot-maven-plugin</artifactId>
48+
</plugin>
49+
</plugins>
50+
</build>
51+
</project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.codenotfound;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class SpringJmsApplication {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(SpringJmsApplication.class, args);
11+
}
12+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.codenotfound.jms;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.jms.annotation.JmsListener;
8+
import org.springframework.jms.core.JmsTemplate;
9+
import org.springframework.stereotype.Component;
10+
11+
@Component
12+
public class OrderReceiver {
13+
14+
private static final Logger LOGGER =
15+
LoggerFactory.getLogger(OrderReceiver.class);
16+
17+
@Value("${destination.status1}")
18+
private String status1Destination;
19+
20+
@Value("${destination.status2}")
21+
private String status2Destination;
22+
23+
@Autowired
24+
JmsTemplate jmsTemplate;
25+
26+
@JmsListener(destination = "${destination.order}",
27+
containerFactory = "orderJmsListenerContainerFactory")
28+
public void receive(String order) {
29+
LOGGER.info("received order='{}'", order);
30+
jmsTemplate.convertAndSend(status1Destination, "Accepted");
31+
jmsTemplate.convertAndSend(status2Destination, "Accepted");
32+
}
33+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.codenotfound.jms;
2+
3+
import javax.jms.Destination;
4+
import org.apache.activemq.ActiveMQConnectionFactory;
5+
import org.apache.activemq.command.ActiveMQQueue;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.jms.annotation.EnableJms;
10+
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
11+
import org.springframework.jms.config.SimpleJmsListenerEndpoint;
12+
import org.springframework.jms.listener.DefaultMessageListenerContainer;
13+
import org.springframework.jms.listener.SimpleMessageListenerContainer;
14+
15+
@Configuration
16+
@EnableJms
17+
public class ReceiverConfig {
18+
19+
@Value("${activemq.broker-url}")
20+
private String brokerUrl;
21+
22+
@Value("${destination.status1}")
23+
private String status1Destination;
24+
25+
@Value("${destination.status2}")
26+
private String status2Destination;
27+
28+
@Bean
29+
public ActiveMQConnectionFactory receiverActiveMQConnectionFactory() {
30+
ActiveMQConnectionFactory activeMQConnectionFactory =
31+
new ActiveMQConnectionFactory();
32+
activeMQConnectionFactory.setBrokerURL(brokerUrl);
33+
34+
return activeMQConnectionFactory;
35+
}
36+
37+
@Bean
38+
public Destination status2Destination() {
39+
return new ActiveMQQueue(status2Destination);
40+
}
41+
42+
@Bean
43+
public DefaultJmsListenerContainerFactory orderJmsListenerContainerFactory() {
44+
DefaultJmsListenerContainerFactory factory =
45+
new DefaultJmsListenerContainerFactory();
46+
factory
47+
.setConnectionFactory(receiverActiveMQConnectionFactory());
48+
factory.setConcurrency("3-10");
49+
50+
return factory;
51+
}
52+
53+
@Bean
54+
public DefaultMessageListenerContainer orderMessageListenerContainer() {
55+
SimpleJmsListenerEndpoint endpoint =
56+
new SimpleJmsListenerEndpoint();
57+
endpoint.setMessageListener(new StatusMessageListener("DMLC"));
58+
endpoint.setDestination(status1Destination);
59+
60+
return orderJmsListenerContainerFactory()
61+
.createListenerContainer(endpoint);
62+
}
63+
64+
@Bean
65+
public SimpleMessageListenerContainer statusMessageListenerContainer() {
66+
SimpleMessageListenerContainer container =
67+
new SimpleMessageListenerContainer();
68+
container
69+
.setConnectionFactory(receiverActiveMQConnectionFactory());
70+
container.setDestination(status2Destination());
71+
container.setMessageListener(new StatusMessageListener("SMLC"));
72+
73+
return container;
74+
}
75+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.codenotfound.jms;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.jms.core.JmsTemplate;
7+
import org.springframework.stereotype.Component;
8+
9+
@Component
10+
public class Sender {
11+
12+
private static final Logger LOGGER =
13+
LoggerFactory.getLogger(Sender.class);
14+
15+
@Autowired
16+
private JmsTemplate jmsTemplate;
17+
18+
public void send(String message) {
19+
LOGGER.info("sending message='{}'", message);
20+
jmsTemplate.convertAndSend(message);
21+
}
22+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.codenotfound.jms;
2+
3+
import org.apache.activemq.ActiveMQConnectionFactory;
4+
import org.springframework.beans.factory.annotation.Value;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.jms.connection.CachingConnectionFactory;
8+
import org.springframework.jms.core.JmsTemplate;
9+
10+
@Configuration
11+
public class SenderConfig {
12+
13+
@Value("${activemq.broker-url}")
14+
private String brokerUrl;
15+
16+
@Value("${destination.order}")
17+
private String orderDestination;
18+
19+
@Bean
20+
public ActiveMQConnectionFactory senderActiveMQConnectionFactory() {
21+
ActiveMQConnectionFactory activeMQConnectionFactory =
22+
new ActiveMQConnectionFactory();
23+
activeMQConnectionFactory.setBrokerURL(brokerUrl);
24+
25+
return activeMQConnectionFactory;
26+
}
27+
28+
@Bean
29+
public CachingConnectionFactory cachingConnectionFactory() {
30+
return new CachingConnectionFactory(
31+
senderActiveMQConnectionFactory());
32+
}
33+
34+
@Bean
35+
public JmsTemplate orderJmsTemplate() {
36+
JmsTemplate jmsTemplate =
37+
new JmsTemplate(cachingConnectionFactory());
38+
jmsTemplate.setDefaultDestinationName(orderDestination);
39+
40+
return jmsTemplate;
41+
}
42+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.codenotfound.jms;
2+
3+
import java.util.concurrent.CountDownLatch;
4+
import javax.jms.JMSException;
5+
import javax.jms.Message;
6+
import javax.jms.MessageListener;
7+
import javax.jms.TextMessage;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
public class StatusMessageListener implements MessageListener {
12+
13+
private static final Logger LOGGER =
14+
LoggerFactory.getLogger(Sender.class);
15+
16+
private String id;
17+
18+
private CountDownLatch latch = new CountDownLatch(1);
19+
20+
public StatusMessageListener(String id) {
21+
super();
22+
this.id = id;
23+
}
24+
25+
@Override
26+
public void onMessage(Message message) {
27+
if (message instanceof TextMessage) {
28+
try {
29+
String text = ((TextMessage) message).getText();
30+
LOGGER.info("id='{}' received text='{}'", id, text);
31+
latch.countDown();
32+
} catch (JMSException e) {
33+
LOGGER.error("unable to read message payload", e);
34+
}
35+
} else {
36+
LOGGER.error("received unsupported message type");
37+
}
38+
}
39+
40+
public CountDownLatch getLatch() {
41+
return latch;
42+
}
43+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
activemq:
2+
broker-url: tcp://localhost:61616
3+
4+
destination:
5+
order: order.q
6+
status1: status1.q
7+
status2: status2.q
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.codenotfound;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import java.util.concurrent.TimeUnit;
5+
import org.apache.activemq.junit.EmbeddedActiveMQBroker;
6+
import org.junit.ClassRule;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.boot.test.context.SpringBootTest;
11+
import org.springframework.jms.listener.DefaultMessageListenerContainer;
12+
import org.springframework.jms.listener.SimpleMessageListenerContainer;
13+
import org.springframework.test.annotation.DirtiesContext;
14+
import org.springframework.test.context.junit4.SpringRunner;
15+
import com.codenotfound.jms.Sender;
16+
import com.codenotfound.jms.StatusMessageListener;
17+
18+
@RunWith(SpringRunner.class)
19+
@SpringBootTest
20+
@DirtiesContext
21+
public class SpringJmsApplicationTest {
22+
23+
@ClassRule
24+
public static EmbeddedActiveMQBroker broker =
25+
new EmbeddedActiveMQBroker();
26+
27+
@Autowired
28+
private Sender sender;
29+
30+
@Autowired
31+
private DefaultMessageListenerContainer dmlc;
32+
33+
@Autowired
34+
private SimpleMessageListenerContainer smlc;
35+
36+
@Test
37+
public void testReceive() throws Exception {
38+
sender.send("order-002");
39+
40+
StatusMessageListener status1MessageListener =
41+
(StatusMessageListener) dmlc.getMessageListener();
42+
status1MessageListener.getLatch().await(10000,
43+
TimeUnit.MILLISECONDS);
44+
assertThat(status1MessageListener.getLatch().getCount())
45+
.isEqualTo(0);
46+
47+
StatusMessageListener status2MessageListener =
48+
(StatusMessageListener) smlc.getMessageListener();
49+
status2MessageListener.getLatch().await(10000,
50+
TimeUnit.MILLISECONDS);
51+
assertThat(status2MessageListener.getLatch().getCount())
52+
.isEqualTo(0);
53+
}
54+
}

0 commit comments

Comments
 (0)