2012-12-10 25 views
5

Tôi có một ứng dụng java swing được phân phối rộng rãi là một trình khách dịch vụ web từ một JAX WebService EJB trên một máy chủ Glassfish 3.1.2.Làm thế nào để kiến ​​trúc sư đẩy thông báo đến một máy khách Swing từ JAX-WS trên GlassFish?

Tôi muốn có thể phân phối thông báo Chuỗi cho tất cả người dùng vẫn hoạt động cho đến khi họ đọc. Các thông báo chỉ cần tồn tại trong ứng dụng khách Swing.

Tôi đã tạo cổng web superuser để nhập dữ liệu Chuỗi và lưu vào cơ sở dữ liệu.

Câu hỏi của tôi là:

  1. gì là công nghệ tốt nhất để (push) phân phối dữ liệu này Chuỗi thông báo cho các khách hàng của tôi?
  2. Tôi nên làm thế nào để kiến ​​trúc cơ sở dữ liệu biết liệu thông báo đã được xem chưa? (Vì vậy, tôi có thể ngừng hiển thị "Thông báo mới" trên máy khách)

Hoặc nếu có tham chiếu đến hướng dẫn hoạt động tuyệt vời, tôi không thể tìm thấy.

Ý tưởng của tôi:

  • Có khách hàng gọi một webservice mỗi 10 phút để kiểm tra nếu có bất kỳ thông báo mới
  • Đối với cơ sở dữ liệu tạo ra một bảng thông báo và thông báo nhìn thấy. Liên kết bảng người dùng của tôi với các bảng thông báo đã xem. Thông báo được xem là rất cơ bản chỉ với 3 cột: NotificationID, UserID, TimeSeen.

Trả lời

6

Một cách để mô phỏng thông báo đẩy là long polling. Kỹ thuật này được gọi là Comet or Reverse AJAX. Trong khi nó phổ biến hơn trong các dịch vụ dựa trên REST, nó có thể được thực hiện dễ dàng trong JAX-WS.

Đối với JAX-WS bạn sẽ muốn điều tra:

Có khách hàng gọi một webservice mỗi 10 phút để kiểm tra nếu có bất kỳ thông báo mới

Thay vì bỏ phiếu dài, bạn thực hiện kết nối máy khách ban đầu ngay lập tức.Nhưng thay vì máy chủ trả lời ngay lập tức, nó treo vào kết nối (không đồng bộ). Sau đó, khi thông báo cần để được đẩy, nó sẽ phản hồi lại kết nối hiện có.

Với kỹ thuật này, ngay khi thông tin có sẵn trên máy chủ , nó sẽ được "đẩy" cho khách hàng.

Để cơ sở dữ liệu tạo bảng thông báo và thông báo được xem. Liên kết bảng người dùng của tôi với các bảng thông báo đã xem. Thông báo được xem là rất cơ bản chỉ với 3 cột: NotificationID, UserID, TimeSeen.

Nghe hay. Hiển thị nó như một dịch vụ JAX-WS. Khi khách hàng nhận được tin nhắn, hãy yêu cầu họ gửi nó bằng NotificationID.

Cái gì như:

NotificationService svc = ...; 
UserId userId = ...; 

AsyncHandler<Notification> handler = new AsyncHandler<Notification>() 
{ 
    public void handleResponse (Response<Notification> response) 
    { 
     Notification notification = response.get(); 

     // update swing gui 

     NotificationID notificationId = notifcation.getId(); 

     svc.markNotificationAsSeen(userId, notificationId); 

     // continue polling forever (or put in some logic to stop) 
     svc.getNotificationAsync(userId, this); 
    } 
}; 

Future<?> invocation = svc.getNotificationAsync(userId, handler); 
3

Nếu 10 phút thường đủ và bạn biết chắc chắn người dùng của mình có thể chờ đợi nhiều, hãy liên tục bỏ phiếu cho máy chủ cứ 10 phút một lần.

Nếu bạn cần (gần như) thông báo thời gian thực, hãy kiểm tra JMS (và đặc biệt là topics). HornetQ là một trong những triển khai và dễ sử dụng nếu bạn đang sử dụng JBoss.

2

Tôi khuyên bạn nên sử dụng máy chủ Message Queue. Giống như ai đó đã đề xuất HornetQ hoặc ActiveMQ mà bạn có thể nhúng trên máy chủ của mình nếu muốn.

Các vấn đề liên quan