STOMP WebSocket клиент поверх существующего Apache HttpClient - Java - PullRequest
0 голосов
/ 18 октября 2018

Существует ли реализация Java STOMP WebSocket на Java поверх существующего экземпляра Java HttpClient?Я управляю своим сеансом через Apache HttpClient и хотел бы повторно использовать его для подключения к WebSocket.У меня есть сервер Spring MVC 4, слушающий STOMP SockJS, и из браузера все работает отлично, через http, https, все хорошо.Но когда я ставлю Android или другие клиенты, у меня возникает проблема, потому что мой сеанс HttpClient для обычных запросов не используется для моего соединения WebSocket, поэтому я не могу поделиться сессией.

Кто-нибудь знает, какзаставить его работать?Я уже попробовал com.github.forresthopkinsa: StompProtocolAndroid, добавив идентификатор сессии и запомнив мне токен на заголовках, но ничего не работает, мои запросы не поступают на мой контроллер и выдают ошибку (ниже).Позвольте вам код:

Конфигурация сервера Spring MVC 4 (dispatcher-servlet.xml)

...
<websocket:message-broker application-destination-prefix="/auction">
    <websocket:stomp-endpoint path="/auction" allowed-origins="*">
        <websocket:sockjs />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="" />
</websocket:message-broker>
...

Сервер AuctionWebSocketController

@Controller
@RequestMapping(value = "/auction")
public class AuctionWebSocketController {

    ...

    @MessageMapping(value = "/{id}/bid/{value}")
    @SendTo("/auction/{id}")
    public ResponseEntity<Bid> bid(
            @DestinationVariable(value = "id") Long adId,
            @DestinationVariable(value = "value") Double value,
            Principal principal){

        // my logic, but never reaches from Android client!

        return result;
    }
}

Android-клиент

mStompClient = Stomp.over(
    Stomp.ConnectionProvider.OKHTTP, 
    "/auction", 
    HttpHelper.getCookiesMap()); // these are the cookies/headers from HttpClient

mStompClient.topic("/auction/1").subscribe(topicMessage -> {
    // parse messages and do my things
});

mStompClient.connect(mCookieMap); // mCookieMap are HttpClient cookies again

List<StompHeader> stompHeaders = new ArrayList<>();
// here I add my HttpClient headers again
stompHeaders.add(new StompHeader(StompHeader.DESTINATION, '/auction/1/bid/50'));
StompMessage msg = new StompMessage(StompCommand.SEND, stompHeaders, "");
mStompClient.send(msg).subscribe(
    () -> Log.d(TAG, "Sent data!"),
    error -> Log.e(TAG, "Encountered error while sending data!", error)
);

Все отлично работает, но когда я звоню mStompClient.send , на стороне сервера я получаю ошибку:

[2018-10-18 16:27:29,783] [ERROR] org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler | Unhandled exception from message handler method
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message, failedMessage=GenericMessage [payload=byte[21], headers={simpMessageType=MESSAGE, stompCommand=SEND, nativeHeaders={JSESSIONID=[38E2085A76A2F1447A9CC0C472052C62], remember-me=[M2pZT2swOXhTZjB6REJzOFRoMFJzdz09OnlzUnZNbHgwcGRCclVrUDAvSmQ3Qmc9PQ, NkdtVWxvY25LWmFkVytOQ3V6b3hvUT09OjBYNTMvajJvYW9hN3RaWjlSMkZpaFE9PQ], destination=[/auction/174/bid/66.0], heart-beat=[10000]}, DestinationVariableMethodArgumentResolver.templateVariables={id=174, value=66.0}, simpSessionAttributes={}, simpHeartbeat=[J@416ef33f, lookupDestination=/174/bid/66.0, simpSessionId=1, simpDestination=/auction/174/bid/66.0}]
    at org.springframework.messaging.simp.annotation.support.PrincipalMethodArgumentResolver.resolveArgument(PrincipalMethodArgumentResolver.java:42)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:112)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:135)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:107)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:502)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:461)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:399)
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Любая помощь?Мне интересно, кто и приложение, интегрированное с чатом / функцией реального времени, работает с аутентификацией.

...