Cari perkhidmatan dengan perkhidmatan pencarian Jini

Perkhidmatan pencarian Jini, komponen utama infrastruktur waktu operasi Jini, menawarkan kepada pelanggan Jini cara yang fleksibel dan hebat untuk mendapatkan perkhidmatan Jini. Ini membolehkan penyedia perkhidmatan mengiklankan perkhidmatan mereka dan membolehkan pelanggan mencari dan meminta bantuan perkhidmatan tersebut.

Untuk berinteraksi dengan perkhidmatan pencarian, pelanggan mesti mendapatkan objek pendaftar perkhidmatan terlebih dahulu melalui penemuan, protokol peringkat rangkaian yang digunakan oleh infrastruktur runtime Jini. Penemuan membolehkan pelanggan dan perkhidmatan mencari perkhidmatan carian. (Untuk maklumat lebih lanjut mengenai penemuan, lihat Sumber.) service registrarObjek, yang menggunakan net.jini.core.lookup.ServiceRegistrarantara muka, memungkinkan klien untuk berinteraksi dengan perkhidmatan pencarian. Untuk mencari perkhidmatan yang diinginkan, klien membina ServiceTemplate, contoh kelas net.jini.core.lookup.ServiceTemplate, dan menyebarkannya ke salah satu daripada dua lookup()kaedah yang dinyatakan dalam ServiceRegistrarantara muka. Setiap lookup()kaedah menghantar templat perkhidmatan ke perkhidmatan pencarian, yang melakukan pertanyaan dan mengembalikan objek layanan yang sesuai kepada klien.

Secara umum, pelanggan mencari perkhidmatan mengikut jenis Java, biasanya antara muka. Sebagai contoh, jika pelanggan perlu menggunakan pencetak, ia menyusun templat perkhidmatan yang merangkumi Classobjek untuk antara muka yang terkenal dengan perkhidmatan pencetak. Semua perkhidmatan pencetak menggunakan antara muka. Perkhidmatan pencarian mengembalikan objek perkhidmatan (atau objek) yang melaksanakan antara muka ini. Anda boleh memasukkan atribut dalam templat perkhidmatan untuk menyempitkan jumlah padanan untuk carian berdasarkan jenis tersebut. Pelanggan menggunakan perkhidmatan pencetak dengan menggunakan objek perkhidmatan kaedah yang dinyatakan dalam antara muka yang terkenal.

Kelas ServiceTemplate

Dengan ServiceTemplatekelas, anda dapat menyatakan kriteria carian untuk pencarian Jini. Kelas ini hanya terdiri daripada tiga bidang awam ini:

kemasukan awam [] atributSetTemplates; serviceID perkhidmatan awam; kelas awam [] Jenis perkhidmatan;

ServiceTemplatetidak mempunyai kaedah, dan contohnya hanya berfungsi sebagai wadah seperti "struct" untuk pertanyaan perkhidmatan carian. Pertandingan dilakukan seperti yang dijelaskan oleh petikan berikut dari ServiceTemplatehalaman javadoc:

Item dalam perkhidmatan pencarian dipadankan menggunakan contoh [ ServiceTemplate]. Item perkhidmatan ( item) sepadan dengan templat perkhidmatan ( tmpl) jika:

  • item.serviceIDsama dengan tmpl.serviceID(atau jika tmpl.serviceIDadalah null)
  • item.service [objek perkhidmatan] adalah contoh setiap jenis di tmpl.serviceTypes
  • item.attributeSets mengandungi sekurang-kurangnya satu entri yang sepadan untuk setiap templat entri di tmpl.attributeSetTemplates

Entri sepadan dengan templat entri jika kelas templat adalah sama dengan, atau kelas super, kelas entri, dan setiap medan tidak kosong dalam templat sama dengan bidang entri yang sesuai. Setiap entri boleh digunakan untuk memadankan lebih dari satu templat. Perhatikan bahawa dalam templat perkhidmatan, untuk serviceTypesdan attributeSetTemplates, medan nol bersamaan dengan array kosong; kedua-duanya mewakili kad liar.

Seperti yang dijelaskan di sini, templat perkhidmatan dapat menyertakan rujukan ke berbagai Classobjek. Objek-objek ini menunjukkan kepada perkhidmatan pencarian jenis Java (atau jenis) objek perkhidmatan yang dikehendaki oleh pelanggan. Templat perkhidmatan juga boleh menyertakan ID perkhidmatan, yang secara unik mengenal pasti perkhidmatan, dan atribut, yang harus sama persis dengan atribut yang dimuat oleh penyedia perkhidmatan dalam item perkhidmatan. Templat perkhidmatan juga boleh mengandungi kad liar untuk mana-mana bidang tersebut. Contohnya kad liar di medan ID perkhidmatan, akan sepadan dengan ID perkhidmatan apa pun.

Kaedah pencarian ()

The ServiceRegistrar's lookup()kaedah mengambil dua bentuk muatan. Kedua-dua bentuk berbeza terutamanya dalam jumlah perlawanan dan item servis yang masing-masing kembali. Bentuk dua parameter dapat mengembalikan banyak padanan dari pertanyaan yang dinyatakan dalam ServiceTemplate, sedangkan bentuk satu parameter hanya mengembalikan satu padanan. Sebagai tambahan, borang dua parameter mengembalikan keseluruhan item perkhidmatan; borang satu parameter mengembalikan hanya objek perkhidmatan.

Bentuk carian dua parameter ()

Berikut adalah petikan javadoc yang menerangkan bentuk dua parameter lookup():

carian ServiceMatches awam (ServiceTemplate tmpl, int maxMatches) melemparkan java.rmi.RemoteException; 

[It] mengembalikan, paling banyak, maxMatchesitem yang sepadan dengan templat, ditambah jumlah item yang sesuai dengan templat. Nilai kembali tidak pernah null, dan susunan item yang dikembalikan hanya nulljika maxMatchessifar. Untuk setiap item yang dikembalikan, jika objek perkhidmatan tidak dapat dideserialisasi, bidang perkhidmatan item ditetapkan ke nulldan tidak ada pengecualian yang dilemparkan. Begitu juga, jika set atribut tidak dapat dideserialisasi, elemen attributeSetsarray diset ke nulldan tidak ada pengecualian yang dilemparkan.

Inilah ServiceMatcheskelasnya:

pakej net.jini.core.lookup;

ServiceMatches kelas awam meluaskan java.lang.Object melaksanakan java.io.Serializable {

item Perkhidmatan Awam []; int intatch awam; }

Dan inilah ServiceItemkelasnya:

pakej net.jini.core.lookup;

ServiceMatches kelas awam meluaskan java.lang.Object melaksanakan java.io.Serializable {

kemasukan awam [] atributSets; perkhidmatan java.lang.Object awam; serviceID perkhidmatan awam; }

Seperti yang telah disebutkan sebelumnya, setiap elemen itemsarray yang dikembalikan oleh formulir dua parameter adalah item layanan lengkap, yang meliputi objek layanan, ID layanan, dan semua set atribut. Yang maxMatchesbidang membantu pelanggan menguruskan bilangan objek dikembalikan oleh ini lookup().

Panjang itemspelbagai dalam kembali ServiceMatchesobjek adalah kurang daripada atau sama dengan nilai yang diluluskan untuk lookup()dalam maxMatches. Jumlah item perkhidmatan yang sepadan (dikembalikan totalMatches) lebih besar daripada atau sama dengan panjang itemsarray.

Sebagai contoh, jika maxMatches50 dan templat perkhidmatan sepadan dengan 25 item, panjang itemsarray yang dikembalikan dan nilai totalMatcheskeduanya adalah 25. Sebagai alternatif, jika maxMatches50 tetapi templat perkhidmatan sepadan dengan 100 item, panjang itemsarray yang dikembalikan adalah 50 dan nilai totalMatchesadalah 100. Apabila templat perkhidmatan sepadan dengan maxMatchesitem perkhidmatan, item perkhidmatan yang dikembalikan oleh dua parameter lookup()dipilih secara rawak dari set lengkap item perkhidmatan yang sepadan.

Bentuk carian satu parameter ()

Kaedah satu parameter lookup()mengembalikan satu objek serasi yang dipilih secara rawak dari semua padanan. Berikut petikan javadoc yang menerangkan borang ini:

carian Objek awam (ServiceTemplate tmpl) melemparkan java.rmi.RemoteException; 
Mengembalikan objek perkhidmatan (iaitu, hanya ServiceItem.service) dari item yang sepadan dengan templat, atau nulljika tidak ada padanan. Sekiranya beberapa item sesuai dengan templat, sewenang-wenangnya objek perkhidmatan mana yang dikembalikan. Sekiranya objek yang dikembalikan tidak dapat deserialisasi, objek UnmarshalExceptiontersebut dilemparkan dengan semantik RMI standard.

Kerana satu-parameter lookup()hanya mengembalikan satu objek perkhidmatan yang sepadan, klien dapat meminimumkan jumlah fail keadaan dan kelas objek yang dimuat turun. Tetapi kerana objek perkhidmatan yang dikembalikan dipilih dengan sewenang-wenangnya, dan tidak dikenali oleh ID perkhidmatan atau dijelaskan oleh kumpulan atribut yang berkaitan, klien harus yakin bahawa mana - mana objek perkhidmatan yang sesuai akan mencukupi.

Kaedah melayari

In addition to the two lookup() methods, the ServiceRegistrar has three browsing methods, which yield information about registered service items. The three methods -- getServiceTypes(), getEntryClasses(), and getFieldValues() -- are called browsing methods because they enable clients to browse the services and attributes in the lookup service.

The getServiceTypes() method takes a ServiceTemplate (the same ServiceTemplate that is passed to the lookup() methods) and a String prefix. It returns an array of Class instances representing the most specific types (classes or interfaces) of the service objects that match the template. These service objects are neither equal to, nor a superclass of, any of the types specified in the template, and they have names that start with the specified prefix. The service object or objects for which Class instances are returned are all instances of all the types (if any) passed in the template, but the Class instances are all more specific than (and are subclasses or subinterfaces of) those types. Each class appears only once in the returned array, and in arbitrary order.

Here's what getServiceTypes() looks like:

public java.lang.Class[] getServiceTypes(ServiceTemplate tmpl, java.lang.String prefix) throws java.rmi.RemoteException; 

The getEntryTypes() method takes a ServiceTemplate and returns an array of Class instances that represent the most specific classes of entries for the service items that match the template, which either don't match any entry template or are a subclass of one. Each class appears only once in the returned array, again in arbitrary order.

Here's what getEntryClasses() looks like:

public java.lang.Class[] getEntryClasses(ServiceTemplate tmpl) throws java.rmi.RemoteException; 

The getFieldValues() method takes a ServiceTemplate, an integer index, and a String field name. It returns an array of Objects for the named field of all instances of the entry that appears in the ServiceTemplate's Entry[] array at any matching service item's passed index. Each object of a particular class and value appears only once in the returned array, and in arbitrary order.

Here's what getFieldValues() looks like:

public java.lang.Object[] getFieldValues(ServiceTemplate tmpl, int setIndex, java.lang.String field) throws java.lang.NoSuchFieldException, java.rmi.RemoteException; 

The behavior and purpose of these browsing methods can be obscure. You might think of them as tools that incrementally narrow queries of the lookup service.

For example, a client such as a graphical lookup service browser could first invoke getServiceTypes() with an empty template. The getServiceTemplate() method returns all possible service types registered in the lookup service, which the browser could display. The user could select one or more types, then push the Requery button. The browser would add that type (or types) to the service template and invoke getServiceTypes() again. A smaller list of types would be returned and displayed by the browser. The user could select one and press an Entries button. The browser would form a template with the most recently selected service type or types, and then invoke getEntryTypes(). The getEntryTypes() method would return an array of entry classes, which the browser could then display.

The user could select some entries -- and a field of a selected entry -- and push a Fields button. The browser would build a template using the currently selected service and entry types. It would then pass the index of the entry class in which the user selected the field, and the name of the selected field, to getFieldValues(). The browser would display all the values that getFieldValues() returned. With those values the user could further narrow the search for a service, eventually choosing a particular service. Thus, these methods help clients, whether or not a human user is involved, to browse the services registered in a lookup service. The arrays returned from the browsing methods can help the client further refine its queries, ultimately resulting in a ServiceTemplate that, when passed to lookup(), returns the most appropriate service object.

The notify() method

In addition to the lookup and browsing methods, the ServiceRegistrar interface also has a notify() method that notifies clients when new services register or unregister with a lookup service:

public EventRegistration notify(ServiceTemplate tmpl, int transitions, RemoteEventListener listener, MarshalledObject handback, long leaseDuration) throws RemoteException; 

You invoke notify() to register yourself (or another listener) to receive a distributed event whenever the services that match the passed ServiceTemplate undergo a state change described by the transitions parameter.

The transitions parameter is a bitwise OR of any nonempty set of these three values, defined as constants in ServiceRegistrar:

TRANSITION_MATCH_MATCH TRANSITION_MATCH_NOMATCH TRANSITION_NOMATCH_MATCH 

You build the ServiceTemplate for notify() in the same way you build it for lookup(). You can indicate explicit types, a service ID, attributes (which must exactly match), or wild cards (which match anything) in any of those fields. The transitions are based on a change (or nonchange) in the status of whatever matches your ServiceTemplate before and after any operation is performed on the lookup service.

Sebagai contoh, TRANSITION_MATCH_MATCHmenunjukkan bahawa sekurang-kurangnya satu item perkhidmatan sepadan dengan templat anda sebelum dan selepas operasi. TRANSITION_MATCH_NOMATCHmenunjukkan bahawa, walaupun sekurang-kurangnya satu item perkhidmatan yang sesuai dengan templat anda sebelum operasi, item tersebut tidak lagi sesuai dengan templat anda selepas operasi. Untuk menerima pemberitahuan apabila ada perkhidmatan baru yang ditambahkan ke layanan pencarian, anda hanya menentukan templat yang sesuai dengan perkhidmatan apa pun dan lulus TRANSITION_NOMATCH_MATCHsebagai peralihan ke notify()kaedah.

SUBHEAD_BREAK: Perkhidmatan carian berbanding pelayan nama