Triệu gọi phương thức của đối tượng từ xa RMI

Hơn ai hết, nếu đã từng đảm nhận công việc lập trình ứng dụng bạn sẽ hiểu được cồng việc nặng nhọc khi phải viểt mã lệnh cho từng đơn vị chương trình. Vậy thì tại sao chúng ta không tận dụng những cái có sẵn, trong khi có hàng trăm triệu dòng mã lệnh đã được thiết kế và xây dựng sẵn, phân tán ờ trên mạng, đang hoạt động rất hiệu quả.

Ngày nay, cộng đồng những người lập trình bắt đầu nghĩ rằng “đổi tượng có ở mọi nơi”, thường dưới dạng mã nguồn mờ. Những đối tượng này, tất nhiên được hỗ trợ để trao đổi được với nhau theo những giao thức chuẩn trên mạng. Ví dụ, bạn cỏ một đối tượng ờ máy trạm (máy khách – Client), ờ đó người sừ dụng cần phải điền dữ liệu vào mẫu báo cáo. Đối tượng này (đổi tượng khách) có thể gửi một thông điệp (thỉnh cầu) cho đối tượng trên máy chủ (đổi tưc/ng phục vụ – Server) trên mạng để yêu cầu cung cấp các thông tin cần thiết. Đối tượng trên máy chủ truy nhập vào các cơ sờ dữ liệu (CSDL) để có được những thông tin mà khách yêu cầu và gừi lại cho đối tượng khách. Đó chính là ý tưởng cùa Java- RMI, phương thức ỉập trình triệu gọi từ xa. Lập trình phân tán đổi tượng bằng cách triệu gọi phương thức từ xa RMI là cách hợp tác giữa các đổi tượng Java có những mã lệnh còi đặt (bao gồm các phương thức và thuộc tính) nằm trên các máy khác nhau (chinh xác là nằm (rên các JVM – máy ảo Java khác nhau) và có thể triệu gọi lẫn nhau để trao đổi tin [2],

Trong mô hình Client/server truyền thống, các yêu cầu được dịch sang một format (dạng) trung gian (dạng từng cặp tên gọi / giá trị hoặc các dữ liệu trong XML). Máy chủ Server phân tích format yêu cầu, xử lý để có được kết quả và gửi trả lòi cho máy khách Client. Máy khách phân tích format trả lời và hiển thị thông tin cho người sử dụng.

1. Triệu gọi phương thức từ xa

Cơ chế triệu gọi từ xa có vẻ đơn giản hơn mô hình Client/Server. Nếu ta cần truy cập tới một đối tượng ờ trên một máy khác thì ta chi cần triệu gọi phương thức cùa đối tượng ở trên mày đó. Tất nhiên, các tham số bằng cách nào đó phải được gửi đến cho máy kia và đối tượng nhận được phải chắc chắn thực hiện phương thức tương ứng để có được những thông tin cần thiết gửi trả lại cho đối tượng khách hàng.

 

Tuy nhiên, việc triệu gọi phương thức của các đối tượng từ xa chắc chắn sẽ phức tạp hơn nhiều so với lời gọi hàm ở trong cùng một chương trinh ứng dụng. Như ở chương 1 đã phân tích, các đối tượng trên hai máy ảo khác nhau thì hoạt động trên hai tiến trình khác nhau, có hai không gian địa chi khác nhau, và vỉ thế việc tham chiếu tới các biến, địa chi đối tượng là hoàn toàn khác nhau. Lời gọi các hàm cục bộ thường luôn trả về kết quả sau khi thực hiện thành công, trong khi lời triệu gọi các thuộc tính biên từ xa phải thông qua kết nối mạng, có thể bị tắc nghẽn, bị ngẩt do mạng gặp sự cố, v.v. Đối với lời gọi hàm trên máy cục bộ, các tham số truyền cho hàm thường đặt vào ngãn xếp, trong khi tham số truyền cho các phương thức cùa đối tượng ờ xa phải được đóng gói và chuyển qua mạng theo giao thức chuẩn để đến được đích thông qua các đại diện trung gian.

2. Kiến trúc RMI Java

Mục đích cùa kiến trúc RMI là tạo ra một mô hình đối tượng phân tán và được tích hợp với ngôn ngữ lập trình Java. Kiến trúc này đã thành công trong việc tạo ra một hệ thống khá an toàn, kế thừa được sức mạnh của Java trong xử lý phân tán và đa luồng ([2], [3]).

về cơ bản, RMI được xây dựng dựa trên kiến írítc ba tầng như hình 2.2.

  • Tầng đầu tiên bao gồm hai lớp trung gian stub và Skeleton, chúng được hệ thống tạo ra theo yêu cầu. Các lớp này chặn các lời gọi phưcmg thức cùa chương trình khách (Client) tới các biến tham chiếu và gửi tới dịch vụ triệu gọi từ xa. Lớp Skeleton liên lạc với stub thông qua liên kết RMI. Nó đọc các tham số của lời triệu gọi từ xa từ một liên kết nào đó, thực hiện lời gọi tới đối tượng thực thí dịch vụ từ xa và sau đó gửi các giá trị trả lại cho Trong Java 2 SDK, các giao diện mới được xảy dựng đã làm cho Skeleton lồi thời. RMI sử dụng phép ảnh xạ để thực hiện việc kết nối tới các đối tượng dịch vụ tù xa thay cho Skeleton.
  • Tầng tham chiếu từ xa là tầng tiếp theo. Tầng này dịch và quản lý các tham chiếu tới các đối tượng dịch vụ từ xa. Ở 1, tầng này thực hiện kết nối theo cơ chế điểm – tới – điểm. Đen Java 2 SDK, tầng này được cải tiến để nâng cao việc hỗ trợ để kích hoạt các đối tượng dịch vụ từ xa đang chờ thực hiện thông qua ROA, đó là cách kết nối Client/server.
  • Tầng giao vận dựa trên kết nối TCP/IP giữa các máy tính trong mạng. Ngay cả khi hai chương trinh chạy trên hai JVM trong cùng một máy, chúng cũng thực hiện kết nối thông qua TCP/IP của chính máy đó. Tầng giao vận RMI được thiết kế để thiết lập một kết nối giữa máy Client với máy

Giả sử, ta có đối tượng C1 được cài đặt chạy trên máy phục vụ c. RMI cùa Java giúp ta tạo ra hai lớp trung gian Cl_Skel (không cần thiết đối với Java 2 SDK) và Cl_stub. Lớp Cl_stub sẽ được nạp về máy khách B. Khi đối tưcmg BI trên máy B triệu gọi Cl, máy ảo Java sẽ chuyển lời gọi đến lớp Cl_stub. Cl_stub sẽ chịu trách nhiệm đóng gói các tham sổ và chuyển chúng qua mạng đến cho máy C. Tại máy c, lớp Cl_Skel (Cl_stub được nạp về và thay thể ờ Java 2 SDK) sẽ nhận tham số để chuyển vào không gian địa chì tương thích với đối tượng C1 sau đó gọi phương thức tương ứng để thực hiện. Kết quả nếu có do phương thức của đối tượng C1 trả về sẽ được lóp Cl_Skel (Cl_stub thay thế ờ Java 2 SDK) đóng gói trả ngược cho Cl_stub. Cl_stub chuyển giao kết quà cuối cùng cho Bl. Theo cơ chế này, có thể hình dung như BI đang trao đổi trực tiếp với đổi
tượng C1 ngay trên cùng một máy. Ngoài ra, với sự trợ giúp cùa lớp trung gian C1 stub, khi kết nối mạng gặp sự cổ, lóp trung gian stub sẽ luôn biết cách thông báo lồi đến đối tượng Bl.

Thực tế có một câu hỏi là: Làm thế nào để BI tham chiếu được đến C1 khi không có lóp C1 nào được cài đặt ở máy B? cistub trên máy B chì làm lớp trung gian chuyển đổi tham số và thực hiện các giao thức mạng, nó không phải là hình ảnh cùa đối tượng Cl. Để làm được điều đó, lớp cùa đối tượng C1 cần cung cấp một giao diện tương ứng, được gọi là giao diện từ xa với các phương thức cho phép đối tượng BI gọi được trên máy B.

stub thường trực trên máy khách, không ở trên máy chủ. Nó có vai trò đóng gói các thông tin bao gồm:

  • Định danh đối lượng tìr xacần sử dụng
  • Mô tá về phương thức cần triệu gọi
  • Mã hoá các tham số và truyền cho s ke 1.

stub sẽ chuyển những thông tin trên cho máy chù. Ở phía máy chủ, đối tượng Skel nhận thực hiện những công việc sau để gọi phương thức từ xa:

  • Giải mã các tham số
  • Xác định đối tượng để thực hiện lời gọi hàm tương ứng
  • Thực hiện lời gọi phương thức theo yêu cầu
  • Tập họp kết quả đề trả lời hoặc thông báo các lồi ngoại lệ

Hình trên mô tả quá trình tổ chức gói các tham số, các dữ liệu trả lời và sự trao đổi giữa các đối tượng trung gian trong kỹ thuật triệu gụi từ xa.