apkm-search

[Java] Ví dụ đơn giản về RMI và Activation

Một ví dụ về RMI với tính năng Activation giúp giảm thiểu tiêu tốn tài nguyên hệ thống, chỉ kích hoạt khi có client gọi đến.

Các bạn đã xem bài Ví dụ đơn giản RMI trong Java với cách này thì chúng ta mổi lần có một đối tượng cần đăng tải thì phải new (tức là phải có một thể hiện của class Implement) như vậy sẽ rất tốn tài nguyên vì một hệ thống RMI không chỉ có 1-2 object với lại có những Object có thể không được sử dụng trong suốt quảng đời của nó.Nhưng vẩn phải tốn tài nguyên để duy trì thể hiện của nó. Hôm nay mình sẽ giới thiệu các bạn một các thức sử dụng Activation để giúp Server giảm tải.

Ý tưởng:

  • Khi nào có client gọi thì mới tạo mới thể hiện của đối tượng
  • Đối tượng sẽ ở trạng thái sleep và do RMI Daemon quản lý

Cách thức thực hiện :

  • Mọi thao tác vẩn giống với RMI sử dụng UnicastRemoteObject chỉ khác khi đăng tải
  • Khi đăng tải thay vì RMI Registry quản lý thì chúng ta chuyển nó sáng RMI Daemon

Code cụ thể:

CalculatorServices :

CalcutatorImpl : Thay vì extends từ UnicastRemoteObject thì chúng ta extends từ  Activatable và construstor mặc định phải chứ super(id,0);

 Server: Khác biệt lớn nhất ở class này.Mình đã comment giải thích các đoạn code rồi.

 Client: Không có gì thay đổi ở Client

 Cách chạy chương trình:

Các bạn chạy theo trình tự như sau

Các bạn chú ý khi chạy có thể chúng ta sẽ gặp 1 số lổi về access denied nên chúng ta phải cáp quyền cho nó bằng file rmi.policy(tên gì cũng đc ).Đơn giản chỉ là

Để đơn giản thì mình đã tạo ra file .bat để chạy nhanh chóng hơn.Các bạn vẩn có thể chạy bằng cách sử dụng cmd

Một vấn đề nữa là khi chạy lần thứ 2 sẽ bị báo lổi từa lưa đó là do các object bị trùng(trùng cái gì thì mình chưa biết) cách sử lổi này đó là bạn vào thư mục chạy và xóa hết các file .class và chạy lại sẽ hết lổi

BÌNH LUẬN BÀI VIẾT

Leave a Reply

22 Comments on "[Java] Ví dụ đơn giản về RMI và Activation"

Notify of
avatar
Sort by:   newest | oldest
chu ky so2 năm gắn bó cùng NQDung.COMLevel 1
1 comment

Chạy trên giao diện thì sao nhỉ?

ve may bay gia re2 năm gắn bó cùng NQDung.COMLevel 1

Mình cũng đang có thắc mắc như bạn?

macbook cu3 năm gắn bó cùng NQDung.COMLevel 1
2 comments

Bạn hướng dẫn trong bài viết này là chạy bằng CMD phải không? Bạn có cách nào chạy trên elips không? giúp mình với.

toyota tan cang3 năm gắn bó cùng NQDung.COMLevel 1

Bạn hướng dẫn cách chạy được không? Mình không biết làm sao để chạy hết.hjc

Shishui ZUchiha4 năm gắn bó cùng NQDung.COMLevel 1
Shishui ZUchiha
3 comments

bước 1 bên dưới em viết bị thiếu: -J-Djava.security.policy=rmi.policy

Shishui ZUchiha4 năm gắn bó cùng NQDung.COMLevel 1
Shishui ZUchiha
3 comments

Đây là toàn bộ code của em:
http://www.mediafire.com/download/c72b60zvzcbf32i/activation.rar

em dùng eclipse để biên dịch chương trình,
Cách biên dichj của em là:
bước 1: khởi động rmid.exe
start rmid -J-Djava.security.policy
bước 2 : chạy Server, bằng cách kích vào run(trên eclipse)
trong code bước 2 này nó tự đăng ký rmiregistry với (LocateRegistry.createRegistry(1099)
bước 3: Chạy Client: thì bị lỗi.

Nguyễn Quốc Dũng4 năm gắn bó cùng NQDung.COMLevel 1
Nguyễn Quốc Dũng
15 comments

em nên tập chạy bằng cmd nhé !

zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments

Chào anh! giờ ở bên server của em chạy được rồi.. ko còn báo lổi nửa. > nhưng khi chạy bên clien.. nó lại báo lổi ở hàng này:

CalculatorServices cal = (CalculatorServices) Naming.lookup(“rmi://localhost:1099/CalculatorServices”);

vê ConnectException. anh có thể xem lại giúp em được ạ?

Nguyễn Quốc Dũng4 năm gắn bó cùng NQDung.COMLevel 1
Nguyễn Quốc Dũng
15 comments

em xem thử khai báo rmi://localhost:1099/CalculatorServices ở server và client có giống nhau chưa ?

Shishui ZUchiha4 năm gắn bó cùng NQDung.COMLevel 1
Shishui ZUchiha
3 comments

em đả thử hết rôi anh, nhưng không được, em chỉnh mải mới chạy được cái server vì lúc trước em không biết file rmi.policy.. nhưng sau khi tạo đường dẩn tới file này thì lại chạy được,
Nhưng sang phần client, thì khi triệu gọi đối tượng lại không được và bị lổi như em nói ở trên.

Nguyễn Quốc Dũng4 năm gắn bó cùng NQDung.COMLevel 1
Nguyễn Quốc Dũng
15 comments

em gửi anh cái em đang làm đi ! anh xem giúp cho

zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments

file java.policy của em là :

grant {

permission java.security.AllPermission;

};

Em dùng eclipse để biên dịch chương trình, và xảy ra một số lổi ở dưới.
để kích hoạt rmiregistry.exe thì chúng ta có thể dùng LocateRegistry.createRegistry(port) để kích hoạt
vậy rmid.exe có lệnh nào để kích hoạt được cái này ko ạ!
thanks anh!

zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments
Dưới đây là code của em: bước 1: public interface MyAutoObject extends java.rmi.Remote { public String callMeRemotely() throws java.rmi.RemoteException; } bước 2: public class MyAutoObjectImpl extends java.rmi.activation.Activatable implements MyAutoObject { // Phương thức khởi dựng dùng kích hoạt đối tượng // Khi dịch vụ rmid kích hoạt đối tượng nó sẻ gọi phương thức ActivationÍntantiator.newInstance va gián tiếp gọi đến // phương thức khởi dựng này // id là định danh của đối tượng cần kích hoạt public MyAutoObjectImpl(java.rmi.activation.ActivationID id, java.rmi.MarshalledObject data) throws java.rmi.RemoteException { super(id, 0); } public String callMeRemotely() throws java.rmi.RemoteException { return “Success Server Call”; } }… Read more »
zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments

ở dưới là một sô lổi ma em gặp? e đả làm theo nhiều bài viết, và cả bài viết nay.. nhưng vẩn không thể giải quyết dc vấn đề. mong anh giúp đỡ.

Nguyễn Quốc Dũng4 năm gắn bó cùng NQDung.COMLevel 1
Nguyễn Quốc Dũng
15 comments

Yahoo của mình là quocdung_2306 ,bạn có thể gữi code cho mình xem thử được không ?

zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments

Exception in thread “main” java.rmi.activation.ActivationException: unable to obtain ActivationSystem; nested exception is:

java.rmi.ConnectException: Connection refused to host: 192.168.1.189; nested exception is:

java.net.ConnectException: Connection refused: connect

at java.rmi.activation.ActivationGroup.getSystem(Unknown Source)

at Setup.main(Setup.java:17)

Caused by: java.rmi.ConnectException: Connection refused to host: 192.168.1.189; nested exception is:

java.net.ConnectException: Connection refused: connect

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)

at sun.rmi.server.UnicastRef.newCall(Unknown Source)

at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

at java.rmi.Naming.lookup(Unknown Source)

… 2 more

Caused by: java.net.ConnectException: Connection refused: connect

at java.net.DualStackPlainSocketImpl.connect0(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)

at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)

at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)

at java.net.AbstractPlainSocketImpl.connect(Unknown Source)

at java.net.PlainSocketImpl.connect(Unknown Source)

at java.net.SocksSocketImpl.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.(Unknown Source)

at java.net.Socket.(Unknown Source)

at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)

at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

… 8 more

zuchihashishui4 năm gắn bó cùng NQDung.COMLevel 1
zuchihashishui
3 comments

Chào anh! anh có thể cho em cái yahoo của anh đê có thể trao đối với anh về phần Activation này dc ko ạ? thanks anh.

wpDiscuz