2010-04-27 20 views
6

Giả sử một cá thể máy chủ ứng dụng duy nhất có hai EAR được triển khai. EAR đầu tiên gọi EJB từ EAR thứ hai bằng cách sử dụng các giao diện EJB từ xa. Có tin đồn rằng ngay cả khi sự xâm nhập được thực hiện bằng giao diện từ xa, máy chủ ứng dụng biết rằng mọi thứ nằm trong cùng một JVM và sử dụng nội bộ giao diện từ xa với cơ chế giao diện cục bộ, cụ thể là nó không gọi phương thức thông qua RMI, không mở bất kỳ ổ cắm nào và không tuần tự hóa/deserialize đối tượng.EJB Giao diện cục bộ/từ xa trong các ứng dụng riêng biệt trong một cá thể máy chủ ứng dụng đơn lẻ

Điều này có đúng không? Nếu ai có phản hồi về hành vi của Weblogic 10.3.2 và OC4j 10.1.3 liên quan đến vấn đề này, nó sẽ được nhiều người đánh giá cao.

Trả lời

1

Không, điều đó không đúng. Nếu ORB thực hiện tối ưu hóa đối tượng cục bộ (đôi khi "đối tượng collocated"), thì nó sẽ không mở bất kỳ ổ cắm nào, nhưng nó sẽ thực hiện tuần tự hóa/deserialization, thường nhanh hơn so với việc sắp xếp. Các bản sao đối tượng bổ sung được thực hiện để tránh vi phạm mô hình lập trình.

Sơ đồ được tạo cho phép tối ưu hóa này. Dưới đây là một giao diện ví dụ:

public interface a extends Remote { 
    public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException; 
} 

Dưới đây là kết quả của rmic -iiop -keep a:

public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException { 
    if (!Util.isLocal(this)) { 
     /* ... trim remote code ... */ 
    } else { 
     ServantObject so = _servant_preinvoke("test",a.class); 
     if (so == null) { 
      return test(arg0, arg1); 
     } 
     try { 
      Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb()); 
      ArrayList arg0Copy = (ArrayList) copies[0]; 
      ArrayList arg1Copy = (ArrayList) copies[1]; 
      ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy); 
      return (ArrayList)Util.copyObject(result,_orb()); 
     } catch (Throwable ex) { 
      Throwable exCopy = (Throwable)Util.copyObject(ex,_orb()); 
      throw Util.wrapException(exCopy); 
     } finally { 
      _servant_postinvoke(so); 
     } 
    } 
} 

Khi vẫn còn sơ khai được kết nối với một đối tượng địa phương, nó gọi ObjectImpl._servant_preinvoke để định vị một servant (một trình bao bọc EJB trong trường hợp của bạn) trong cùng một JVM. Sau đó, nó tạo một bản sao của các đối số đầu vào (mô phỏng marshalling), gọi phương thức và tạo một bản sao của đối tượng kết quả (một lần nữa mô phỏng marshalling).

Tôi không phải là chuyên gia về WebLogic. Điều đó nói rằng, tài liệu này ngụ ý rằng WebLogic thực hiện tối ưu hóa đối tượng được phân bổ:

http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328