Stomp не подписывается на сообщение брокера

#angular #spring-boot #stompjs

#angular #весенняя загрузка #stompjs

Вопрос:

У меня есть приложения, которые StompJS подписывают сообщение с сервера ниже:

Клиент:

 this.stompClient = this.createStormClient();
        this.stompClient.connect(this.socket.header, frame => {
            console.log(frame);
            if (this.stompClient) {
              this.stompClient.subscribe(`topic/hello`,(data:any) => {
                console.log('subscribe hello finish.')
                console.log(data);
              });
            }
     });
    
    createStormClient():any {
        let ws = new SockJS('http://127.0.0.1:8084/api/websocket');
        let stompClient = Stomp.over(ws);
        return stompClient;
    }
  

Сервер:

 @Configuration
public class WebSocketAuthorizationSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    @Override
    protected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {
        // You can customize your authorization mapping here.
        messages
        .simpSubscribeDestMatchers("topic/hello").authenticated()
        .anyMessage().authenticated();
    }

    // TODO: For test purpose (and simplicity) i disabled CSRF, but you should re-enable this and provide a CRSF endpoint.
    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer, ChannelInterceptor {

    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private JwtUserDetailsService userSerive;

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic","/queue");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/websocket").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    List<String> authorization = accessor.getNativeHeader("X-Authorization");
                    String accessToken = authorization.get(0);
                    if (accessToken != null amp;amp; accessToken.startsWith("Bearer ")) {
                        String jwtToken = accessToken.substring(7);
                        String userUrl = jwtTokenUtil.getUsernameFromToken(jwtToken);
                        if (!StringUtil.isEmpty(userUrl)) {
                            UserDetails userDetails = userSerive.loadUserByUsername(userUrl);
                            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                                    userDetails, "", userDetails.getAuthorities());
                            accessor.setUser(authentication);
                        }
                    }
                }
                return message;
            }
        });
    }
}
  

Контроллер отправляет сообщение

 public class Controller {
    @Autowired
    private SimpMessagingTemplate template;
    
    @RequestMapping(value = "/api/hello", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> newBook(@RequestBody Long id) {
        try {
            template.convertAndSend("topic/hello", "hello broker message");
            return new ResponseEntity<Boolean>(true,HttpStatus.OK);
        } catch(Exception ex) {
            log.error("new quick book error"   ex.getMessage());
            return new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE);
        }
    }
}
  

консоль отображает фрейм:

[Журнал] Фрейм {команда: «ПОДКЛЮЧЕНО», заголовки: {имя пользователя: «7», частота сердечных сокращений: «0,0», версия: «1.1»}, тело: «», Строка: функция} (tabs-home-home-module.js , строка 293)

И подписаться:

 >>> SUBSCRIBE
id:sub-0
destination:topic/hello
  

Сеть

a[«CONNECTED nversion: 1.1 nheart-beat: 0,0nuser-name: 7 n n u0000»]
[«SUBSCRIBE nid: sub-0ndestination:тема / привет n n u0000»]

Консоль не имеет моего ожидаемого значения внутри подписки

 console.log('subscribe hello finish.')
            console.log(data);
  

Ответ №1:

Это работа на

config.enableSimpleBroker(«тема»,»очередь»);

Ответ №2:

Возможно, ваш исходный код сработал. Я почти уверен, что ваша ошибка заключалась в названии темы:

 this.stompClient.subscribe(`topic/hello`,(data:any) => {...
  

Вы должны были добавить fwd-косую черту к названию темы:

 this.stompClient.subscribe(`/topic/hello`,(data:any) => {...