Отправка Custom Key в StompHeaders
Доброе утро подскажите пожалуйста. У меня есть контроллер вебсокета, в котором я получаю из StompHeaderAccessor userId:
@MessageMapping("/load/hamster/food")
public void loadFoodForHamster(
@RequestBody String json,
StompHeaderAccessor sha) {
ParserResponse response = parser.parse(getUserId(sha), json);
locationService.loadLocations(getUserId(sha), sha.getSessionId(), response.getLocations(), response.getTargetChains());
System.out.println( "***** JSON " + json);
}
Метода getUserId(sha) вызывается в листенере public class StompEventListener implements ApplicationListener
static String getUserId(StompHeaderAccessor sha) {
Object sourceHeaders = sha.getMessageHeaders().get("nativeHeaders");
String user = null;
if (sourceHeaders instanceof Map) {
// TODO warn unchecked cast
try {
Map<String, Object> nativeHeaders = (Map<String, Object>) sourceHeaders;
user = ((List<String>) nativeHeaders.get("user")).get(0);
} catch (Exception e) {
e.printStackTrace();
}
}
return user;
}
Каким образом я могу отправить кастомный кей в из клиента WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient) ведь WebSocketStompClient не позволяет этого делать .
я пытался делать так:
@Component
public class CustomStompSessionHandler extends StompSessionHandlerAdapter {
private final CountDownLatch latch = new CountDownLatch(1);
private StompSession session;
private StompHeaders connectedHeaders;
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
System.out.println("Opening websocket...");
System.out.println("Session is connected: " + session.isConnected() + "\n");
// System.out.println("---------- Is connected");
this.session = session;
this.connectedHeaders = connectedHeaders;
latch.countDown(); // Signal that we're connected
}
@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
// Handle exceptions
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
// Handle incoming frames
}
public StompSession getSession() {
try {
latch.await(); // Wait until we're connected
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return session;
}
@Service
@ClientEndpoint
public class MyClientEndpoint {
private CustomStompSessionHandler sessionHandler;
private RandomStringGenerator gen;
@Autowired
public MyClientEndpoint(CustomStompSessionHandler sessionHandler, RandomStringGenerator gen) {
this.sessionHandler = sessionHandler;
this.gen = gen;
}
public void sendRequest() {
gen = new RandomStringGenerator();
String userName = gen.generateRandomString(7);
System.out.println("-----" + userName);
List<Transport> transports = new ArrayList<>();
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
transports.add(new RestTemplateXhrTransport());
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());
StompHeaders headers = new StompHeaders();
long[] longArray = {20000L, 20000L};
headers.setAcceptVersion("1.1");
headers.setHeartbeat(longArray);
headers.setDestination("/load/hamster/food");
headers.set("user", userName);
stompClient.connect("ws://localhost:8090/vrp-websocket", sessionHandler);
String jsonMessage = "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[30.282172868,59.957037334],[30.282527254,59.957201998],[30.282543114,59.957208423],[30.284079575,59.957915146]]},\"properties\":{\"polygon\":true}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[30.289916959,59.956945577],[30.290133356,59.956855571],[30.290148006,59.956850316],[30.29154352,59.956275229],[30.29211887,59.956051276]]},\"properties\":{\"polygon\":true}},{\"type\":\"Feature\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[30.318017041,59.959462657],[30.318366207,59.959537562],[30.318427971,59.959547691]]},\"properties\":{\"polygon\":true}}]}";
StompSession session = sessionHandler.getSession();
session.send(headers, jsonMessage);
}}
Но получаю ошибку на сервере:
2024-02-15 09:05:02 06:05:02.115 [tboundChannel-1] INFO o.n.r.p.websocket.StompEventListener - [null] User: null (SessionId: 62be8d47cd3a4598be789d7c092c7d4a)