【问题标题】:How to publish event to angular js 1.4 from spring boot如何从 Spring Boot 将事件发布到 Angular JS 1.4
【发布时间】:2018-03-28 13:29:55
【问题描述】:

场景: 客户端(angular js 1.4)将调用 Rest 端点获取数据,服务器(spring boot)将处理文件列表并返回准确的数据。要处理文件列表,服务器将根据文件数量花费时间。所以我实现了 STOMP 通知,以向客户端发送通知,说“文件列表已被处理,这是一堆文件(结果)”。

问题: Stomp 连接建立成功,客户端也订阅了,但是当服务器发布事件时,客户端无法接收。

下面是我的代码sn-p:

WebSocketConfig.java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").withSockJS();
  }

  @Override
  public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");
    registry.enableSimpleBroker("/topic"); // Enables a simple in-memory broker
  }
}

SocketController.java

   @Controller
    public class SocketController {
    @SendTo("/topic/public")
        public String sendMessage() {
            LOGGER.info("====> chatMessage()");
            return "List updated successfully";
        }
    }

main.js

connect() {
                var socket = new SockJS('/ws');
                var stompClient = Stomp.over(socket);
                event.preventDefault();
                console.log("socket: ", socket);
                console.log("stompClient: ", stompClient);

                stompClient.connect({}, function (frame) {
                        console.log('Connected: ' + frame);   
                        stompClient.subscribe('/topic/public', function (payload) {
                        console.log("payload: ", payload);
                        var message = JSON.parse(payload.body);
                        console.log("message: ", message);
                        });
                    }, function (error) {
                     console.log("onError() called");
                                console.log("error: ",error);
                    });
        };

使用的脚本:

<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>

main.js 的connect() 方法在按钮点击时被调用。我猜可能存在关于范围的问题。

【问题讨论】:

    标签: java angularjs spring-boot sockjs


    【解决方案1】:

    使用 SimpMessagingTemplate 将消息转换并发送到特定主题。

    @Controller
    public class SocketController {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(SocketController.class);
    
        @Autowired private SimpMessagingTemplate template;
    
        public void sendMessage(String message) {
            LOGGER.info("====> sendMessage:");
            this.template.convertAndSend("/topic/public", message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多