当前位置: 首页 > 知识库问答 >
问题:

Spring SockJS跺脚不接收心跳以外的消息

尉迟禄
2023-03-14

我使用的是Spring版本4.3.6。在服务器端和bowers客户端上发布"Stamp-webSocket":"2.0"和"Sockjs-Client":"1.1.4"

以下是服务器端的所有相关代码-

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
{
  @Autowired
  private SimpMessagingTemplate brokerMessagingTemplate;

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry)
  {
    // for local testing, setting allowed origins to * - Should be removed later
    registry.addEndpoint("/websoc").setAllowedOrigins("*").withSockJS().setSupressCors(true);
  }

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

  @Override
  public void configureClientOutboundChannel(ChannelRegistration registration)
  {
    registration.taskExecutor()
    .corePoolSize(10)
    .maxPoolSize(20);
  }

  @Override
  public void configureWebSocketTransport(WebSocketTransportRegistration registration)
  {
    registration.setSendTimeLimit( 15 * 1000)
    .setSendBufferSizeLimit( 512 * 1024)
    .setMessageSizeLimit( 128 * 1024);
  }

  @PostConstruct
  public void fetchNotifications()
  {

    NotificationsController.setMesgingTmpt(brokerMessagingTemplate);
  }
}


@Controller
public class NotificationsController
{
  private static SimpMessagingTemplate brokerMessagingTemplate;

  public static void setMesgingTmpt(SimpMessagingTemplate tmp)
  {
    brokerMessagingTemplate = tmp;
  }

  // @SendTo("/topic/userNotifications")
  public void testWSMessage(JUserNotification un)
  {
    LOGGER.debug("testWSMessage called");

    un.setAccountId("1");
    un.setUserId("1");

    try
    {
      LOGGER.debug("sending notif: {}", JSONUtils.stringify(un));
      brokerMessagingTemplate.convertAndSend("/topic/userNotifications", un);

    } catch (final Exception e)
    {
      LOGGER.debug("exception while sending msg to client: {}", e);
    }
   // return un;
  }
}

@Component
public class CustomApplicationListener implements ApplicationListener<ApplicationEvent>
{
    @Override
  public void onApplicationEvent(ApplicationEvent event)
  {
    if (event instanceof SessionSubscribeEvent)
    {
      LOGGER.debug("subscribe event received. Some params - ");
      final SessionSubscribeEvent se = (SessionSubscribeEvent) (event);
      final StompHeaderAccessor headers = StompHeaderAccessor.wrap(se.getMessage());
      LOGGER.debug("sessionId: {}", headers.getSessionId());
      LOGGER.debug("sessionAttributes: {}", headers.getSessionAttributes());
      LOGGER.debug("ack: {}", headers.getAck());
      LOGGER.debug("command: {}", headers.getCommand());
      LOGGER.debug("destination: {}", headers.getDestination());
      LOGGER.debug("subscriptionId: {}", headers.getSubscriptionId());
      LOGGER.debug("user: {}", headers.getUser());


      // test code
      final NotificationsController notifs = new NotificationsController();
      final JUserNotification usrNotif = new JUserNotification();
      notifs.testWSMessage(usrNotif);
    }
  }
}

在客户机上,这是代码-

    this.set("webSockURL", this.get("serverInfo").getWebsocketEndPoint());
    this.set("sock", new SockJS(this.get("webSockURL")));
    this.set("stompClient", Client.over(this.get("sock")));

    var stompcli = this.get("stompClient");

    var subscribeCallBack = function(message) {
    console.log("inside subscribeCallBack");
      this._processNotifications(message)
    };

    var connectCallBack = function() {
      console.log("inside connectCallBack");
      stompcli.subscribe("topic/userNotifications", subscribeCallBack);
    };

    stompcli.connect({}, {}, connectCallBack);

Websocket connect建立后,我收到心跳消息,但没有收到我正在发送的通知。我甚至尝试过使用@SendTo注释,但它不起作用。

当我使用webjarstomp和sockjs尝试相同的服务器代码并在本地运行时,我会收到消息。这让我觉得是客户机库出了问题,但我对此不确定。

服务器作为反向代理在nginx后面的docker容器上运行。我已经将ELB配置为允许WebSocket并启用了proxy_协议

由于连接本身已经成功建立,我不怀疑它的基础设施部分。任何想法都将不胜感激。

共有1个答案

黎阳冰
2023-03-14

您在编写topic/userNotifications时,没有在topic之前编写/,因此请尝试将javascript代码重写为如下代码:

stompcli.subscribe("/topic/userNotifications", subscribeCallBack);
 类似资料:
  • 当使用simpleBroker时,我可以使用/user/**目的地格式向单个用户发送消息,该格式在UserDestination中拾取并转换。我还可以使用它发送到特定会话,或发送到特定用户的所有会话。 当使用ActiveMQ或RabbitMQ等外部代理时,只要发送方也能够使用/user/**或其助手注释@SentToUser等,这也是可能的。 但是,如果我不在本地处理这些消息,并且我有另一个消费者

  • 当使用以下命令“activemq start xbean:../conf/activemq stomp.xml”启动activemq时,我遇到了堆栈跟踪下方给出的错误 E:\apache-activemq-5.4。3-bin\apache-activemq-5.4。3\bin ActiveMQ使用命令正确启动 E:\apache-activemq-5.4。3-bin\apache-activemq

  • 我是Kafka的新手。我在网上读了很多关于Kafka制作人和Kafka消费者的说明。我成功地实现了前者,它可以向Kafka集群发送消息。然而,我没有完成后一个。请帮我解决这个问题。我看到我的问题像StackOverflow上的一些帖子,但我想更清楚地描述一下。我在虚拟盒子的Ubuntu服务器上运行Kafka和Zookeeper。使用1个Kafka集群和1个Zookeeper集群的最简单配置(几乎是

  • 在客户端javascript上,我有 在服务器端 从这个设置中,我偶尔(大约每30次页面刷新一次)会遇到消息丢失,这意味着我既看不到客户端的“message received”消息,也看不到Chrome调试工具的websocket流量。 “发送前”始终记录在服务器端。 这看起来像是当我在订阅()方法中调用MessageSending操作时,它还没有准备好。(如果我把Thread.sleep(50)

  • 我的公司有一个以JSON格式发送实时消息的消息传递系统,它不是建立在AWS上的,也不会与AWS有任何VPN连接。 我们的团队正在尝试使用AWS SQS接收这些消息,然后DynamoDB将JSON消息处理到TSV,然后加载到RDS中。 但是,根据FAQ,SQS只能从AWS内部接收消息。https://aws.amazon.com/sqs/faqs/ 我在这里的问题是: 我的想法正确吗? 如果正确,您

  • 我有一个很奇怪的问题。 我正在发送广播并设置一些额外内容,但接收者没有收到: 发送: 并收到: 由于某些原因,downloadID为空。有什么提示吗? 谢谢