Đề tài Tìm hiểu cơ chế RMI của Java và xây dựng một môi trường hỗ trợ tính toán song song và phân bố

Giới thiệu đề tài I - Đề tài Tìm hiểu cơ chế RMI của Java và xây dựng một môi trường hỗ trợ tính toán song song và phân bố . II - Giới thiệu Luận văn này giới thiệu một phương hướng suy nghĩ và hiện thực một môi trường hỗ trợ việc tính toán song song và phân bố bằng cách sử dụng cơ chế RMI trong Java. Chương trình hiện thực của luận văn này là một ứng dụng cung cấp cho người sử dụng những tính năng cơ bản để có thể điều khiển môi trường tính toán một cách dễ dàng tiện dụng. Về những tính năng kỹ thuật của môi trường ta có thể nói rằng môi trường cho phép người sử dụng có thể sử dụng các tài nguyên phân bố trên mạng. Cụ thể hơn, môi trường cung cấp cho người sử dụng khả năng sử dụng bộ nhớ và khả năng xử lý của CPU của những máy tính được nối với nhau trên mạng. Chương trình hiện thực còn phục vụ được nhu cầu cần có một cơ chế truy xuất và quản lý hiệu quả các tài nguyên tính toán trên mạng. Ngoài ra, chương trình còn thỏa mãn nhu cầu về tính dễ sử dụng bằng cách cung cấp một giao diện thân thiện. Tính dễ sử dụng là nhờ môi trường hiện thực ra không đòi hỏi một sự nổ lực lớn nào từ phía người sử dụng hệ thống. Chiến lược về cân bằng tải và các chiến lược về Fault Tolerance cho hệ thống cũng được quan tâm giải quyết. Cuối cùng ta thấy, vì Java là một ngôn ngữ lập trình không phụ thuộc vào Platform, vì vậy chương trình hiện thực được cũng không phụ thuộc Platform. Một cách rõ ràng hơn, chương trình có thể chạy trên các hệ điều hành khác nhau một cách dễ dàng. III - Sơ lược về yêu cầu đề tài Bài toán đặt ra cho luận văn này là : Một hệ thống máy tính gồm nhiều máy tính có khả năng tính toán lớn được nối kết trên một mạng . Các máy này có thể đảm nhận việc thực hiện các dịch vụ tính toán lớn mà chúng ta gọi là các Service. Yêu cầu đặt ra là xây dựng một hệ thống đóng vai trò là một môi trường cho phép thực thi những bài toán tương đối lớn theo mô hình song song và phân bố. Cơ chế hỗ trợ để xây dựng đề tài là RMI trong Java, là một cơ chế Distributed Object. Thực chất đây là hệ thống có nhiệm vụ quản lý những dịch vụ tính toán phân bố . Ngoài việc phải phân phối công việc để thực hiện một yêu cầu dịch vụ nào đó, hệ thống còn có các chức năng như vấn đề thêm dịch vụ, sửa hay xóa dịch vụ. Việc xây dựng chương trình cũng giải quyết các vấn đề khá quan trọng của bất cứ hệ thống tính toán phân bố nào, chẳng hạn vấn đề an toàn, bảo mật cho hệ thống, vấn đề kháng lỗi của hệ thống, vấn đề về việc phân chia công việc giữa các máy trong hệ thống Về việc sử dụng hệ thống, người sử dụng (Client) từ một máy tính bình thường, sử dụng môi trường lập trình có giao tiếp gọi hàm từ xa theo cơ chế RMI trong Java là đã có thể truy xuất các dịch vụ tính toán có trong hệ thống. Người quản trị hệ thống (Admin) thông qua chương trình Admin, do người hiện thực hệ thống cung cấp, sẽ quản lý các hoạt động của hệ thống. Người phát triển dịch vụ sẽ xây dụng dịch vụ theo một chuẩn nhất định và trao cho người Admin để người quản trị hệ thống có thể chạy thử. Sau đó, người Admin sẽ thực hiện thêm dịch vụ vào hệ thống thông qua một số thao tác đơn giản trên chương trình Admin. Tóm lại, chúng ta cần giải quyết các vấn đề chính yếu sau : · Làm thế nào Client có thể dễ dàng sử dụng được các Service trên các Server mà không cần quan tâm đến phần tổ chức của các dịch vụ bên trong hệ thống. · Admin có thể quản lý, thống kê việc truy xuất các dịch vụ từ các Client. · Admin có thể quản lý, kiểm soát và thống kê hoạt động của các Server, cũng như Service trên các Server ấy, để cho hệ thống hoạt động đạt hiệu quả cao nhất. · Làm sao để có một cơ chế thuận lợi cho người phát triển thêm các dịch vụ cho hệ thống mà không làm ảnh hưởng đến hoạt động của các dịch vụ đã có sẵn trước đó. · Vấn đề khắc phục lỗi xảy ra trong quá trình vận hành hệ thống. · Làm sao để thực hiện việc phân chia công việc sao cho hiệu quả nhất có thể. Chiến lược để thực hiện việc phân chia này như thế nào. · Cách giải quyết tình trạng tắc nghẽn có thể xảy ra của hệ thống.(Mô hình phải như thế nào để giảm tình trạng tắc nghẽn này). · Làm sao giải quyết các vấn đề ưu tiên trong hệ thống. Vì rất có thể trong quá trình hoạt động của hệ thống sẽ có một số dịch vụ cần phải có độ ưu tiên cao. Chương trình sẽ được hiện thực bằng ngôn ngữ Java. Tuy nhiên, bên cạnh việc tìm hiểu cơ chế RMI, cần có thêm một cơ sở lý thuyết về một số cơ chế nhằm hỗ trợ trong việc xây dựng chương trình. Các cơ sở lý thuyết cơ bản chẳng hạn thế nào là ứng dụng phân bố, các cơ chế Serialization, Dynamic Class Loading, Security, Multithread, Registry, Codebase, Activation, Naming sẽ được trình bày cụ thể ở phần sau đây.

doc125 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3179 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm hiểu cơ chế RMI của Java và xây dựng một môi trường hỗ trợ tính toán song song và phân bố, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ät chöông trình (Object), giaû laäp Web Server, ra ñöùng chôø taïi port coù trong codebase, ñeå chôø nhaän lôøi yeâu caàu truy caäp file Class vaø thöïc hieän vieäc truy caäp tôùi file Class sau ñoù traû veà file Class cho chöông trình yeâu caàu. Object naøy ñöôïc taïo ra töø moät ñònh nghóa Class, trong chöông trình naøy thì Class naøy ñöôïc ñaët teân laø ClassFileServer. Ngoaøi ra, coù moät ñieàu caàn phaûi chuù yù laø khi moät JVM göûi moät yeâu caàu ñeán cho moät JVM töø xa thì lôøi yeâu caàu naøy ñöôïc format theo daïng chuaån laø HTTP Request. Hình 34. Machine B coù theå truy caäp File treân Machine A nhôø ClassFileServer. ClassFileServer Yeâu caàu : Giaû laäp chöông trình Web Server hay File Server treân moät maïng maùy tính. Nghóa laø chöông trình naøy seõ ñöùng taïi moät Port naøo ñoù cuûa Local JVM, chôø nhaän moät yeâu caàu truy caäp file töø moät maùy naøo ñoù, sau ñoù thöïc hieän vieäc truy caäp file ñoù taïi Local JVM vaø thöïc hieän vieäc truyeån file caàn thieát veà cho chöông trình yeâu caàu. Giaûi thuaät : Ñaây laø moät chöông trình tham khaûo cuûa Sun Microsystems, Inc. Do ñoù, nhöõng phaàn trình baøy sau ñaây laø phaàn ñoïc hieåu ñeå coù theå söû duïng chöông trình moät caùch hieäu quaû. Hình 35. Thuaät giaûi chöông trình ClassFileServer Giaûi thích : Taïo ServerSocket taïi moät port do ta cung caáp cho chöông trình qua haøm taïo cuûa ClassFileServer. Chöông trình seõ thöïc hieän ñoïc file taïi Local JVM döïa vaøo ñöôøng daãn chæ ñeán nôi chöùa file cho pheùp truy caäp, ñöôøng daãn naøy do ta cung caáp qua haøm taïo cuûa ClassFileServer. Keát luaän Vôùi giaûi thuaät nhö treân thì ta ñaõ hoaøn thaønh vieäc vieát moät chöông trình giaû laäp Web Server nhaèm hoaøn taát cho cô cheá load class ñoäng cuûa Java. Toùm laïi, ta ñaõ giaûi quyeát ñöôïc vaán ñeà laø laøm theá naøo ñeå RMIRegistry hay moät JVM khaùc ñang chaïy chöông trình Client coù theå truy caäp ñöôïc Stub, Skeleton taïi JVM Server. Thieát laäp CODEBASE Veà vieäc thieát laäp codebase, chuùng ta coù theå söû duïng hoã trôï cuûa ngoân ngöõ Java, duøng nhöõng haøm cuûa Class java.util.Properties do Sun cung caáp. Nhö ñaõ trình baøy veà CODEBASE ôû treân, ta thaáy khoâng caàn phaûi nhaéc laïi caùch söû duïng codebase nhö theá naøo. Chæ coù moät ñieàu caàn phaûi chuù yù ôû ñaây laø teân maùy (ñòa chæ) vaø Port duøng ñeå thieát laäp CODEBASE laø teân cuûa maùy coù Stub (Skeleton) vaø ñoàng thôøi treân maùy ñoù phaûi toàn taïi ít nhaát moät chöông trình töông töï nhö ClassFileServer ñang chaïy nhö vöøa trình baøy ôû phaàn treân, Port duøng ñeå thieát laäp codebase laø Port maø chöông trình ñoù ra ñöùng chôø vaø nhaän yeâu caàu truy caäp file töø moät maùy tính töø xa. Giaû söû ClassFileServer ñang chôø taïi maùy coù ñòa chæ laø hostName vaø taïi Port 2001 thì ñoaïn chöông trình ñeå thieát laäp Codebase laø nhö sau : import java.util.*; ClassFileServer webServer; webServer = new ClassFileServer(2001,”d:\\chuongtrinh”); String hostName = InetAddress.getLocalHost().getHostName(); String codebase = "http://”+hostName+”:2001/”; Properties sysProps; sysProps = System.getProperties(); sysProps.put("java.rmi.server.codebase", codebase); System.setProperties(sysProps); Ñeán ñaây, vieäc thieát laäp codebase cuøng vôùi vieäc chaïy chöông trình giaû laäp Web Server, chuùng ta ñaõ coù theå chaïy ñöôïc chöông trình RMI moät caùch bình thöôøng, nghóa laø vieäc giao tieáp giöõa nhöõng phaàn khaùc nhau treân caùc Host khaùc nhau trong heä thoáng cuûa chuùng ta ñaõ coù theå giao tieáp vôùi nhau moät caùch deã daøng. Do ñoù ôû nhöõng phaàn sau ñaây, chuùng ta seõ tieáp tuïc quan taâm giaûi quyeát caùc vaán ñeà cuï theå cho moät chöông trình Server nhö ñaõ thieát keá ôû treân. Ñoïc caùc file Database Veà vieäc ñoïc caùc Database caàn thieát, chuùng ta söû duïng Class java.io.RandomAccessFile do Sun cung caáp ñeå truy caäp file caàn thieát. Veà vieäc Load Class vaø taïo moät Instance môùi töø Class vöøa Load, chuùng ta coù theå duøng caùc haøm cuûa Class java.rmi.server.RMIClassLoader ñeå giaûi quyeát ñöôïc yeâu caàu. Ñeå ñoïc ñöôïc caùc Field cuûa moät file trong soá caùc File Database cuûa Server ñeå laáy döõ lieäu maø file coù ñöôøng daãn laø “D:\Chuongtrinh\LVTN\server\database\InitService.dat” thì chuùng ta duøng ñoaïn chöông trình sau : String initServicePath; = “D:\\Chuongtrinh\\LVTN\\server\\database\\InitService.dat”; try { RandomAccessFile initServiceDatabase; initServiceDatabase = new RandomAccessFile(initServicePath,"r"); long fileLength = initServiceDatabase.length(); String databaseRecord,remoteObjectName,fileName,password; int i; ServiceInfor serviceInforTemp; while (initServiceDatabase.getFilePointer() < fileLength) { databaseRecord = initServiceDatabase.readLine(); if (databaseRecord.length()!=0) { i = databaseRecord.indexOf(' '); remoteObjectName = databaseRecord.substring(0,i).trim(); databaseRecord = databaseRecord.substring(i,databaseRecord.length()).trim(); i = databaseRecord.indexOf(' '); fileName = databaseRecord.substring(0,i).trim(); databaseRecord = databaseRecord.substring(i,databaseRecord.length()).trim(); password = databaseRecord; } } //end While }catch(IOException a) { System.out.println("Error read/write File !"); } Ñeå Load moät Class môùi vaø taïo moät Instance môùi ngay trong chöông trình ta duøng ñoaïn chöông trình sau : Class cl = RMIClassLoader.loadClass(fileName); System.out.println("FileClass was already loaded :"+ fileName); ServiceInterface newObject = (ServiceInterface) cl.newInstance(); Keát quaû cuûa ñoaïn chöông trình treân laø moät Instance môùi ñöôïc taïo ra, Instance naøy laø Object cuûa class coù bytecode chöùa trong file coù teân laø fileName. Veà phía class naøy chæ coù moät thoâng tin duy nhaát laø class naøy laø hieän thöïc (implement) cuûa Interface teân laø ServiceInterface. Toùm laïi, chuùng ta ñaõ giaûi quyeát ñöôïc vieäc ñoïc döõ lieäu töø caùc File database döôùi daïng Text, sau ñoù söû duïng döõ lieäu naøy ñeå tìm caùc file class töông öùng vôùi döõ lieäu vaø taïo môùi caùc Instance cuûa caùc Class naøy, sau ñoù duøng haøm Naming.bind ñeå ñaêng kyù chuùng vôùi RMIRegistry. Do ñoù, voâ hình chung chuùng ta ñaõ ñoïc Database vaø khôûi taïo ñöôïc caùc Service ban ñaàu döïa theo Database ñoù. Töø luùc naøy trôû ñi, trong vieäc vieát chöông trình Server chuùng ta chæ caàn quan taân ñeán caùc thuaät giaûi cho caùc haøm cho pheùp goïi töø xa. Haøm AddService Thuaät giaûi cuûa chöông trình naøy coù theå bieåu dieãn nhö sau : Hình 36. Thuaät giaûi cho haøm AddService. Tham soá cho haøm AddService treân Server naøy laø moät Object thuoäc Class AddServiceInfor, trong Object naøy thöïc chaát laø moät goùi caùc döõ lieäu. Ñònh nghóa Class nhö sau : package Lvtn.server.interfaces; import java.io.*; public class AddServiceInfor implements Serializable { public byte[] bytecode; public byte[] stub; public byte[] skeleton; String Password; String RemoteObjectName; String FileName; public AddServiceInfor() { } public void setPassword(String pw) { Password = pw; } public void setRemoteObjectName(String name) { RemoteObjectName = name; } public void setFileName(String fn) { FileName = fn; } public void setAll(String pw,String name,String fn) { this.setPassword(pw); this.setRemoteObjectName(name); this.setFileName(fn); //this.setRemotePlace(place); } public String getPassword() { return Password; } public String getRemoteObjectName() { return RemoteObjectName; } public String getFileName() { return FileName; } } Giaûi thích : Bieán “bytecode” chöùa bytecode cuûa chöông trình Service. Bieán “stub” chöùa bytecode cuûa Stub class cho Remote Object Service. Bieán “skeleton” chöùa bytecode cuûa Skeleton cho Remote Object Service. Bieán “Password” chöùa Password cho Remote Object Service môùi. Password naøy seõ ñöôïc duøng ñeå kieåm tra quyeàn söûa ñoåi hay thay theá Service. Bieán RemoteObjectName : teân dòch vuï. Bieán FileName : teân File Class. Haøm AddServiceInfor() : haøm taïo. Haøm setPassword(String pw) : Gaùn giaù trò cho bieán Password trong Object. Haøm setRemoteObjectName(String name) : Gaùn giaù trò cho bieán RemoteObjectName trong Object. Haøm setFileName(String fn) : Gaùn giaù trò cho bieán FileName trong Object. Haøm “String getPassword()” : traû veà giaù trò cuûa bieán Password trong Object. Töông töï cho caùc haøm : String getRemoteObjectName() String getFileName() Thuaät giaûi chöông trình : Laáy bytecode ghi xuoáng dóa: duøng FileOutputStream do Java cung caáp ñeå taïo moät File môùi töông öùng vôùi döõ lieäu trong tham soá ñaõ truyeàn cho haøm AddService. Load Class môùi vaø taïo Instance : töông töï nhö ñaõ trình baøy ôû phaàn ñoïc Database ôû treân. Set Password vaø ñaêng kyù vôùi RMIRegistry : duøng haøm setPassword cuûa Interface teân laø ServiceInterface. Theâm thoâng tin quaûn lyù vaøo File Database : duøng class RandomAccessFile do Java cung caáp ñeå thao taùc treân File. Theâm thoâng tin quaûn lyù vaøo coâng cuï quaûn lyù cuûa chöông trình : duøng class Vector do Java cung caáp ñeå laøm coâng cuï quaûn lyù thoâng tin cuûa chöông trình, do ñoù ta cuõng seõ duøng caùc haøm cuûa Class Vector naøy ñeå thöïc hieän thao taùc theâm naøy. Haøm DeleteService Thuaät giaûi cuûa chöông trình naøy coù theå bieåu dieãn nhö sau : Hình 37. Thuaät toaùn cho haømDeleteService Tham soá cho haøm DeleteService treân Server Remote Object laø moät Object thuoäc Class DeleteServiceInfor, trong Object naøy thöïc chaát laø moät goùi caùc döõ lieäu. Ñònh nghóa Class nhö sau : package Lvtn.server.interfaces; import java.io.*; public class DeleteServiceInfor implements Serializable { String Password; String RemoteObjectName; public DeleteServiceInfor() { } public void setPassword(String pw) { Password = pw; } public void setRemoteObjectName(String name) { RemoteObjectName = name; } public void setAll(String pw,String name) { this.setPassword(pw); this.setRemoteObjectName(name); } public String getPassword() { return Password; } public String getRemoteObjectName() { return RemoteObjectName; } } Giaûi thích : Bieán “Password” chöùa Password cho Remote Object Service seõ bò xoùa. Password naøy seõ ñöôïc duøng ñeå kieåm tra quyeàn xoùa Service. Bieán RemoteObjectName : teân dòch vuï. Haøm DeleteServiceInfor() : haøm taïo. Haøm setPassword(String pw) : Gaùn giaù trò cho bieán Password trong Object. Haøm setRemoteObjectName(String name) : Gaùn giaù trò cho bieán RemoteObjectName trong Object. Haøm “String getPassword()” : traû veà giaù trò cuûa bieán Password trong Object. Haøm “String getRemoteObjectName()” traû veà teân cuûa Remote Object. Thuaät giaûi chöông trình : Haøm naøy seõ laøm nhieäm vuï xoùa moät Service treân maùy Local (maùy maø chöông trình Server ñang chaïy). Vì vaäy, thoâng tin caàn thieát ñeå coù theå xoùa Service laø teân cuûa Remote Object vaø Password ñeå coù quyeàn xoùa Service ñoù. Laáy tham khaûo ñeán Remote Object : duøng teân Remote Object coù ñöôïc töø trong tham soá truyeàn cho haøm DeleteService vaø söû duïng haøm Naming.lookup() ñeå coù theå laáy ñöôïc tham khaûo ñeán Remote Object Service caàn thieát. Duøng tham khaûo vöøa môùi nhaän ñöôïc ñeå goïi haøm getAttribute() ñeå coù ñöôïc thuoäc tính cho pheùp söûa ñoåi. Laáy Password cho pheùp söûa ñoåi cuûa Service Remote Object, so saùnh vôùi Password coù trong tham soá truyeàn cho haøm, ñoàng thôøi so saùnh keát quaû cuûa haøm getAttribute vôùi True xem Service ñoù coù ñöôïc cho pheùp . Neáu ñaõ ñöôïc cho pheùp, coâng vieäc xoùa Service ñaõ coù theå baét ñaàu : duøng haøm Naming.unbind(Remote Object) ñeå xoùa söï xuaát hieän cuûa teân Service trong heä thoáng. Caäp nhaät thoâng tin quaûn lyù vaøo File Database : duøng class RandomAccessFile do Java cung caáp ñeå thao taùc treân File. Theâm thoâng tin quaûn lyù vaøo coâng cuï quaûn lyù cuûa chöông trình : duøng class Vector do Java cung caáp ñeå laøm coâng cuï quaûn lyù thoâng tin cuûa chöông trình, do ñoù ta cuõng seõ duøng caùc haøm cuûa Class Vector naøy ñeå thöïc hieän thao taùc caäp nhaät naøy. Haøm ReplaceService Ñaây laø haøm keát hôïp giöõa hai haøm laø xoùa moät dòch vuï cuõ vaø theâm vaøo heä thoáng moät dòch vuï môùi cuøng teân neáu ngöôøi yeâu caàu coù quyeàn xoùa dòch vuï ñoù. Do ñoù, ôû ñaây chuùng ta chæ caàn trình baøy löu ñoà thuaät giaûi cuûa haøm naøy maø khoâng trình baøy phaàn giaûi thích cho thuaät giaûi ñoù. Löu ñoà thuaät giaûi cuûa haøm nhö sau : Hình 38. Löu ñoà thuaät giaûi cuûa haøm ReplaceService cuûa Class Server. Tham soá cho haøm naøy laø moät Object thuoäc class ReplaceServiceInfor. Khai baùo cuûa Class naøy laø nhaèm muïc ñích cung caáp thoâng tin moät caùch ñaày ñuû nhaát cho hoaït ñoäng cuûa haøm ReplaceService. Khai baùo cuûa haøm naøy nhö sau : package Lvtn.server.interfaces; import java.io.*; public class ReplaceServiceInfor implements Serializable { String Password; String RemoteObjectName; String RemotePlace; String NewFileName; public ReplaceServiceInfor() { } public void setPassword(String pw) { Password = pw; } public void setRemoteObjectName(String name) { RemoteObjectName = name; } public void setRemotePlace(String place) { RemotePlace = place; } public void setNewFileName(String fn) { NewFileName = fn; } public String getPassword() { return Password; } public String getRemoteObjectName() { return RemoteObjectName; } public String getRemotePlace() { return RemotePlace; } public String getNewFileName() { return NewFileName; } } Haøm GetServerInfor : Laø haøm seõ traû veà moät Object thuoäc Class ServerInfor,trong Object naøy seõ chöùa laïi taát caû caùc thoâng tin caàn thieát cuûa Server taïi thôøi ñieåm goïi haøm ñoù. Khai baùo cuûa Class ServerInfor nhö sau : package Lvtn.server.interfaces; import java.io.Serializable; public class ServerInfor implements Serializable { public ServerInfor() { serverName = ""; serviceName = ""; } public String serviceName; public String serverName; } Giaûi thích : Bieán serverName chöùa teân maùy coù Remote Object Server. Chuù yù laø teân maùy naøy bao goàm luoân caû port cuûa RMIRegistry chaïy treân maùy naøy, vì bieán naøy laø ñeå nhaèm muïc ñích Agent coù theå tìm kieám Server moät caùch deã daøng. Bieán serviceName chöùa taát caû teân Service hieän ñang toàn taïi treân maùy Server, caùc teân Service naøy seõ caùch nhau bôûi daáu “:”. Giaûi thuaät cuûa haøm naøy hoaøn toaøn phuï thuoäc vaøo caùc coâng cuï quaûn lyù maø chöông trình duøng, nhöng veà thöïc chaát chæ laø thao taùc laáy thoâng tin töø caùc Vector. Keát luaän Toùm laïi, ñeán ñaây chuùng ta ñaõ giaûi quyeát ñöôïc caùc vaán ñeà : Toå chöùc thöïc hieän dòch vuï, phuïc vuï nhu caàu cuûa Client. Thöïc hieän vieäc theâm, söûa vaø xoùa moät dòch vuï sao cho thaät hieäu quaû. Cung caáp caùc thoâng tin veà nhöõng dòch vuï maø noù ñang naém giöõ. Chöông 7 : Chöông trình Agent Yeâu caàu ñoái vôùi chöông trình Agent Chöông trình Agent laø moät chöông trình quaûn lyù caùc Server. Chöông trình naøy seõ thöïc hieän vieäc giao tieáp vôùi ngöôøi Administrator thoâng qua chöông trình Admin, nhaän yeâu caàu veà quaûn lyù heä thoáng cuûa ngöôøi Administrator vaø sau ñoù thöïc hieän yeâu caàu ñoù hoaëc laø seõ yeâu caàu Server laøm vieäc naøo ñoù ñeå thoûa yeâu caàu töø phía ngöôøi Administrator. Toùm laïi, chöông trình Agent seõ giao tieáp vôùi chöông trình Admin ñeå quaûn lyù heä thoáng nhö yeâu caàu cuûa ngöôøi quaûn trò heä thoáng. Chöông trình naøy coøn giao tieáp vôùi chöông trình Client, nhaän yeâu caàu veà dòch vuï vaø thöïc hieän phaân chia coâng vieäc vaø tính toaùn caùc Server thích hôïp, sau ñoù yeâu caàu caùc Server laøm vieäc, chôø nhaän keát quaû vaø traû veà cho Client. Neáu trong soá caùc Server maø noù quaûn lyù khoâng coù Service maø Client yeâu caàu, thì Agent naøy seõ yeâu caàu Agent coù ñaûm nhieäm Service töông öùng laøm coâng vieäc ñoù. Cuøng vôùi caùc chöùc naêng khaùc, Agent coøn phaûi thöïc hieän vieäc traû thoâng tin veà heä thoáng do noù quaûn lyù veà cho Agent beân caïnh khi caàn thieát (Khi Agent beân caïnh yeâu caàu). Ngoaøi ra, chöông trình Agent coøn laø moät chöông trình cung caáp caùc thoâng tin veà heä thoáng moät caùch toång quaùt moät khi Administrator caàn ñeán. Vì vaäy coâng vieäc chính yeáu cuûa chöông trình laø cung caáp caùc haøm cho pheùp goïi töø xa ñeå Administrator coù theå döïa vaøo caùc haøm ñoù maø thöïc hieän vieäc quaûn lyù heä thoáng. Hôn theá nöõa, chöông trình Agent ngay chính baûn thaân noù laø moät phaàn töû yeáu cuûa heä thoáng, vì vaäy moät nhu caàu thieát yeáu ñaët ra ñoái vôùi chöông trình Agent laø phaûi giaûi quyeát caùc vaán ñeà veà Bottle Neck , Fault- Tolerance. Toùm laïi, chöông trình Agent caàn phaûi giaûi quyeát ñöôïc caùc vaán ñeà chính yeáu sau : Phuïc vuï cho Client sao cho Client coù theå deã daøng söû duïng caùc dòch vuï toát. Thöïc hieän vieäc theâm, söûa vaø xoùa moät dòch vuï sao cho thaät hieäu quaû. Cung caáp caùc thoâng tin veà caùc Server maø noù ñang naém giöõ. Cung caáp caùc thoâng tin veà User maø noù ñang naém giöõ. Cung caáp caùc thoâng tin veà Service maø noù ñang naém giöõ. Khaéc phuïc loãi coù theå xaûy ra trong quaù trình vaän haønh heä thoáng. Thöïc hieän vieäc phaân chia coâng vieäc cho caùc Server. Giaûi quyeát vieäc taéc ngheõn coù theå xaûy ra trong heä thoáng. Giaûi quyeát caùc vaán ñeà öu tieân trong heä thoáng. Vôùi yeâu caàu nhö treân, ñeå giaûi quyeát baèng RMI chuùng ta chæ caàn quan taâm ñeán vieäc vieát caùc haøm cho pheùp goïi töø xa giaûi quyeát töøng vaán ñeà cho Client vaø heä thoáng. Do ñoù, phaàn sau ñaây seõ neâu ra töøng haøm vaø vieäc laøm töông öùng cuûa chuùng. Giaûi thuaät chöông trình Agent Giaûi thuaät cuûa chöông trình Agent coù theå bieåu dieãn bôûi löu ñoà nhö sau : Hình 39. Giaûi thuaät chöông trình Agent Caùc haøm cuûa Agent Object Danh saùch caùc teân haøm : AddService(*) AddUser(*) AdminChangePassword(*) AdminChangePasswordUser(*) AdminConnect(*) AdminDisconnect(*) ChangePassword Connect(*) DeleteService(*) DeleteUser(*) Disconnect ServiceExecute UpdateService(*) getAgentInfor(*) getAllUser(*) getError getServiceHelp getServiceName Sau ñaây laø phaàn giaûi thích nhieäm vuï cuûa töøng haøm. Nhöng ñeå coù theå trình baøy chuùng ta seõ xem xeùt caùc haøm trong caùc nhoùm. Nhoùm thao taùc treân Service Nhoùm naøy bao goàm caùc haøm : AddService DeleteService UpdateService ServiceExecute getServiceName getServiceHelp Haàu heát caùc haøm trong nhoùm naøy ñoøi hoûi ngöôøi söû duïng phaûi coù quyeàn cuûa moät Administraror, vaø phaûi duøng chöông trình Admin thì môùi coù theå goïi ñöôïc caùc haøm naøy. Vì vaäy, töø ñaây ñeán cuoái Luaän vaên naøy chuùng ta quy öôùc raèng caùc haøm sau noù coù daáu “(*)” thì ñoù laø haøm chæ cho pheùp Admin goïi. AddService : Theâm moät dòch vuï vaøo heä thoáng. Vôùi haøm naøy thì chæ coù Administrator môùi ñöôïc pheùp goïi, ñeå goïi ñöôïc haøm naøy ñoøi hoûi Administrator phaûi duøng chöông trình Admin, laø chöông trình do ngöôøi phaùt trieån heä thoáng cung caáp, ñeå coù theå yeâu caàu Agent thöïc thi haøm naøy. DeleteService : Xoùa moät dòch vuï do Agent quaûn lyù. Haøm naøy cuõng coù tính chaát vieäc goïi haøm töông töï nhö AddService Hình 40 Xoùa moät dòch vuï trong heä thoáng. ReplaceService : Söûa-Thay theá moät dòch vuï baèng moät dòch vuï môùi. Hình 41. Thay môùi moät dòch vuï trong heä thoáng. ServiceExecute : Thöïc thi moät dòch vuï. Hình 42. Thöïc thi moät dòch vuï trong heä thoáng. Get ServiceName : Laáy teân cuûa taát caû caùc Service treân Server do Agent hieän taïi quaûn lyù. Keát quaû traû veà laø moät chuoãi chöùa taát caû teân cuûa caùc Service, caùc teân naøy caùch nhau bôûi daáu “:”. GetServiceHelp : Laáy thoâng tin veà Service toàn taïi trong heä thoáng Server do Agent hieän taïi ñang quaûn lyù. Keát quaû traû veà laø moät Vector chöùa caùc chuoãi laø caùc String, laø vaên baûn giuùp ñôõ söû duïng cuûa Service. Hình 43. Laáy höôùng daãn söû duïng moät dòch vuï trong heä thoáng. Nhoùm haøm lieân quan ñeán User Nhoùm naøy goàm caùc haøm : AddUser AdminChangePasswordUser DeleteUser Connect Disconnect ChangePassword Sau ñaây laø phaàn giaûi thích cho chöùc naêng cuûa töøng haøm. AddUser : Theâm moät User vaøo heä thoáng. Hình 44.Theâm moät User vaøo heä thoáng DeleteUser : Xoùa moät User khoûi heä thoáng. Hình 45. Xoùa moät User trong heä thoáng AdminChangePasswordUser : Thay ñoåi Passwordcho User ñaõ maát Password. Hình 46. Admin thay ñoåi Password cho User maát Password Disconnect : Client disconnect vôùi Agent. Hình 47. Client Disconnect vôùi Agent. Connect : Chuaån bò cho Client Connect. Nhoùm leänh phuïc vuï ngöôøi Administrator Nhoùm naøy goàm caùc leänh : AdminChangePassword AdminConnect AdminDisconnect getAllUser getError getAgentInfor Chöùc naêng cuûa caùc haøm : AdminChangePassword : Admin thay ñoåi Password cuûa Admin AdminConnect : Admin thöïc hieän keát noái vaøo moät Agent. AdminDisconnect : Admin chaám döùt keát noái vôùi Agent. getAllUser : Admin laáy teân cuûa taát caû User trong heä thoáng. getError : neáu coù loãi xaûy ra Admin coù theå duøng haøm naøy ñeå bieát ñaõ coù loãi gì xaûy ra ñoái vôùi heä thoáng. getAgentInfor : Admin laáy thoâng tin veà Agent hieän taïi. Giaûi thuaät cho caùc haøm Trong phaàn naøy chuùng ta seõ xem xeùt moät soá caùc giaûi thuaät chính yeáu ñöôïc coi laø quan trong cuûa chöông trình Agent. Do ñoù, coù moät soá thuaät giaûi khoâng ñöôïc trình baøy, caùc thuaät giaûi naøy chuùng ta coù theå tham khaûo trong phaàn Code chöông trình. Haøm AddService Xuaát nhaäp cuûa haøm naøy nhö sau : Hình 48. Xuaát nhaäp cuûa haøm AddService Löu ñoà thuaät giaûi cho haøm AddService treân Agent : Hình 49. Giaûi thuaät cho haøm AddService treân Agent. Chuù yù laø khi theâm moät Service vaøo thì teân cuûa noù khoâng ñöôïc coù daáu “:”. Haøm AddUser Xuaát nhaäp cuûa haøm nhö sau : Hình 50. Xuaát nhaäp cho haøm addUser treân Agent Löu ñoà thuaät giaûi cho haøm AddUser nhö sau : Hình 51. Giaûi thuaät cho Haøm AddUser. Haøm Connect Xuaát nhaäp cho haøm naøy nhö sau : Hình 52. Xuaát nhaäp cho haøm Connect. Löu ñoà thuaät giaûi cho haøm Connect treân Agent : Hình 53. Giaûi thuaät cho haøm Connect treân Agent. ServiceExecute Xuaát nhaäp cho haøm naøy nhö sau : Hình 54. Xuaát nhaäp cho haøm ServiceExecute Löu ñoà thuaät giaûi cho haøm naøy nhö sau : Hình 55. Löu ñoà thuaät toaùn cho haøm ServiceExecute Keát luaän Toùm laïi, trong chöông naøy chuùng ta ñaõ giaûi quyeát moät soá vaán ñeà cho chöông trình Agent : Phuïc vuï cho Client sao cho Client coù theå deã daøng söû duïng caùc dòch vuï toát. Thöïc hieän vieäc theâm, söûa vaø xoùa moät dòch vuï sao cho thaät hieäu quaû. Cung caáp caùc thoâng tin veà caùc Server maø noù ñang naém giöõ. Cung caáp caùc thoâng tin veà User maø noù ñang naém giöõ. Cung caáp caùc thoâng tin veà Service maø noù ñang naém giöõ. Khaéc phuïc loãi coù theå xaûy ra trong quaù trình vaän haønh heä thoáng. Thöïc hieän vieäc phaân chia coâng vieäc cho caùc Server. Giaûi quyeát vieäc taéc ngheõn coù theå xaûy ra trong heä thoáng. Giaûi quyeát caùc vaán ñeà öu tieân trong heä thoáng. Chöông 8 : Chöông trình Admin Yeâu caàu ñoái vôùi chöông trình Admin Chöông trình Admin laø moät chöông trình trung gian ñeå ngöôøi quaûn trò ñieàu khieån heä thoáng. Vò trí cuûa noù ñöôïc bieåu dieãn nhö sau: Hình 56. Vò trí cuûa chöông trình admin trong heä thoáng. Caùc nhieäm vuï chính cuûa chöông trình Admin goàm : Chuyeån yeâu caàu theâm, söûa, xoaù dòch vuï töø ngöôøi Admin ñeán cho Agent Cho pheùp ngöôøi quaûn trò heä thoáng theâm User hay loaïi boû User ra khoûi heä thoáng. Ngöôøi quaûn trò thoâng qua chöông trình naøy coù theå xem nhöõng thoâng tin veà heä thoáng goàm thoâng tin veà caùc Agent naøo ñang coù trong heä thoáng, soá Server cuõng nhö nhöõng User naøo ñang söû duïng heä thoáng naøy. Laáy ñöôïc danh saùch caùc dòch vuï cuõng nhö caùc thoâng tin veà caùc dòch vuï ñoù. Giaûi thuaät cho chöông trình Löu ñoà thuaät giaûi Löu ñoà thuaät giaûi cuûa chöông trình Admin nhö sau: Hình 57. Löu ñoà thuaät giaûi cho chöông trình Admin Chöùc naêng cho pheùp Chöông trình Admin cho pheùp thöïc hieän caùc chöùc naêng sau : Connect vôùi Agent Theâm dòch vuï Xoùa dòch vuï Söûa dòch vuï Theâm User Xoùa User ra khoûi danh saùch Thay ñoåi Password cuûa User Thay ñoåi Password cuûa Admin. Xem thoâng tin veà caùc Agent Xem thoâng tin veà soá server hieän taïi cuûa Agent ñoù Laáy danh saùch caùc dòch vuï cuõng nhö thoâng tin veà moãi dòch vuï Chaám döùt keát noái vôùi Agent Thöïc chaát chöông trình Admin khi thöïc hieän moät chöùc naêng naøo ñoù laø thöïc hieän vieäc goïi haøm töø xa cuûa Agent Remote Object. Agent baèng caùch naøo ñoù thöïc hieän coâng vieäc roài traû keát quaû veà cho Admin. Phaàn phaân tích moät caùch cuï theå caùch chöông trình Admin thöïc hieän moät soá chöùc naêng quan troïng cuûa mình seõ ñöôïc trình baøy ôû phaàn sau. Hoaït ñoäng cuûa chöông trình Admin Khi chöông trình baét ñaàu ñöôïc khôûi ñoäng, vieäc Authenticate dieãn ra ñaàu tieân, chæ coù ngöôøi coù quyeàn quaûn trò heä thoáng môùi ñöôïc pheùp söû duïng chöông trình naøy. Vieäc Authenticate naøy laø Authentication döïa treân User/Password. Sau khi ngöôøi quaûn trò cung caáp User vaø Password, neáu Password ñuùng thì chöông trình seõ saün saøng nhaän yeâu caàu töø ngöôøi Administrator. Sau ñoù, ñeå chöông trình thaät söï göûi yeâu caàu cuûa Administrator ñeán cho Agent, Administrator phaûi thöïc hieän vieäc connnect ñeán Agent caàn yeâu caàu, vaø ñeå thöïc hieän Connect ñöôïc thì ñoøi hoûi ngöôøi Administrator caàn phaûi cung caáp UserName/Password vaø chöông trình Admin seõ laáy nhöõng thoâng tin ñoù laøm tham soá ñeå goïi haøm kieåm tra User/Password ôû phía Agent. Haøm ñoù laø boolean AdminConnect(String adminName,String password) throws RemoteException; Haøm naøy seõ traû veà cho Admin giaù trò True neáu teân Administrator vaø Password coù trong DataBase veà ngöôøi quaûn trò heä thoáng. Neáu khoâng, giaù trò False seõ ñöôïc traû veà vaø chöông trình Admin döïa vaøo giaù trò naøy ñeå thoâng baùo cho Administrator bieát hoï coù quyeàn tieáp tuïc söû duøng chöông trình naøy ñeå ñieàu khieån Agent hay khoâng. Giaûi thuaät cho caùc haøm Do thôøi gian khoâng cho pheùp do ñoù trong phaàn naøy chuùng ta chæ trình baøy moät soá chöùc naêng chính yeáu trong chöông trình Admin, nhöõng haøm khaùc chuùng ta coù theå tham khaûo trong phaàn code chöông trình. Haøm Connect : Haøm naøy thöïc hieän vieäc keát noái vôùi Agent. Theâm Service vaøo heä thoáng Vieäc theâm moät dòch vuï thöïc chaát ôû ñaây laø vieäc theâm moät Service Remote Object. Vì vaäy vieäc theâm dòch vuï caàn phaûi coù 3 file : file class(bytecode), Stub vaø Skeleton. Caùc file naøy phaûi cuøng naèm trong moät ñöôøng daãn. Coù hai caùch Option ñeå theâm moät dòch vuï vaøo heä thoáng : Heä thoáng seõ töï ñoäng phaân chia caùc dòch vuï cho caùc Server. Ngöôøi quaûn trò heä thoáng seõ töï choïn löïa Server ñeå theâm dòch vuï vaøo Nhöng ñeå theâm moät dòch vuï vaøo heä thoáng thì chæ coù moät thuaät giaûi nhö sau : Hình 58. Xuaát nhaäp haøm AddServer Löu ñoà thuaät toaùn cho haøm nhö sau : Hình 59. Löu ñoà thuaät toaùn Addservice trong chöông trình Admin. Theâm User Ñoái vôùi vieäc theâm User thì vaán ñeà chæ laø laøm sao laáy ñöôïc ñaày ñuû thoâng tin ñeå goïi haøm AddUser treân Agent. Hình 60. Xuaát nhaäp cho haøm AddUser Ñeå goïi ñöôïc haøm AddUser ta chæ caàn taïo ñöôïc moät Object thuoäc Class UserInfor ñeå coù theå goïi ñöôïc haøm AddUser treân Agent. Do ñoù thuaät giaûi cho haøm naøy nhö sau : Hình 61. Löu ñoà thuaät giaûi cho haøm AddUser Xem danh saùch caùc dòch vuï hieän coù Xuaát nhaäp cuûa haøm nhö sau : Hình 62. Xuaát nhaäp cho haøm getServiceName Löu ñoà thuaät giaûi cho vieäc phuïc vuï nhu caàu xem taát caû dòch vuï hieän coù trong heä thoáng coù theå ñöôïc trình baøy nhö sau : Hình 63. Löu ñoà thuaät giaûi cho nhu caàu xem danh saùch caùc Service. Keát luaän Toùm laïi, ñeå ñieàu khieån ñöôïc heä thoáng thì ngöôøi ta söû duïng chöông trình Admin, chöông trình Admin seõ cung caáp cho ngöôøi söû duïng caùc chöùc naêng ñeå ñieàu khieån vaø thoáng keâ hoaït ñoäng cuûa heä thoáng. Caùc chöùc naêng chính yeáu nhö ñaõ lieät keâ ôû treân. Vôùi phaàn trình baøy nhö treân chuùng ta ñaõ coù theå sô boä hieåu qua chöông trình Admin. Chöông 9 : Phaùt trieån chöông trình Client Giôùi thieäu chöông trình Client Sau khi ñaõ xaây döïng neân heä thoáng thì ngöôøi quaûn trò heä thoáng seõ duøng chöông trình Admin do ngöôøi phaùt trieån heä thoáng cung caáp, vaø ngöôøi chuû yeáu söû duïng heä thoáng seõ laø User, vaø ñeå söû duïng heä thoáng thì User phaûi phaùt trieån moät chöông trình ñeå coù theå söû duïng caùc dòch vuï maø heä thoáng cung caáp. Chöông trình naøy ñöôïc goïi laø chöông trình Client. Ñoái vôùi heä thoáng thì vò trí cuûa Chöông trình Client coù theå ñöôïc bieåu dieãn nhö sau : Hình 64. Vò trí cuûa chöông trình Client trong heä thoáng Töø ñoù ta coù theå thaáy chöông trình Client sinh ra laø ñeå nhaèm muïc ñích laø söû duïng caùc dòch vuï maø heä thoáng cung caáp. Dó nhieân laø chöông trình naøy seõ chæ ñöôïc söû duïng nhöõng dòch vuï naøo töông öùng vôùi töøng User Name vaø Password ñaõ coù ñöôïc töø söï thoûa thuaän giöõa ngöôøi söû duïng dòch vuï vaø ngöôøi cung caáp dòch vuï. Moät ñieàu khaùc caàn chuù yù nöõa, ñoù laø chöông trình naøy coù theå do ngöôøi laäp trình vieân phaùt trieån cuõng coù theå tröïc tieáp do User phaùt trieån. Do ñoù, ñeå cho vieäc phaùt trieån chöông trình naøy ñöôïc deã daøng nhö muïc ñích ban ñaàu, chuùng ta seõ xem xeùt veà caùch vieát moät chöông trình Client ñôn giaûn. Caùch vieát moät chöông trình Client Ñeå vieát moät chöông trình Client cho heä thoáng treân chuùng ta caàn thöïc hieän qua 5 böôùc nhö sau : Keát noái tôùi Authentication Remote Object. Goïi haøm Connect. Duøng keát quaû traû veà ñeå Lookup Agent Remote Object. Goïi haøm ServiceExecute vaø truyeàn caùc tham soá thích hôïp ñeå thöïc thi dòch vuï. Goïi haøm Disconnect ñeå ñoùng keát noái. Ta coù theå bieåu dieãn thuaät toaùn chung cho chöông trình Client naèng löu ñoà sau : Hình 65. Löu ñoà thuaät toaùn chung cho chöông trình Client. Sau ñaây laø nhöõng vieäc laøm cuï theå caàn laøm trong moãi böôùc. Authentication Ñeå khaúng ñònh quyeàn söû duïng dòch vuï do heä thoáng cung caáp, chöông trình Client baét buoäc phaûi cung caáp UserName vaø Password cho heä thoáng tröôùc khi söû duïng ñöôïc caùc dòch vuï. Ñeå cung caáp UserName vaø Password, chöông trình Client phaûi duøng haøm Naming.lookup ñeå laáy ñöôïc moät tham khaûo tôùi Remote Object teân laø Authentication. Tham soá cho haøm Naming.lookup naøy laø moät bieán kieåu String, bieán naøy coù yù nghóa laø moät teân cuûa moät Remote Object, ta taïm ñaët teân cuûa bieán naøy laø “Name”. Bieán Name coù giaù trò nhö sau : Name = “//” + + + “/ Authentication“ Vôùi teân maùy Agent vaø Port laø hai giaù trò do nhaø cung caáp dòch vuï cho bieát tröôùc ñoù khi User ñaêng kyù söû duïng dòch vuï. Giaù trò traû veà cuûa haøm naøy seõ laø moät tham khaûo tôùi Remote Object coù Interface teân laøø Authentication. Interface naøy ñöôïc nhaø cung caáp dòch vuï cung caáp khi User ñaêng kyù söû duïng dòch vuï. Toùm laïi, ôû böôùc naøy chuùng ta coù theå goïi haøm nhö sau : Authentication authen = (Authentication)Naming.lookup(Name); Goïi haøm Connect Nhö ñaõ trình baøy ôû phaàn giaûi thuaät cuûa chöông trình Agent, vôùi haøm Connect naøy chuùng ta seõ cung caáp UserName vaø Password cho Agent ñeå coù theå söû duïng caùc dòch vuï. Haøm Connect coù caùc ñaàu xuaát nhaäp nhö sau : Hình 66. Xuaát nhaäp cuûa haøm Connect Moät ñieàu chuùng ta caàn chuù yù taïi ñaây laø keát quaû traû veà cuûa haøm naøy laø AgentName döôùi daïng moät String, keát quaû naøy chuùng ta seõ duøng vaøo böôùc sau. Toùm laïi ôû böôùc naøy chuùng ta coù theå goïi haøm nhö sau : String agentName = Authen.Connect(UserName,Password); Laáy tham khaûo veà Agent Böôùc naøy ñôn giaûn laø ñeå laáy ñöôïc moät tham khaûo tôùi Remote Object laø Agent, laø Object seõ phuïc vuï caùc yeâu caàu veà dòch vuï cuûa ta. Böôùc naøy coù söû duïng Interface teân laø AgentInterface do nhaø cung caáp cung caáp cho Client nhö sau : AgentInterface agent = (AgentInterface)Naming.lookup(agentName); Yeâu caàu dòch vuï : Ñaây laø böôùc chính yeáu cuûa chöông trình Client, ôû böôùc naøy Client seõ yeâu caàu dòch vuï vôùi heä thoáng. Böôùc naøy coù theå laëp laïi cho ñeán khi Client muoán chaám döùt yeâu caàu thì chöông trình Client môùi chuyeån sang böôùc sau. ÔÛ böôùc naøy ta duøng haøm ServiceExecute ñeå goïi thöïc thi moät dòch vuï. Sô ñoà xuaát nhaäp cuûa haøm ServiceExecute nhö sau : Hình 67. Xuaát nhaäp cho haøm ServiceExecute. Do ñoù, ñeå goïi thöïc thi moät dòch vuï teân laø A, vôùi caùc tham soá laø 2 Object coù teân B vaø C ta thöïc hieän caùc thao taùc sau : Boû 2 Object tham soá vaøo moät Vector theo trình töï ñaõ quy ñònh cuûa dòch vuï, ñeå cho chöông trình Service coù theå ñoïc ñöôïc caùc tham soá naøy töø Vector tham soá. Goïi haøm ServiceExecute. Toùm laïi, taïi böôùc naøy ta coù theå goïi haøm nhö sau : Vector argument = new Vector(); argument.addElement(B); argument.addElement(C); agent.ServiceExecute(A,argument); Dó nhieân laø ta phaûi thöïc hieän catch caùc Exception coù theå xaûy ra khi goïi haøm töø xa. Disconnect Sau khi ñaõ hoaøn thaønh coâng vieäc caàn thieát, Client phaûi goïi haøm Disconnect ñeå ñoùng keát noái vôùi Agent. Ñeå ñoùng keát noái Client chæ caàn goïi haøm Disconnect cuûa Agent vaø cung caáp teân cuûa Agent maø Client coù ñöôïc töø böôùc thöù hai. Toùm laïi, taïi böôùc naøy chuùng ta coù theå goïi haøm nhö sau : Agent.Disconnect (agentName); Keát luaän Toùm laïi, qua chöông naøy chuùng ta coù theå phaùt trieån moät chöông trình Client qua caùc böôùc : Keát noái tôùi Authentication Remote Object. Goïi haøm Connect. Duøng keát quaû traû veà ñeå Lookup Agent Remote Object. Goïi haøm ServiceExecute vaø truyeàn caùc tham soá thích hôïp ñeå thöïc thi dòch vuï. Goïi haøm Disconnect ñeå ñoùng keát noái. Vaäy vôùi chöông naøy chuùng ta ñaõ coù theå phaùt trieån moät chöông trình Client söû duïng caùc dòch vuï do heä thoáng cung caáp moät caùch deã daøng. Chöông 10 : Phaùt trieån dòch vuï Giôùi thieäu Ñoái vôùi moät moâi tröôøng hoã trôï tính toaùn song song vaø phaân boá thì ngoaøi caùc Object nhö Server, Agent, Authentication thì coøn moät loaïi Remote Object nöõa, ñoù laø Service Remote Object. Service Remote Object laø moät Remote Object seõ thöïc hieän tính toaùn moät baøi toaùn naøo ñoù khi coù moät lôøi goïi haøm xaûy ñeán cho moät trong caùc Remote Method cuûa noù. Trong heä thoáng ñang xaây döïng thì moãi moät dòch vuï laø moät Service Remote Object, ñieàu ñoù nghóa laø moãi moät Service Object chæ coù moät haøm cho pheùp goïi töø xa.Vaø cuõng vì vaäy maø khi phaùt trieån moät dòch vuï naøo ñoù ta chæ caàn quan taâm ñeán vieäc hieän thöïc code cho haøm naøy maø thoâi. Nhöng tröôùc tieân chuùng ta phaûi xeùt qua vò trí cuûa Service trong heä thoáng. Vò trí cuû Servicce trong heä thoáng coù theå bieåu dieãn nhö sau : Hình 68. Vò trí cuûa Service trong heä thoáng. Service laø moät Remote Object treân Server Java Virtual Machine. Service ñöôïc bind vôùi RMIRegistry ñeå caùc JVM khaùc coù theå thaáy vaø söû duïng ñöôïc. Caùch vieát dòch vuï Trong heä thoáng, moãi moät Service ñeàu coù moät bieán goïi laø bieán Attribute, bieán naøy coù yù nghóa laø moät côø ñeå cho bieát Admin coù ñöôïc söûa ñoåi hay xoùa dòch vuï naøy khoâng? Vì trong heä thoáng thì luùc naøo cuõng caàn coù moät soá caùc dòch vuï laø neàn vaø moät soá dòch vuï ñaët bieät maø ngöôøi söû duïng heä thoáng cuõng nhö ngöôøi quaûn trò heä thoáng khoâng ñöôïc thay ñoåi hay xoùa boû noù. Ví duï nhö Server Remote Object laø moät dòch vuï ñaët bieät maø User vaø Admin khoâng ñöôïc thay ñoåi neáu noù ñang chaïy. Vì vaäy trong khi hieän thöïc moät dòch vuï môùi ta cuõng caàn phaûi hieän thöïc moät haøm laø getAttribute ñeå traû veà thuoäc tính cuûa Service ñeå coù theå ñöôïc duøng vaøo luùc heä thoáng caàn xoùa moät dòch vuï. Hôn theá nöõa, theo lyù luaän thieát keá heä thoáng thì coù theå coù nhieàu Admin tham gia quaûn lyù do coù nhieàu Agent trong heä thoáng, do ñoù khi phaùt trieån dòch vuï thì moãi dòch vuï cuûa chuùng ta caàn phaûi coùmoät Password ñeå vieäc xoùa söûa cuûa Admin naøy khoâng aûnh höôûng ñeán hoaït ñoäng cuûa nhieäm vuï quaûn lyù cuûa Admin khaùc. Do ñoù, khi hieän thöïc chuùng ta phaûi hieän thöïc hai haøm ñoù laø setPassword vaø getPassword. Hai haøm naøy coù yù nghóa laø caùc coâng cuï ñeå caøi ñaët Password vaø laáy Password cuûa moät Service. Hình 69.Cô cheá baûo veä moät Service Moät ñieàu khaùc caàn chuù yù laø teân cuûa moät dòch vuï khi ñöôïc theâm vaøo heä thoáng thì teân ñoù khoâng ñöôïc coù daáu “:”. Vaø ñeå Server coù theå taïo ra moät Object môùi töø bytecode maø ngöôøi phaùt trieån dòch vuï cung caáp thì bytecode ñoù phaûi tuaân theo moät chuaån naøo ñoù. Vôùi heä thoáng naøy thì ñeå coù ñöôïc bytecode ñuùng chuaån ñoù thì ñoøi hoûi ngöôøi phaùt trieån dòch vuï phaûi implement moät interface teân laø ServiceInterface. Ngoaøi ra, bytecode ñoù coøn phaûi laø bytecode cuûa moät Class naèm trong package teân laø Lvtn.service.implement. Keát luaän Toùm laïi, ñeå vieát moät dòch vuï cho heä thoáng chuùng ta caàn thoûa maõn caùc ñieàu sau : Hieän thöïc Interface teân laø ServiceInterface. Phaûi naèm trong package Lvtn.service.implement. Teân Service khoâng ñöôïc coù daáu hai chaám(:). Phaàn 4 : Höôùng daãn söû duïng Chöông trình Admin Chöông trình Admin giao tieáp vôùi Agent vaø ngöôøi quaûn trò heä thoáng. Chöông trình naøy ñöôïc thieát keá ñeå cho ngöôøi quaûn trò ñieàu khieån heä thoáng , cuï theå laø ñieàu khieån heä thoáng qua Agent. Giao dieän cuûa chöông trình Admin nhö sau: . Caùc menu trong giao dieän: Admin Change Password: Thay ñoåi password cuûa ngöôøi admin Exit : Ñoùng taát caû caùc keát noái vôùi caùc Agent vaø thoaùt chöông trình. Agent Connect: Connect vôùi Agent Disconnect: Disconnect vôùi Agent ñang keát noái . Khi chöa Disconnect thì chöa theå connect vôùi moät Agent khaùc. Service Menu Service coù caùc menu item Add Service : Theâm moät service vaøo caùc Server thoâng qua Agent. Update Service : Söûa ñoåi caùc service Delete Service : Xoùa moät dòch vuï treân Server Service Help : Laø phaàn giuùp ñôõ veà caùc service, ví duï nhö caùc thoâng soá vaøokhi goïi nhöõng dòch vuï ñoù, dòch vuï ñoù thöïc hieän coâng vieäc gì… User Add User : Theâm moät User vaøo heä thoáng, user ñöôïc quaûn lyù bôûi Agent. Delete User : Xoùa moät user ra khoûi danh saùch nhöõng user ñöôïc quyeàn truy caäp moâi tröôøng naøy. Change Password : Thay ñoåi Password cuûa casc user. Database About Agent: Xem thoâng tin veà caùc Agent laùng gieàng About Server : Database veà caùc Server cuûa Agent ñang keát noái. About User: Xem thoâng tin veà User hieän taïi ñang keát noái vôùi heä thoáng vaø danh dasch caùc User ñaên kyù ñeå ñöôïc truy caäp vao moâi tröôøng naøy. Help Ñaây laø phaàn höôùng daãn söû duïng chöông trình Admin. Caùc böôùc thöïc hieän trong quaù trình söû duïng chöông trình Admin Böôùc 1: Ñaàu tieân ngöôøi quaûn trò heä thoáng phaûi xaùc ñònh Agent ñeå thöïc hieän caùc thao taùc ñoái vôùi Agent ñoù. AgentHostName : Teân maùy hoaëc Ñòa chæ IP cuûa Agent AdministratorName : Teân cuûa ngöôøi quaûn trò heä thoáng ñaõ ñaêng kyù vôùi heä thoáng. Password : Password töông öùng . Sau khi keát noái ñöôïc vôùi moät Agent thì môùi coù theå thöïc hieän caùc chöùc naêng khaùc cuûa chöông trình Admin. Muoán laøm moät coâng vieäc naøo ñoù treân Agent khaùc thì phaûi Disconnect vôùi Agent hieän haønh vaø connect vôùi Agent ñoù. Böôùc 2: Khi keát noái thaønh coâng vôùi Agent, chöông trình Admin cho pheùp thöïc hieän caùc chöùc naêng sau: Add Service: Vieäc theâm dòch vuï ôû ñaây thöïc chaát laø theâm moät file class vaøo cho caùc Server quaûn lyù Service Name : Teân dòch vuï ñöôïc ñaët tuyø ngöôøi xaây döïng dòch vuï Path of class file : Ñöôøng daãn ñaày ñuû cuûa file class. Ví duï: c:/pc111/Hien/Cong.class Service Password : Moãi dòch vuï coù moät Password nhaèm muïc ñích thoáng nhaát söï quaûn lyù cuûa moät ngöôøi quaûn trò heä thoáng ñoái vôùi dòch vuï ñoù, nghóa laø ngöôøi naøo theâm dòch vuï thì ngöôøi ñoù môùi coù theå ñöôïc pheùp xoaù hay söûa dòch vuï ñoù. Delete Service Update Service Using Help: Muoán bieát thoâng tin veà Service, ñaùnh teân Service vaøo , roài nhaán OK AddUser Ñaêng kyù cho moät User môùi söû duïng heä thoáng naøy User name : Teân User Password : Password töông öùng Confirm Password : Khaúng ñònh laïi Password Delete User Ñaùnh vaøo teân User caàn xoaù. Change Pasword Thay ñoåi Password cuûa User nhöng ngöôøi quaûn trò khoâng bieát Passwork cuõ cuûa User ñoù, chæ vieäc thay ñoåi thaønh passwork môùi. About Agent : Xem thoâng tin veà Agent About Server : Xem thoâng tin veà Server Phaàn phuï luïc Phuï luïc A : Thö vieän cho Client Sau khi ñaõ hoaøn thaønh cô baûn vieäc phaùt trieån heä thoáng, khi heä thoáng baét ñaàu ñöôïc ñöa vaøo hoaït ñoäng thì ñeå söû duïng, ngöôøi söû duïng phaûi phaùt trieån moät chöông trình ñôn giaûn ñeå söû duïng caùc dòch vuï cuûa heä thoáng, chöông trình naøy ñöôïc goïi laø chöông trình Client. Muoán phaùt trieån moät chöông trình Client, ngöôøi laäp trình phaûi duøng moät soá caùc thö vieän haøm do ngöôøi phaùt trieån heä thoáng cung caáp. Phaàn naøy seõ cung caáp cho ngöôøi phaùt trieån chöông trình Client moät soá caùc haøm duøng vaøo muïc ñích taïo keát noái giöõa Client vaø heä thoáng vaø giuùp Client coù theå söû duïng dòch vuï cuûa heä thoáng. Cuõng caàn phaûi löu yù raèng nhu caàu cuûa Client ngaøy caøng ñoåi môùi do ñoù thö vieän haøm naøy cuõng caàn phaûi ñöôïc caäp nhaät ñeå coù theå duøng dòch vuï cuûa heä thoáng moät caùch hieäu quaû hôn. Ngöôøi phaùt trieån heä thoáng seõ cung caáp cho ngöôøi phaùt trieån Client moät soá caùc Interface coù theå lieät keâ ra nhö sau : Lvtn.agent.interfaces.Authentication : Interface cung caáp caùc haøm phuïc vuï muïc ñích kieåm tra quyeàn cuûa Client ñoái vôùi heä thoáng. Lvtn.agent.interfaces.AgentInterface : Interface cung caáp caùc haøm phuïc vuï muïc ñích söû duïng heä thoáng cuûa Client. Lvtn.agent.interfaces.UserInfor : Class goàm caùc field laø döõ lieäu veà User duøng trong vieäc change Password cuûa User. Lvtn.service.interfaces.Task : Interface chuaån cho caùc Service do Client göûi tôùi heä thoáng ñeå thöïc thi. Lvtn.agent.interfaces.Authentication Khai baùo cuûa Interface naøy nhö sau : package Lvtn.agent.interfaces; import java.rmi.Remote; import java.rmi.RemoteException; public interface Authentication extends Remote { String Connect(String clientName,String password) throws RemoteException; String getError() throws RemoteException; } Haøm Connect (String,String) : traû veà moät Agent Name öùng vôùi UserName vaø Password neáu Username vaø Password naøy ñuùng. Traû veà null neáu Username vaø Password sai. Haøm getError() : traû veà moät chuoãi bieåu dieãn loãi xaûy ra trong quaù trình taïo ñöôïc keát noái töø Client tôùi heä thoáng. Lvtn.agent.interfaces.AgentInterface Khai baùo cuûa interface naøy nhö sau : package Lvtn.agent.interfaces; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.Vector; import java.security.*; public interface AgentInterface extends Remote { boolean ChangePassword(UserInfor user) throws RemoteException; void Disconnect(String name) throws RemoteException; String getServiceName()throws RemoteException; Object ExecuteTask(Task obj) throws RemoteException; Object ServiceExecute(String command,Vector arg) throws RemoteException; Vector ClientHelp()throws RemoteException; String getError() throws RemoteException; Vector getServiceHelp(String serviceName) throws RemoteException; } Haøm ChangePassword() : chuyeån ñoåi Password cuûa moät User ñoái vôùi heä thoáng. Haøm Disconnect(String) : Client Disconnect vôùi moät Agent teân laø AgentName Haøm getServiceName() : Laáy toaøn boä teân cuûa caùc Service cuûa heä thoáng. Giaù trò traû veà laø moät String, trong ñoù teân cuûa caùc Service ñöôïc gaén vaøo cuøng moät chuoãi vaø giöõa caùc teân naøy caùch nhau bôûi daáu “:”. Haøm ExecuteTask(Task) : Client nhôø heä thoáng thöïc thi hoä moät Service do Client hieän thöïc neân. Service naøy phaûi laø Implement cuûa Interface Tass do ngöôøi phaùt trieån heä thoáng cung caáp. Haøm ServiceExecute() : goïi thöïc thi moät dòch vuï teân laø command vôùi caùc tham soá laø caùc phaàn töû ñöôïc chæ bôûi Vector arg. Haøm ClientHelp() : laáy taøi lieäu giuùp ñôõ ngöôøi phaùt trieån chöông trình Client trong vieäc phaùt trieån chöông trình Client. Haøm getError() : traû veà chuoãi baùo loãi neáu coù loãi xaûy ra trong quaù trình heä thoáng thöïc hieän caùc yeâu caàu cuûa Client. Haøm getServiceHelp(String): laáy giuùp ñôõ söû duïng cuûa Service ñang toàn taïi trong heä thoáng. Teân cuûa Service naøy ñöôïc truyeàn tôùi Agent thoâng qua tham soá kieåu String cho lôøi goïi haøm naøy. Lvtn.agent.interfaces.UserInfor : Khai baùo Class naøy nhö sau : package Lvtn.agent.interfaces; import java.io.*; public class UserInfor implements Serializable { public String Password; public String UserName; public String newPassword; public UserInfor() { Password = ""; UserName = ""; newPassword = ""; } } YÙ nghóa cuûa töøng field trong Class naøy coù theå hieåu ñöôïc thoâng qua teân cuûa chuùng, do ñoù ôû ñaây chuùng ta khoâng caàn giaûi thích. Lvtn.service.interfaces.Task Khai baùo cuûa Interface naøy nhö sau : package Lvtn.service.interfaces; import java.io.Serializable; public interface Task extends Serializable { Object execute(); } Vôùi caùc Service hieän thöïc Interface naøy thì chuùng baét buoäc phaûi coù moät haøm teân laø execute() ñeå heä thoáng coi ñoù laø ñieåm nhaäp cuûa quaù trình thöïc thi Service môùi cuûa Client göûi leä cho heä thoáng. Phuï luïc B : Thö vieän cho dòch vuï Töông töï nhö Client, ngöôøi phaùt trieån heä thoáng cuõng caàn phaûi cung caáp cho ngöôøi phaùt trieån Service moät soá caùc Interface ñeå hoï coù theå phaùt trieån service cho heä thoáng. Caùc Interface naøy coù theå lieät keâ ra nhö sau : Lvtn.service.interfaces.ServiceInterface : Interface maø Service naøo muoán trôû thaønh Service cuûa heä thoáng phaûi implement noù. Lvtn.service.interfaces.Task : Client naøo muoán göûi Service leân cho heä thoáng thöïc thi hoä thì Service cuûa Client ñoù phaûi implement Interface naøy. Lvtn.agent.separator.Segment : Interface cho Sep Class, Sep Class laø Class laøm nhieäm vuï phaân chia khoái löôïng coâng vieäc cho caùc Server. Lvtn.service.interfaces.ServiceInterface Khai baùo Interface naøy nhö sau : package Lvtn.service.interfaces; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.*; public interface ServiceInterface extends Remote { Object execute(Vector args) throws RemoteException; //Kiem tra Password cu dung khong va gan Password moi void setPassword(String pw) throws RemoteException; String getPassword() throws RemoteException; boolean getAttribute() throws RemoteException; } Haøm execute(Vector) : ñieåm nhaäp cuûa quaù trình thöïc thi cuûa Service. Tham soá cho haøm naøy laø caùc Object naèm trong Vector arg. Haøm setPassword(String) : kieåm tra password cuõ laø gaùn password môùi cho Service töông öùng. Haøm getPassword () : keát quaû traû veà laø password cuûa Service ñoù. Haøm getAttribute() : keát quaû traû veà cuûa haøm naøy laø True neáu Service naøy cho pheùp Update vaø False trong tröôøng hôïp laïi. Lvtn.service.interfaces.Task Maõ code cuûa Interface naøy nhö sau : package Lvtn.service.interfaces; import java.io.Serializable; public interface Task extends Serializable { Object execute(); } Haøm execute() : ñieåm nhaäp cuûa Service do Client göûi leân. Lvtn.agent.separator.Segment Maõ code cuûa Interface naøy nhö sau : package Lvtn.service.interfaces; import java.io.Serializable; import java.util.*; public interface Segment extends Serializable { Vector Separate(Vector arg,int serverNum); } Haøm Separate(Vector, int) : ñieåm nhaäp cuûa haøm thöïc thi vieäc phaân chia khoái löôïng coâng vieäc. Tham soá haøm naøy laø arg laø tham soá chính thöùc töø Client göûi leân cho heä thoáng. Tham soá serverNum laø döõ lieäu maø heä thoáng höùa seõ cung caáp cho haøm naøy laøm döõ lieäu ñeå haøm naøy coù theå thöïc thi. Dó nhieân khi aùp duïng heä thoáng naøy treân thöïc teá thì ngoaøi tham soá laø soá Server coøn laø moät soá caùc thoâng tin khaùc ñeå vieäc phaân chia naøy chính xaùc hôn. Taøi lieäu tham khaûo ------oOo------- [1] Java Network Programming [1997] Merlin and Conrad Hughes-Micheal Shoffner-Maria Winslow [2] Java Enterprise Applications [1999] Stephen Asbury – Scott R.Weiner [3] Core Java [1996] Gary Cornell – Cay S.Horstmann [4] LVTN Xaây döïng dòch vuï tính toaùn phaân boá [1999] Nguyeãn Vaên Noái. [5] Computer Network [1996]Andrew S. Tanen Baum - Prentice Hall [6] Java Developer’s Guide [Web Book] [7] Java 1.2 and Java Script for C and C++ Programmers [1998] Micheal C. Daconta – Eric Monk – Al. Saganich- Martin Snyder. [8] TCP/IP Vol I, Vol II, Vol III [1995] Douglas E. Commer – David Steven. [9] Unix Network Programming [1990] W. Richard Steven [10] Parallel Programming [1999] Barry Wilkinson, Michael Allen [11]LVTN Tìm hieåu RMI, aùp duïng giaûi quyeát moät soá baøi toaùn söû lyù song song vaø phaân boá Voõ Vaên Cöôøng [1999] [12] Web Pages : www.sun.com – www.jini.org – www.mcp.com – www.java.developer.com.

Các file đính kèm theo tài liệu này:

  • docluanvan.doc