Skip to content

Commit ccb60b2

Browse files
committed
[JMS] Added ActiveMQ integration
1 parent 1a02f4d commit ccb60b2

17 files changed

+375
-3
lines changed

pom.xml

+9
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@
5656
<groupId>org.springframework.boot</groupId>
5757
<artifactId>spring-boot-starter-security</artifactId>
5858
</dependency>
59+
<dependency>
60+
<groupId>org.springframework.boot</groupId>
61+
<artifactId>spring-boot-starter-activemq</artifactId>
62+
</dependency>
5963
<dependency>
6064
<groupId>org.springframework.security</groupId>
6165
<artifactId>spring-security-test</artifactId>
@@ -98,6 +102,11 @@
98102
<version>${nosqlunit.version}</version>
99103
<scope>test</scope>
100104
</dependency>
105+
<dependency>
106+
<groupId>org.apache.activemq</groupId>
107+
<artifactId>activemq-amqp</artifactId>
108+
<version>5.15.2</version>
109+
</dependency>
101110
</dependencies>
102111

103112
<build>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.gluecoders.library.events;
2+
3+
import org.gluecoders.library.services.notifiers.EventHandler;
4+
5+
import java.io.Serializable;
6+
7+
/**
8+
* Created by Anand Rajneesh on 12/2/2017.
9+
*/
10+
public abstract class Event implements Serializable{
11+
12+
protected final String eventType;
13+
14+
public Event(String eventType) {
15+
this.eventType = eventType;
16+
}
17+
18+
public String getEventType() {
19+
return eventType;
20+
}
21+
22+
public abstract void accept(EventHandler handler);
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.gluecoders.library.events;
2+
3+
import java.util.function.Supplier;
4+
5+
/**
6+
* Created by Anand Rajneesh on 12/2/2017.
7+
*/
8+
public enum Events implements Supplier<String> {
9+
10+
NEW_MEMBER;
11+
12+
@Override
13+
public String get() {
14+
return this.name();
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.gluecoders.library.events;
2+
3+
import org.gluecoders.library.models.Member;
4+
import org.gluecoders.library.services.notifiers.EventHandler;
5+
6+
/**
7+
* Created by Anand Rajneesh on 12/2/2017.
8+
*/
9+
public class RegistrationEvent extends Event {
10+
11+
private final String username;
12+
13+
public RegistrationEvent(Member member) {
14+
super(Events.NEW_MEMBER.get());
15+
username = member.getEmail();
16+
}
17+
18+
@Override
19+
public void accept(EventHandler handler) {
20+
handler.handle(this);
21+
}
22+
23+
public String getUsername() {
24+
return username;
25+
}
26+
}

src/main/java/org/gluecoders/library/rest/Registration.java

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
1111
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.beans.factory.annotation.Qualifier;
1213
import org.springframework.http.MediaType;
1314
import org.springframework.http.ResponseEntity;
1415
import org.springframework.web.bind.annotation.PostMapping;
@@ -26,6 +27,7 @@ public class Registration {
2627
private static final Logger LOGGER = LoggerFactory.getLogger(Registration.class);
2728

2829
@Autowired
30+
@Qualifier("registrationService")
2931
private RegistrationService registrationService;
3032

3133
@Autowired

src/main/java/org/gluecoders/library/services/DefaultRegistrationService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
/**
1818
* Created by Anand_Rajneesh on 7/1/2017.
1919
*/
20-
@Component
20+
@Component("defaultRegistrationService")
2121
public class DefaultRegistrationService implements RegistrationService {
2222

2323
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultRegistrationService.class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.gluecoders.library.services;
2+
3+
import org.gluecoders.library.events.RegistrationEvent;
4+
import org.gluecoders.library.exceptions.ResourceAlreadyExistsException;
5+
import org.gluecoders.library.models.Credentials;
6+
import org.gluecoders.library.models.Member;
7+
import org.gluecoders.library.services.notifiers.JmsSender;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.beans.factory.annotation.Qualifier;
12+
import org.springframework.stereotype.Component;
13+
14+
/**
15+
* Created by Anand Rajneesh on 12/2/2017.
16+
*/
17+
@Component("registrationService")
18+
public class NotifyingRegistrationService implements RegistrationService {
19+
20+
private static final Logger LOGGER = LoggerFactory.getLogger(NotifyingRegistrationService.class);
21+
22+
@Autowired
23+
@Qualifier("defaultRegistrationService")
24+
private RegistrationService registrationService;
25+
26+
@Autowired
27+
private JmsSender jmsSender;
28+
29+
@Override
30+
public Member register(Credentials credentials) throws ResourceAlreadyExistsException {
31+
Member member = registrationService.register(credentials);
32+
LOGGER.info("Notifying registration event");
33+
RegistrationEvent registrationEvent = new RegistrationEvent(member);
34+
registrationEvent.accept(jmsSender);
35+
return member;
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.gluecoders.library.services.listeners;
2+
3+
import org.gluecoders.library.events.RegistrationEvent;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.jms.annotation.JmsListener;
7+
import org.springframework.stereotype.Component;
8+
9+
/**
10+
* Created by Anand Rajneesh on 12/2/2017.
11+
*/
12+
@Component
13+
public class RegistrationEventListener {
14+
15+
private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationEventListener.class);
16+
17+
@JmsListener(destination = "members")
18+
public void receive(RegistrationEvent event){
19+
LOGGER.info("Received event {} from members queue", event.getEventType());
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.gluecoders.library.services.notifiers;
2+
3+
import org.gluecoders.library.events.RegistrationEvent;
4+
5+
/**
6+
* Created by Anand Rajneesh on 12/2/2017.
7+
*/
8+
public interface EventHandler {
9+
10+
void handle(RegistrationEvent event);
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.gluecoders.library.services.notifiers;
2+
3+
import org.gluecoders.library.events.RegistrationEvent;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.jms.core.JmsTemplate;
8+
import org.springframework.stereotype.Component;
9+
10+
/**
11+
* Created by Anand Rajneesh on 12/2/2017.
12+
*/
13+
@Component
14+
public class JmsSender implements EventHandler{
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(JmsSender.class);
17+
18+
@Autowired
19+
private JmsTemplate jmsTemplate;
20+
21+
@Override
22+
public void handle(RegistrationEvent event) {
23+
jmsTemplate.convertAndSend("members", event);
24+
LOGGER.info("Registration event send to destination : members");
25+
}
26+
}
+4-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
spring.data.mongodb.uri=mongodb://localhost:27017/test
1+
spring.data.mongodb.uri=mongodb://localhost:27017/books
2+
spring.activemq.in-memory=true
3+
spring.activemq.packages.trustAll=true
4+
logging.level=DEBUG
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.gluecoders.library.events;
2+
3+
import org.gluecoders.library.models.Member;
4+
import org.gluecoders.library.services.notifiers.EventHandler;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.Mockito;
9+
import org.mockito.runners.MockitoJUnitRunner;
10+
11+
import static org.junit.Assert.*;
12+
import static org.mockito.Mockito.*;
13+
/**
14+
* Created by Anand Rajneesh on 12/3/2017.
15+
*/
16+
@RunWith(MockitoJUnitRunner.class)
17+
public class RegistrationEventTest {
18+
19+
private static class MockEventHandler implements EventHandler{
20+
21+
@Override
22+
public void handle(RegistrationEvent event) {
23+
24+
}
25+
}
26+
27+
private MockEventHandler eventHandler;
28+
29+
@Before
30+
public void setup(){
31+
eventHandler = Mockito.spy(new MockEventHandler());
32+
}
33+
34+
@Test
35+
public void testRegistrationEvent_SetsUsername(){
36+
Member m = new Member();
37+
m.setEmail("email");
38+
RegistrationEvent registrationEvent = new RegistrationEvent(m);
39+
assertNotNull("Eventtype should never be null", registrationEvent.getEventType());
40+
assertNotNull("Username should not be null if present in member", registrationEvent.getUsername());
41+
}
42+
43+
@Test
44+
public void testAccept(){
45+
Member m = new Member();
46+
m.setEmail("email");
47+
RegistrationEvent registrationEvent = new RegistrationEvent(m);
48+
registrationEvent.accept(eventHandler);
49+
verify(eventHandler, times(1)).handle(registrationEvent);
50+
}
51+
52+
}

src/test/java/org/gluecoders/library/rest/RegistrationTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class RegistrationTest {
3232
@Autowired
3333
private MockMvc mvc;
3434

35-
@MockBean
35+
@MockBean(name = "registrationService")
3636
private RegistrationService registrationService;
3737

3838
@Autowired
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.gluecoders.library.services;
2+
3+
import org.gluecoders.library.models.Credentials;
4+
import org.gluecoders.library.models.Member;
5+
import org.gluecoders.library.services.notifiers.JmsSender;
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.mockito.InjectMocks;
10+
import org.mockito.Mock;
11+
import org.mockito.runners.MockitoJUnitRunner;
12+
13+
import static org.junit.Assert.*;
14+
import static org.mockito.Mockito.*;
15+
16+
17+
/**
18+
* Created by Anand Rajneesh on 12/3/2017.
19+
*/
20+
@RunWith(MockitoJUnitRunner.class)
21+
public class NotifyingRegistrationServiceTest {
22+
23+
@Mock
24+
private DefaultRegistrationService defaultRegistrationService;
25+
26+
@Mock
27+
private JmsSender jmsSender;
28+
29+
@InjectMocks
30+
private NotifyingRegistrationService testObject;
31+
32+
@Before
33+
public void setup(){
34+
doNothing().when(jmsSender).handle(any());
35+
}
36+
37+
@Test
38+
public void testRegister_DelegateSuccess_JmsSuccess() throws Exception {
39+
Credentials c = new Credentials();
40+
c.setPwd("pwd");
41+
c.setUsername("username");
42+
Member m = new Member();
43+
m.setEmail(c.getUsername());
44+
doReturn(m).when(defaultRegistrationService).register(c);
45+
m = testObject.register(c);
46+
assertNotNull(m);
47+
verify(defaultRegistrationService, times(1)).register(c);
48+
verify(jmsSender, times(1)).handle(any());
49+
}
50+
51+
@Test(expected = Exception.class)
52+
public void testRegister_DelegateFails() throws Exception {
53+
Credentials c = new Credentials();
54+
c.setPwd("pwd");
55+
c.setUsername("username");
56+
Member m = new Member();
57+
m.setEmail(c.getUsername());
58+
doThrow(Exception.class).when(defaultRegistrationService).register(c);
59+
try {
60+
testObject.register(c);
61+
}catch (Exception e){
62+
verify(defaultRegistrationService, times(1)).register(c);
63+
verify(jmsSender, never()).handle(any());
64+
throw e;
65+
}
66+
}
67+
68+
@Test(expected = Exception.class)
69+
public void testRegister_DelegateSuccess_JmsFails() throws Exception {
70+
Credentials c = new Credentials();
71+
c.setPwd("pwd");
72+
c.setUsername("username");
73+
Member m = new Member();
74+
m.setEmail(c.getUsername());
75+
doReturn(m).when(defaultRegistrationService).register(c);
76+
doThrow(Exception.class).when(jmsSender).handle(any());
77+
try {
78+
testObject.register(c);
79+
}catch (Exception e){
80+
verify(defaultRegistrationService, times(1)).register(c);
81+
verify(jmsSender, times(1)).handle(any());
82+
throw e;
83+
}
84+
}
85+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.gluecoders.library.services.listeners;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.*;
6+
7+
/**
8+
* Created by Anand Rajneesh on 12/3/2017.
9+
*/
10+
public class RegistrationEventListenerTest {
11+
12+
@Test
13+
public void testReceive() throws Exception {
14+
15+
}
16+
}

0 commit comments

Comments
 (0)