2012-06-17 24 views
20

Tôi có một ứng dụng JEE6 chạy trên cụm Glassfish 3.1.2. One @Singleton Bean chứa một số loại bộ nhớ cache (readolny). Người dùng có thể nhấn một nút trong GUI để cập nhật bộ nhớ cache với nội dung (cập nhật) từ cơ sở dữ liệu.Làm thế nào để thông báo cho tất cả (cùng) đậu Singleton trong một cụm Glassfish 3.1?

Điều này hoạt động tốt trong môi trường không có nhóm, nhưng bây giờ chúng tôi cần chuyển sang một cụm.

Vì vậy, tôi đang gặp phải sự cố, khi người dùng nhấn nút cập nhật đó, chỉ có Cache Singleton từ nút máy chủ của mình được cập nhật. Câu hỏi của tôi là, cách dễ nhất để làm cho các Singletons khác (trong các nút khác) cũng cập nhật dữ liệu đó là gì?

Tôi biết câu hỏi Singleton in Cluster environment, nhưng câu hỏi của tôi dành riêng cho Glassfish (vì tôi hy vọng có một số hỗ trợ xây dựng), một câu hỏi khác được gắn thẻ "Websphere". Và câu hỏi của tôi là về JEE6, câu hỏi còn lại cũ hơn JEE6.

+1

Một điều bạn có thể muốn đăng hoặc suy nghĩ là 'bạn cần cập nhật nhanh như thế nào? aka cách ly giao dịch bắt buộc của bạn là gì? Bạn có cần sự thay đổi để được phản ánh trong các single trước khi họ xử lý bất kỳ yêu cầu nào khác không? Hoặc họ có thể xử lý một vài cuộc gọi và miễn là họ nhận được bản cập nhật trong vòng vài giây? –

+0

@exabrial: một vài giây (1..5) là OK trong trường hợp của tôi. – Ralph

+1

Câu trả lời hay nhất là pub/sub với JMS, được mô tả dưới đây bởi Sam. Có một MDB được tiêm với một tham chiếu đến Singleton. MDB nên đăng ký chủ đề. Làm cho nó cập nhật singleton khi nó nhận được một tin nhắn. –

Trả lời

10

GlassFish High Availability Administration Guide một cách rõ ràng rằng:

Hạn chế

Khi cấu hình phiên kiên trì và failover, lưu ý các hạn chế sau:

  • Khi một phiên thất bại trên, bất kỳ tài liệu tham khảo để mở tập tin hoặc kết nối mạng bị mất. Các ứng dụng phải được mã hóa với sự hạn chế này.

  • EJB Singletons được tạo cho từng cá thể máy chủ trong một cụm và không phải một lần cho mỗi cụm.

Một giả thuyết khác, sẽ được sử dụng JMS và có nhấn nút GUI bài một thông điệp tới một Topic JMS. Tất cả các hạt Singleton có thể đăng ký vào Chủ đề đó và nhận được thông báo sẽ khiến tất cả chúng cập nhật từ cơ sở dữ liệu, gần như đồng thời.Lợi ích của phương pháp này, là nó thúc đẩy nhiều tính năng được xây dựng trong Glassfish, mà không nhất thiết phải đưa vào một khung công tác khác.

Trong mọi trường hợp, di chuyển từ cá thể đơn lẻ sang nhiều trường hợp không bao giờ là một thay đổi thực sự liền mạch và sẽ gây ra một số khó khăn. Có thể sẽ cần phải có các thay đổi ứng dụng để đảm bảo rằng tất cả trạng thái có liên quan (trừ trạng thái phiên), được chia sẻ chính xác cho tất cả các cá thể trong cụm.

7

Thật không may là không có cách tích hợp để đạt được những gì bạn muốn, nhưng khuôn khổ shoal mà cơ sở Glassfish phân cụm của nó có thể giúp bạn ở đây. Bạn có thể giải quyết vấn đề bằng cách gửi thông báo cho các thành viên cụm để cập nhật bộ nhớ cache của họ hoặc bằng cách thay thế bộ nhớ cache hiện tại của bạn bằng bộ nhớ cache được phân phối.

Dưới đây là một ví dụ sử dụng bầy gửi thông báo:

@Startup 
@Singleton 
public class Test { 

private String groupName = "mygroup"; 
private String serverName = System.getProperty("HTTP_LISTENER_PORT"); 
private GroupManagementService gms; 

@PostConstruct 
public void init() { 
    Runnable gmsRunnable = GMSFactory.startGMSModule(serverName, groupName, 
      GroupManagementService.MemberType.CORE, null); 
    gms = (GroupManagementService) gmsRunnable; 
    try { 
     gms.join(); 
     gms.addActionFactory(new MessageActionFactory() { 

      @Override 
      public Action produceAction() { 
       return new MessageAction() { 

        @Override 
        public void consumeSignal(Signal signal) 
          throws ActionException { 
         // Update your cache here 
        } 
       }; 
      } 
     }, groupName); 
    } catch (GMSException e) { 
     Logger.getAnonymousLogger().severe(e.getMessage()); 
    } 
} 

@PreDestroy 
public void cleanup() { 
    gms.shutdown(GMSConstants.shutdownType.INSTANCE_SHUTDOWN); 
} 

/** 
* Call this from your button click. 
*/ 
public void updateCache() { 
    try { 
     byte[] message = new byte[] {}; 
     gms.getGroupHandle().sendMessage(groupName, message); 
    } catch (GMSException e) { 
     Logger.getAnonymousLogger().severe(e.getMessage()); 
    } 
} 
} 

Nếu bạn muốn sử dụng một bộ nhớ cache phân phối thay vì:

  DistributedStateCache cache = gms.getGroupHandle().getDistributedStateCache(); 

Items đặt trong bộ nhớ cache sẽ được nhân rộng đến các cụm khác nút.

3

Hãy xem JGroups. Đó là một khung hình cho truyền thông đa hướng đáng tin cậy. Các cơ chế phân cụm JBoss hiện đang dựa trên công cụ này.

Bạn có thể xem example usage of JGroups here.

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