2017-06-09 15 views
10

Tôi có đoạn code sau js:cách chờ đăng ký được thiết lập?

stompClient.subscribe('/topic/clients', function (calResult) { 
    updateClientsTable(JSON.parse(calResult.body)); 
}); 
$.get("/clients", null); 

và sau mã máy chủ (dòng cuối cùng gọi nó):

@GetMapping(value = {"/clients"}) 
@ResponseBody 
public void loadClients() { 
     brokerMessagingTemplate.convertAndSend("/topic/clients", clientService.getClientList()); 
} 

Đôi khi front-end nhớ kết quả của $.get("/clients", null);

Như tôi hiểu vấn đề : tại thời điểm kết quả nhận được trên giao diện người dùng, đăng ký không xảy ra.

nếu đặt $.get("/clients", null); bên dưới mã - tất cả đều hoạt động tốt.

Bạn có thể giải thích cách chờ đăng ký được thiết lập không?

+0

Tôi cho rằng bạn đã có kết nối stomp hoạt động được thiết lập qua.connect() nhưng thuê bao sau đó không nhận được tin nhắn cho đến khi bạn truy vấn host một lần? STOMP không cung cấp gọi lại cho đăng ký "thành công". – DooMMasteR

+0

Nó không tái tạo một cách kín đáo. Tôi không hiểu cụm từ: ** cho đến khi bạn truy vấn máy chủ một lần ** – gstackoverflow

Trả lời

1

Tôi nghĩ sẽ có ý nghĩa hơn khi không kết hợp các yêu cầu REST với mẫu nhắn tin này.

Bạn đã cân nhắc gửi lệnh "updateClients" thông qua SockJS vào kênh "/ apps/updateClients" để trả lời kênh "/ topic/clients" chưa?

2

Như @ light_303 đã đề cập, việc trộn các yêu cầu HTTP với cơ chế thông báo là không tốt. Bạn có thể đăng ký thời điểm, khi khách hàng kết nối (yêu cầu GET trên /clients), nhưng bạn không thể đăng ký khi ngắt kết nối.

Bạn nên suy nghĩ theo một trong những cách tiếp theo. Khi người dùng đăng ký /topic/clients:

  1. Bạn gửi riêng cho mình phản hồi với tất cả danh sách khách hàng và sau đó chỉ cập nhật.
  2. Bạn cá nhân gửi cho anh ta thời gian máy chủ hiện tại hoặc một số loại ID và sau đó chỉ đẩy cập nhật. Người dùng sử dụng thời gian/ID đã cho trong yêu cầu GET đến /clients và nhận danh sách khách hàng đầy đủ vào thời điểm đó. Tùy chọn này có thể tốt trong tình huống, khi bạn có các cập nhật gia tăng (ví dụ: thêm các phần tử mới vào danh sách) và nếu không thì không tốt.

Kiểm tra câu hỏi này: Sending message to specific user on Spring Websocket.

Điều này thực sự vô lý, cách mùa xuân có thể làm phức tạp mọi thứ. Tôi khuyên bạn nên xem xét một khung công tác khác cho giao tiếp web thời gian thực, chẳng hạn như ngôn ngữ lập trình Vert.x hoặc Netty và Go. Sử dụng WebSockets hoặc SockJS thay vì STOMP. Tất cả các công nghệ đó có thể cung cấp cho bạn giải pháp linh hoạt và hiệu quả hơn theo cách hiển nhiên. Ngoài ra, hãy kiểm tra dự án Centrifugo, có thể nó liên quan đến nhiệm vụ của bạn.

0

Bạn có thể sử dụng @SubscribeMapping chú thích từ spring-messaging.

Nếu bạn có spring-messaging cấu hình như mô tả herehere, mã server-side có thể trông giống như sau:

@Controller 
public class MessagingController { 
    @SubscribeMapping("/clients") 
    public List<Client> loadClients() { 
     return clientService.getClientList(); 
    } 
} 

Bằng cách này bạn không cần phải gọi $.get("/clients", null); vì xử lý tin nhắn JS nhận kết quả của gọi ngay sau khi đăng ký diễn ra. Mã JS trông giống như:

stompClient.subscribe('/topic/clients', function (calResult) { 
    updateClientsTable(JSON.parse(calResult.body)); 
}); 
Các vấn đề liên quan