Created utils for websockets.
This commit is contained in:
parent
e41dc70f97
commit
3da89c386b
4 changed files with 149 additions and 0 deletions
|
|
@ -34,21 +34,25 @@
|
|||
<artifactId>jersey-client</artifactId>
|
||||
<version>${version.jersey}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.glassfish.jersey.inject</groupId>
|
||||
<artifactId>jersey-hk2</artifactId>
|
||||
<version>${version.jersey}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.glassfish.jersey.media</groupId>
|
||||
<artifactId>jersey-media-json-jackson</artifactId>
|
||||
<version>${version.jersey}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>jakarta.activation</groupId>
|
||||
<artifactId>jakarta.activation-api</artifactId>
|
||||
<version>2.1.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.inject</groupId>
|
||||
<artifactId>guice</artifactId>
|
||||
|
|
@ -61,11 +65,13 @@
|
|||
<artifactId>javafx-fxml</artifactId>
|
||||
<version>${version.jfx}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-controls</artifactId>
|
||||
<version>${version.jfx}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-web</artifactId>
|
||||
|
|
@ -91,6 +97,27 @@
|
|||
<version>${version.mockito}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- websockets -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-messaging</artifactId>
|
||||
<version>6.2.12</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.glassfish.tyrus.bundles/tyrus-standalone-client -->
|
||||
<dependency>
|
||||
<groupId>org.glassfish.tyrus.bundles</groupId>
|
||||
<artifactId>tyrus-standalone-client</artifactId>
|
||||
<version>2.2.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-websocket</artifactId>
|
||||
<version>6.2.12</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ import client.scenes.FoodpalApplicationCtrl;
|
|||
import client.scenes.recipe.IngredientListCtrl;
|
||||
import client.scenes.recipe.RecipeStepListCtrl;
|
||||
import client.utils.LocaleManager;
|
||||
import client.utils.ServerUtils;
|
||||
import client.utils.WebSocketUtils;
|
||||
import com.google.inject.Binder;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.Scopes;
|
||||
|
|
@ -33,6 +35,9 @@ public class MyModule implements Module {
|
|||
binder.bind(FoodpalApplicationCtrl.class).in(Scopes.SINGLETON);
|
||||
binder.bind(IngredientListCtrl.class).in(Scopes.SINGLETON);
|
||||
binder.bind(RecipeStepListCtrl.class).in(Scopes.SINGLETON);
|
||||
|
||||
binder.bind(LocaleManager.class).in(Scopes.SINGLETON);
|
||||
binder.bind(ServerUtils.class).in(Scopes.SINGLETON);
|
||||
binder.bind(WebSocketUtils.class).in(Scopes.SINGLETON);
|
||||
}
|
||||
}
|
||||
111
client/src/main/java/client/utils/WebSocketUtils.java
Normal file
111
client/src/main/java/client/utils/WebSocketUtils.java
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
package client.utils;
|
||||
|
||||
import commons.ws.messages.Message;
|
||||
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
|
||||
import org.springframework.messaging.simp.stomp.StompSession;
|
||||
import org.springframework.messaging.simp.stomp.StompHeaders;
|
||||
import org.springframework.messaging.simp.stomp.StompCommand;
|
||||
import org.springframework.messaging.simp.stomp.StompFrameHandler;
|
||||
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
|
||||
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
|
||||
import org.springframework.web.socket.messaging.WebSocketStompClient;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.function.Consumer;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class WebSocketUtils {
|
||||
private static final String WS_URL = "ws://localhost:8080/updates";
|
||||
private WebSocketStompClient stompClient;
|
||||
private StompSession stompSession;
|
||||
|
||||
/**
|
||||
* Connect to the websocket server.
|
||||
* @param onConnected OnConnected callback
|
||||
*/
|
||||
public void connect(@Nullable Runnable onConnected) {
|
||||
StandardWebSocketClient webSocketClient = new StandardWebSocketClient(); // Create WS Client
|
||||
|
||||
stompClient = new WebSocketStompClient(webSocketClient);
|
||||
stompClient.setMessageConverter(new MappingJackson2MessageConverter()); // Use jackson
|
||||
|
||||
CompletableFuture<StompSession> sessionFuture = stompClient.connectAsync(
|
||||
WS_URL,
|
||||
new StompSessionHandlerAdapter() {
|
||||
@Override
|
||||
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
|
||||
stompSession = session;
|
||||
System.out.println("WebSocket connected: " + session.getSessionId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleException(StompSession session, @Nullable StompCommand command,
|
||||
StompHeaders headers, byte[] payload,
|
||||
Throwable exception) {
|
||||
System.err.println("STOMP error: " + exception.getMessage());
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleTransportError(StompSession session, Throwable exception) {
|
||||
System.err.println("STOMP transport error: " + exception.getMessage());
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
sessionFuture.thenAccept(session -> {
|
||||
stompSession = session;
|
||||
System.out.println("Connection successful, session ready");
|
||||
if (onConnected != null) {
|
||||
onConnected.run();
|
||||
}
|
||||
}).exceptionally(throwable -> {
|
||||
System.err.println("Failed to connect: " + throwable.getMessage());
|
||||
throwable.printStackTrace();
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribe to a topic.
|
||||
* @param destination Destination to subscribe to, for example: /subscribe/recipe
|
||||
* @param messageHandler Handler for received messages
|
||||
*/
|
||||
public void subscribe(String destination, Consumer<Message> messageHandler) {
|
||||
if (stompSession == null || !stompSession.isConnected()) {
|
||||
System.err.println("Cannot subscribe - not connected");
|
||||
return;
|
||||
}
|
||||
|
||||
stompSession.subscribe(destination, new StompFrameHandler() {
|
||||
@Override
|
||||
public Type getPayloadType(StompHeaders headers) {
|
||||
return Message.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleFrame(StompHeaders headers, @Nullable Object payload) {
|
||||
Message message = (Message) payload;
|
||||
messageHandler.accept(message);
|
||||
}
|
||||
});
|
||||
System.out.println("Subscribed to: " + destination);
|
||||
}
|
||||
|
||||
public void disconnect() {
|
||||
if (stompSession != null && stompSession.isConnected()) {
|
||||
stompSession.disconnect();
|
||||
}
|
||||
|
||||
if (stompClient != null) {
|
||||
stompClient.stop();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return stompSession != null && stompSession.isConnected();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -45,6 +45,12 @@
|
|||
<version>${version.mockito}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.20.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue