2016-01-28 25 views
8

Tôi đang cố gắng gọi ejb từ xa trên mỗi nút của cụm với nút node1 & node2, nhưng tôi luôn nhận được node1. Đã triển khai EJB & mã máy khách dưới dạng tệp EAR trong cả hai nút. Ứng dụng đang chạy trên Wildfly 9 ApplicationServer. Mã máy khách được gọi từ nút1.Gọi ejb từ xa trong cụm cụm ruồi 2 nút

đang EJB:

@Remote 
public interface SLSBRemote { 
    public void test(); 
} 

@Stateless(mappedName="SLSBEJB") 
public class SLSBEJB implements SLSBRemote { 
    @Override 
    public void test() 
    { 
     try { 
      String nodeName = System.getProperty("jboss.node.name"); 
      if(nodeName == null) { 
      nodeName = InetAddress.getLocalHost().getHostName(); 
      } 
      log.debug("nodename: "+nodeName); 
     } catch (Exception e) { 
      log.error("Error",e); 
     } 
    } 
} 

mã khách hàng:

public class testEjb 
{ 
    //invoking this method from other class. Able to pass node address 
    public void testBean(List<String> nodes) 
    { 
     Properties properties = new Properties(); 
     properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
     Context context; 
     for (String node : nodes) { 
      properties.put(Context.PROVIDER_URL,"http-remoting://" + node); 
      try { 
      context = new InitialContext(properties);     
      SLSBRemote slsbRemote=(SLSBRemote)context.lookup(getLookupName()); 
      log.debug("node:"+node+"slsbejbobject:"+slsbRemote.hashCode()); 
      slsbRemote.test(); 
      } catch (NamingException e) { 
      log.error("Error ", e); 
      } 
     } 
    } 
} 

Trong nhật ký,

node: "node1", binddbejb object: 1276422461 
node: "node2", binddbejb object: 1276422461 
nodename: "node1_address" 
nodename: "node1_address" (instead of node2_address) 

Xin gợi ý cho

+0

Có lẽ cụm của bạn chỉ có một dịch vụ JNDI. –

+0

Gabriel, tôi không hiểu. Làm thế nào tôi có thể chắc chắn rằng mỗi nút trong cluster có dịch vụ JNDI riêng biệt? – Hello

+0

bạn có thể kiểm tra các nút danh sách của mình và đảm bảo chúng khác nhau ở thời gian tạo trước khi thực hiện testBean (danh sách ). –

Trả lời

2

Để sử dụng một con ruồi hoang dã EJB clustered cần phải được cấu hình cho clustering và như xa như tôi đã tìm thấy:

  1. Wildfly cung cấp clustering của EJB stateful.
  2. Tài liệu bay hoang dã cung cấp một ví dụ về kịch bản chuyển đổi dự phòng để phân cụm. (Khách hàng cố gắng liên hệ với ejb trên máy chủ # 1, nếu nó không khả dụng thì máy khách sẽ liên hệ với ejb trên máy chủ # 2.)
  3. Ejbs cụm cần phải được định cấu hình khi cần và được chú thích đúng cách.
import org.jboss.ejb3.annotation.Clustered; 
import javax.ejb.Stateful; 

@Stateful 
@Clustered 
public class MyStatefulBean { 
... 
} 

ví dụ được đưa từ trang này của các tài liệu, trong đó mô tả những gì đã được thực hiện một cách chi tiết. https://docs.jboss.org/author/display/WFLY8/EJB+Services

Nếu bạn áp dụng cấu hình EJB này từ tất cả các nút của cụm có thể phục vụ khách hàng.

Tuy nhiên, lưu ý rằng một khách hàng thường phải hoàn toàn không biết về việc phân cụm. Một khách hàng cần phải gọi ejb và nó sẽ được lên đến cụm để quyết định trường hợp phục vụ khách hàng.

+1

Điều này có thể gây nhầm lẫn cho mọi người: "Các EJB phân cụm chỉ được cung cấp cho các ejbs trạng thái.". Cụm ** hoạt động ** trong Wildfly cho EJB không trạng thái cung cấp chuyển đổi dự phòng và cân bằng tải. – Dherik

+1

Tôi đã cập nhật văn bản. Bạn nói đúng, tôi đã cải thiện từ ngữ nhờ sự quan sát của bạn. –

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