Skip to content

Commit 61a1869

Browse files
committed
Add support for multi node architecture usging RabbitMQ as a full STOMP broker
1 parent 6ec4bd5 commit 61a1869

File tree

8 files changed

+76
-28
lines changed

8 files changed

+76
-28
lines changed

ebook-chat/pom.xml

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@
6868
<version>1.1.2</version>
6969
</dependency>
7070
<dependency>
71-
<groupId>org.webjars</groupId>
71+
<groupId>org.webjars.bower</groupId>
7272
<artifactId>stomp-websocket</artifactId>
73-
<version>2.3.3</version>
73+
<version>2.3.4</version>
7474
</dependency>
7575
<dependency>
7676
<groupId>org.webjars</groupId>
@@ -104,9 +104,27 @@
104104
<artifactId>spring-security-test</artifactId>
105105
</dependency>
106106
<dependency>
107-
<groupId>org.webjars</groupId>
108-
<artifactId>noty</artifactId>
109-
<version>2.2.4</version>
107+
<groupId>org.webjars</groupId>
108+
<artifactId>noty</artifactId>
109+
<version>2.2.4</version>
110+
</dependency>
111+
<dependency>
112+
<groupId>io.projectreactor</groupId>
113+
<artifactId>reactor-core</artifactId>
114+
</dependency>
115+
<dependency>
116+
<groupId>io.projectreactor</groupId>
117+
<artifactId>reactor-net</artifactId>
118+
</dependency>
119+
<dependency>
120+
<groupId>io.netty</groupId>
121+
<artifactId>netty-all</artifactId>
122+
<version>4.1.7.Final</version>
123+
</dependency>
124+
<dependency>
125+
<groupId>io.netty</groupId>
126+
<artifactId>netty-transport-native-epoll</artifactId>
127+
<version>4.1.7.Final</version>
110128
</dependency>
111129
</dependencies>
112130

ebook-chat/src/main/java/br/com/jorgeacetozi/ebookChat/chatroom/api/ChatRoomController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,20 @@ public ModelAndView join(@PathVariable String chatRoomId, Principal principal) {
4949
return modelAndView;
5050
}
5151

52-
@SubscribeMapping("/connected-users")
52+
@SubscribeMapping("/connected.users")
5353
public List<ChatRoomUser> listChatRoomConnectedUsersOnSubscribe(SimpMessageHeaderAccessor headerAccessor) {
5454
String chatRoomId = headerAccessor.getSessionAttributes().get("chatRoomId").toString();
5555
return chatRoomService.findById(chatRoomId).getConnectedUsers();
5656
}
5757

58-
@SubscribeMapping("/old-messages")
58+
@SubscribeMapping("/old.messages")
5959
public List<InstantMessage> listOldMessagesFromUserOnSubscribe(Principal principal,
6060
SimpMessageHeaderAccessor headerAccessor) {
6161
String chatRoomId = headerAccessor.getSessionAttributes().get("chatRoomId").toString();
6262
return instantMessageService.findAllInstantMessagesFor(principal.getName(), chatRoomId);
6363
}
6464

65-
@MessageMapping("/send-message")
65+
@MessageMapping("/send.message")
6666
public void sendMessage(@Payload InstantMessage instantMessage, Principal principal,
6767
SimpMessageHeaderAccessor headerAccessor) {
6868
String chatRoomId = headerAccessor.getSessionAttributes().get("chatRoomId").toString();

ebook-chat/src/main/java/br/com/jorgeacetozi/ebookChat/configuration/WebSocketConfigSpringSession.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package br.com.jorgeacetozi.ebookChat.configuration;
22

3+
import org.springframework.beans.factory.annotation.Value;
34
import org.springframework.context.annotation.Configuration;
45
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
56
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -13,12 +14,23 @@
1314
@EnableWebSocketMessageBroker
1415
public class WebSocketConfigSpringSession extends AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {
1516

17+
@Value("${ebook.chat.relay.host}")
18+
private String relayHost;
19+
20+
@Value("${ebook.chat.relay.port}")
21+
private Integer relayPort;
22+
1623
protected void configureStompEndpoints(StompEndpointRegistry registry) {
1724
registry.addEndpoint("/ws").withSockJS();
1825
}
1926

2027
public void configureMessageBroker(MessageBrokerRegistry registry) {
21-
registry.enableSimpleBroker("/queue/", "/topic/");
28+
registry.enableStompBrokerRelay("/queue/", "/topic/")
29+
.setUserDestinationBroadcast("/topic/unresolved.user.dest")
30+
.setUserRegistryBroadcast("/topic/registry.broadcast")
31+
.setRelayHost(relayHost)
32+
.setRelayPort(relayPort);
33+
2234
registry.setApplicationDestinationPrefixes("/chatroom");
2335
}
2436
}

ebook-chat/src/main/java/br/com/jorgeacetozi/ebookChat/utils/Destinations.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ public class Destinations {
55
public static class ChatRoom {
66

77
public static String publicMessages(String chatRoomId) {
8-
return "/topic/" + chatRoomId + "/public-messages";
8+
return "/topic/" + chatRoomId + ".public.messages";
99
}
1010

1111
public static String privateMessages(String chatRoomId) {
12-
return "/queue/" + chatRoomId + "/private-messages";
12+
return "/queue/" + chatRoomId + ".private.messages";
1313
}
1414

1515
public static String connectedUsers(String chatRoomId) {
16-
return "/topic/" + chatRoomId + "/connected-users";
16+
return "/topic/" + chatRoomId + ".connected.users";
1717
}
1818
}
1919
}

ebook-chat/src/main/resources/application.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ flyway.enabled: true
4141
security.headers.cache: false
4242
server.session.timeout: 600
4343

44+
ebook:
45+
chat:
46+
relay:
47+
host: localhost
48+
port: 61613
49+
4450
---
4551

4652
spring:
@@ -69,4 +75,10 @@ spring:
6975
repositories:
7076
enabled: true
7177

72-
flyway.enabled: true
78+
flyway.enabled: true
79+
80+
ebook:
81+
chat:
82+
relay:
83+
host: localhost
84+
port: 61613

ebook-chat/src/main/resources/templates/chatroom.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ <h1 class="panel-title" th:text="#{chatroom.users}">Users</h1>
9090
<script src="/webjars/jquery/3.1.1/jquery.min.js"></script>
9191
<script src="/webjars/bootstrap/3.3.7/js/bootstrap.min.js"></script>
9292
<script src="/webjars/sockjs-client/1.1.2/sockjs.min.js"></script>
93-
<script src="/webjars/stomp-websocket/2.3.3/stomp.min.js"></script>
93+
<script src="/webjars/stomp-websocket/2.3.4/lib/stomp.min.js"></script>
9494
<script src="/webjars/noty/2.2.4/jquery.noty.packaged.min.js"></script>
9595

9696
<script th:inline="javascript">
@@ -116,12 +116,12 @@ <h1 class="panel-title" th:text="#{chatroom.users}">Users</h1>
116116
enableInputMessage();
117117
successMessage("Your WebSocket connection was successfuly established!")
118118

119-
stompClient.subscribe('/chatroom/connected-users', updateConnectedUsers);
120-
stompClient.subscribe('/chatroom/old-messages', oldMessages);
119+
stompClient.subscribe('/chatroom/connected.users', updateConnectedUsers);
120+
stompClient.subscribe('/chatroom/old.messages', oldMessages);
121121

122-
stompClient.subscribe('/topic/' + chatRoomId + '/public-messages', publicMessages);
123-
stompClient.subscribe('/user/queue/' + chatRoomId + '/private-messages', privateMessages);
124-
stompClient.subscribe('/topic/' + chatRoomId + '/connected-users', updateConnectedUsers);
122+
stompClient.subscribe('/topic/' + chatRoomId + '.public.messages', publicMessages);
123+
stompClient.subscribe('/user/queue/' + chatRoomId + '.private.messages', privateMessages);
124+
stompClient.subscribe('/topic/' + chatRoomId + '.connected.users', updateConnectedUsers);
125125
}
126126

127127
function stompFailure(error) {
@@ -218,7 +218,7 @@ <h1 class="panel-title" th:text="#{chatroom.users}">Users</h1>
218218
'toUser' : spanSendTo.text()
219219
}
220220
}
221-
stompClient.send("/chatroom/send-message", {}, JSON.stringify(instantMessage));
221+
stompClient.send("/chatroom/send.message", {}, JSON.stringify(instantMessage));
222222
inputMessage.val("").focus();
223223
}
224224

ebook-chat/src/test/java/br/com/jorgeacetozi/ebookChat/integrationTests/test/AbstractIntegrationTest.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,26 @@
55
import org.testcontainers.containers.GenericContainer;
66

77
public class AbstractIntegrationTest {
8-
8+
99
@ClassRule
1010
public static final GenericContainer cassandra = new FixedHostPortGenericContainer("cassandra:3.0")
1111
.withFixedExposedPort(9042, 9042)
1212
.withNetworkMode("host");
13-
13+
1414
@ClassRule
1515
public static final GenericContainer mysql = new FixedHostPortGenericContainer("mysql:5.7")
1616
.withFixedExposedPort(3306, 3306)
1717
.withEnv("MYSQL_DATABASE", "ebook_chat")
18-
.withEnv("MYSQL_ROOT_PASSWORD","root")
18+
.withEnv("MYSQL_ROOT_PASSWORD", "root")
1919
.withNetworkMode("host");
20-
20+
2121
@ClassRule
2222
public static final GenericContainer redis = new FixedHostPortGenericContainer("redis:3.0.6")
23-
.withFixedExposedPort(6379, 6379);
23+
.withFixedExposedPort(6379, 6379)
24+
.withNetworkMode("host");
25+
26+
@ClassRule
27+
public static final GenericContainer rabbitmq = new FixedHostPortGenericContainer("jorgeacetozi/rabbitmq-stomp:3.6")
28+
.withFixedExposedPort(61613, 61613)
29+
.withNetworkMode("host");
2430
}

ebook-chat/src/test/java/br/com/jorgeacetozi/ebookChat/unitTests/utils/DestinationsTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ public class DestinationsTest {
1313

1414
@Test
1515
public void shouldGetPublicMessagesDestination() {
16-
assertThat(Destinations.ChatRoom.publicMessages("123"), is("/topic/" + chatRoomId + "/public-messages"));
16+
assertThat(Destinations.ChatRoom.publicMessages("123"), is("/topic/" + chatRoomId + ".public.messages"));
1717
}
1818

1919
@Test
2020
public void shouldGetPrivateMessagesDestination() {
21-
assertThat(Destinations.ChatRoom.privateMessages("123"), is("/queue/" + chatRoomId + "/private-messages"));
21+
assertThat(Destinations.ChatRoom.privateMessages("123"), is("/queue/" + chatRoomId + ".private.messages"));
2222
}
2323

2424
@Test
2525
public void shouldGetConnectedUsersDestination() {
26-
assertThat(Destinations.ChatRoom.connectedUsers("123"), is("/topic/" + chatRoomId + "/connected-users"));
26+
assertThat(Destinations.ChatRoom.connectedUsers("123"), is("/topic/" + chatRoomId + ".connected.users"));
2727
}
2828
}

0 commit comments

Comments
 (0)