Skip to content

Commit e71358a

Browse files
Justin Wilsonmaibin
authored andcommitted
BAEL-503: initial commit of a simple Spring AMQL example application (#1467)
1 parent d66703b commit e71358a

9 files changed

Lines changed: 217 additions & 0 deletions

File tree

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
<module>spring-akka</module>
116116
<module>spring-amqp</module>
117117
<module>spring-all</module>
118+
<module>spring-amqp-simple</module>
118119
<module>spring-apache-camel</module>
119120
<module>spring-batch</module>
120121
<module>spring-boot</module>

spring-amqp-simple/pom.xml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>org.springframework.boot</groupId>
9+
<artifactId>spring-boot-starter-parent</artifactId>
10+
<version>1.5.2.RELEASE</version>
11+
</parent>
12+
13+
<groupId>com.baeldung</groupId>
14+
<artifactId>spring-amqp-simple</artifactId>
15+
<version>1.0.0-SNAPSHOT</version>
16+
<name>Spring AMQP Simple App</name>
17+
18+
<properties>
19+
<java.version>1.8</java.version>
20+
</properties>
21+
22+
<dependencies>
23+
<dependency>
24+
<groupId>org.springframework.boot</groupId>
25+
<artifactId>spring-boot-starter-amqp</artifactId>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-web</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-starter-test</artifactId>
34+
<scope>test</scope>
35+
</dependency>
36+
</dependencies>
37+
38+
<build>
39+
<plugins>
40+
<plugin>
41+
<groupId>org.springframework.boot</groupId>
42+
<artifactId>spring-boot-maven-plugin</artifactId>
43+
</plugin>
44+
</plugins>
45+
</build>
46+
</project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
import org.apache.log4j.LogManager;
4+
import org.apache.log4j.Logger;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class MessageConsumer {
9+
10+
private static final Logger logger = LogManager.getLogger(MessageConsumer.class);
11+
12+
public void receiveMessage(String message) {
13+
logger.info("Received Message: " + message);
14+
}
15+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.web.bind.annotation.RequestBody;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestMethod;
9+
import org.springframework.web.bind.annotation.ResponseStatus;
10+
11+
@Controller
12+
public class MessageController {
13+
14+
private final MessageProducer messageProducer;
15+
16+
@Autowired
17+
public MessageController(MessageProducer messageProducer) {
18+
this.messageProducer = messageProducer;
19+
}
20+
21+
@RequestMapping(value="/messages", method= RequestMethod.POST)
22+
@ResponseStatus(value= HttpStatus.CREATED)
23+
public void sendMessage(@RequestBody String message) {
24+
messageProducer.sendMessage(message);
25+
}
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
import org.springframework.amqp.rabbit.core.RabbitTemplate;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class MessageProducer {
9+
10+
private final RabbitTemplate rabbitTemplate;
11+
12+
@Autowired
13+
public MessageProducer(RabbitTemplate rabbitTemplate) {
14+
this.rabbitTemplate = rabbitTemplate;
15+
}
16+
17+
public void sendMessage(String message) {
18+
rabbitTemplate.convertAndSend(SpringAmqpConfig.queueName, message);
19+
}
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class SpringAmqpApplication {
8+
9+
public static void main(String[] args) throws InterruptedException {
10+
SpringApplication.run(SpringAmqpApplication.class, args);
11+
}
12+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
import org.springframework.amqp.core.*;
4+
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
5+
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
6+
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.context.annotation.Profile;
10+
11+
@Configuration
12+
@Profile("!test")
13+
public class SpringAmqpConfig {
14+
15+
public final static String queueName = "com.baeldung.spring-amqp-simple.queue";
16+
public final static String exchangeName = "com.baeldung.spring-amqp-simple.exchange";
17+
18+
@Bean
19+
Queue queue() {
20+
return new Queue(queueName, false);
21+
}
22+
23+
@Bean
24+
Exchange exchange() {
25+
return new DirectExchange(exchangeName);
26+
}
27+
28+
@Bean
29+
Binding binding(Queue queue, DirectExchange exchange) {
30+
return BindingBuilder.bind(queue).to(exchange).with(queueName);
31+
}
32+
33+
@Bean
34+
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
35+
MessageListenerAdapter listenerAdapter) {
36+
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
37+
container.setConnectionFactory(connectionFactory);
38+
container.setQueueNames(queueName);
39+
container.setMessageListener(listenerAdapter);
40+
return container;
41+
}
42+
43+
@Bean
44+
MessageListenerAdapter listenerAdapter(MessageConsumer messageReceiver) {
45+
return new MessageListenerAdapter(messageReceiver, "receiveMessage");
46+
}
47+
48+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
spring:
2+
rabbitmq:
3+
username: baeldung
4+
password: baeldung
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.springamqpsimple;
2+
3+
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.springframework.amqp.rabbit.core.RabbitTemplate;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.boot.test.mock.mockito.MockBean;
10+
import org.springframework.boot.test.web.client.TestRestTemplate;
11+
import org.springframework.http.HttpStatus;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.test.context.ActiveProfiles;
14+
import org.springframework.test.context.junit4.SpringRunner;
15+
16+
import static org.junit.Assert.assertEquals;
17+
import static org.mockito.Mockito.verify;
18+
19+
@RunWith(SpringRunner.class)
20+
@ActiveProfiles("test")
21+
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
22+
public class MessageControllerTest {
23+
24+
@Autowired
25+
private TestRestTemplate restTemplate;
26+
27+
@MockBean
28+
private RabbitTemplate rabbitTemplate;
29+
30+
@Test
31+
public void whenPostingMessage_thenMessageIsCreated() {
32+
final String message = "Hello World!";
33+
ResponseEntity<Void> responseEntity = restTemplate.postForEntity("/messages", message, Void.class);
34+
35+
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
36+
}
37+
38+
@Test
39+
public void whenPostingMessage_thenMessageIsSentToBroker() {
40+
final String message = "Hello World!";
41+
restTemplate.postForEntity("/messages", message, Void.class);
42+
43+
verify(rabbitTemplate).convertAndSend(SpringAmqpConfig.queueName, message);
44+
}
45+
}

0 commit comments

Comments
 (0)