Temukan layanan dengan layanan pencarian Jini

Layanan pencarian Jini, komponen utama infrastruktur runtime Jini, menawarkan klien Jini cara yang fleksibel dan kuat untuk menemukan layanan Jini. Ini memungkinkan penyedia layanan untuk mengiklankan layanan mereka dan memungkinkan klien untuk mencari dan meminta bantuan layanan tersebut.

Untuk berinteraksi dengan layanan pencarian, klien harus terlebih dahulu mendapatkan objek registrar layanan melalui penemuan, protokol tingkat jaringan yang digunakan oleh infrastruktur runtime Jini. Penemuan memungkinkan klien dan layanan untuk menemukan layanan pencarian. (Untuk informasi lebih lanjut tentang penemuan, lihat Sumber.) service registrarObjek, yang mengimplementasikan net.jini.core.lookup.ServiceRegistrarantarmuka, memungkinkan klien untuk berinteraksi dengan layanan pencarian. Untuk menemukan layanan yang diinginkan, klien membuat ServiceTemplate, instance kelas net.jini.core.lookup.ServiceTemplate, dan meneruskannya ke salah satu dari dua lookup()metode yang dideklarasikan di ServiceRegistrarantarmuka. Setiap lookup()metode mengirimkan template layanan ke layanan pencarian, yang menjalankan kueri dan mengembalikan objek layanan yang cocok ke klien.

Secara umum, klien mencari layanan menurut jenis Java, biasanya antarmuka. Misalnya, jika klien perlu menggunakan printer, itu membuat template layanan yang menyertakan Classobjek untuk antarmuka terkenal ke layanan printer. Semua layanan printer menerapkan antarmuka. Layanan pencarian mengembalikan objek layanan (atau objek) yang mengimplementasikan antarmuka ini. Anda dapat menyertakan atribut di template layanan untuk mempersempit jumlah kecocokan untuk pencarian berbasis tipe tersebut. Klien menggunakan layanan printer dengan menjalankan pada objek layanan metode yang dideklarasikan di antarmuka terkenal.

Kelas ServiceTemplate

Dengan ServiceTemplatekelas tersebut, Anda dapat mengungkapkan kriteria pencarian untuk pencarian Jini. Kelas hanya terdiri dari tiga bidang publik berikut:

Entri publik [] atributSetTemplates; public ServiceID serviceID; public Class [] serviceTypes;

ServiceTemplatetidak memiliki metode, dan instance-nya hanya berfungsi sebagai container seperti "struct" untuk kueri layanan pencarian. Pencocokan dilakukan seperti yang dijelaskan oleh kutipan berikut dari ServiceTemplatehalaman javadoc:

Item dalam layanan pencarian dicocokkan menggunakan instance [ ServiceTemplate]. Item layanan ( item) cocok dengan template layanan ( tmpl) jika:

  • item.serviceIDequals tmpl.serviceID(atau jika tmpl.serviceIDini null)
  • item.service [objek layanan] adalah turunan dari setiap tipe dalam tmpl.serviceTypes
  • item.attributeSets berisi setidaknya satu entri yang cocok untuk setiap templat entri di tmpl.attributeSetTemplates

Entri cocok dengan templat entri jika kelas templatnya sama dengan, atau superclass dari, kelas entri, dan setiap bidang bukan-nol dalam templat sama dengan bidang entri yang sesuai. Setiap entri dapat digunakan untuk mencocokkan lebih dari satu template. Perhatikan bahwa dalam template layanan, untuk serviceTypesdan attributeSetTemplates, bidang null sama dengan array kosong; keduanya mewakili karakter pengganti.

Seperti yang dijelaskan di sini, template layanan bisa menyertakan referensi ke larik Classobjek. Objek-objek ini menunjukkan ke layanan pencarian tipe Java (atau tipe) objek layanan yang diinginkan klien. Template layanan juga dapat menyertakan ID layanan, yang secara unik mengidentifikasi layanan, dan atribut yang harus sama persis dengan atribut yang diunggah oleh penyedia layanan dalam item layanan. Templat layanan juga dapat berisi kartu bebas untuk salah satu bidang tersebut. Kartu liar di bidang ID layanan, misalnya, akan cocok dengan ID layanan apa pun.

Metode lookup ()

The ServiceRegistrar's lookup()metode mengambil dua bentuk kelebihan beban. Kedua bentuk berbeda terutama dalam jumlah pertandingan dan item layanan yang masing-masing dikembalikan. Formulir dua parameter bisa mengembalikan beberapa kecocokan dari kueri yang dinyatakan dalam ServiceTemplate, sedangkan formulir satu parameter hanya mengembalikan satu kecocokan. Selain itu, formulir dua parameter mengembalikan seluruh item layanan; bentuk satu parameter hanya mengembalikan objek layanan.

Bentuk dua parameter dari lookup ()

Berikut kutipan javadoc yang menjelaskan bentuk dua parameter dari lookup():

public ServiceMatches lookup (ServiceTemplate tmpl, int maxMatches) melempar java.rmi.RemoteException; 

[Ini] mengembalikan, paling banyak, maxMatchesitem yang cocok dengan template, ditambah jumlah total item yang cocok dengan template. Nilai yang dikembalikan tidak pernah null, dan larik item yang dikembalikan hanya nulljika maxMatchesnol. Untuk setiap item yang dikembalikan, jika objek layanan tidak dapat dideserialisasi, bidang layanan dari item tersebut disetel ke nulldan tidak ada pengecualian yang dilemparkan. Demikian pula, jika set atribut tidak dapat dideserialisasi, elemen attributeSetsarray tersebut disetel ke nulldan tidak ada pengecualian yang dilemparkan.

Ini ServiceMatcheskelasnya:

paket net.jini.core.lookup;

public class ServiceMatches memperluas java.lang.Object mengimplementasikan java.io.Serializable {

item public ServiceItem []; public int totalMatches; }

Dan inilah ServiceItemkelasnya:

paket net.jini.core.lookup;

public class ServiceMatches memperluas java.lang.Object mengimplementasikan java.io.Serializable {

Entri publik [] attributeSets; layanan java.lang.Object publik; public ServiceID serviceID; }

Seperti disebutkan sebelumnya, setiap elemen itemslarik yang dikembalikan oleh bentuk dua parameter adalah item layanan lengkap, yang mencakup objek layanan, ID layanan, dan semua set atribut. The maxMatcheslapangan membantu klien mengelola jumlah objek dikembalikan oleh ini lookup().

Panjang itemslarik di ServiceMatchesobjek yang dikembalikan kurang dari atau sama dengan nilai yang diteruskan ke lookup()dalam maxMatches. Jumlah total item layanan yang cocok (dikembalikan dalam totalMatches) lebih besar dari atau sama dengan panjang itemslarik.

Misalnya, jika maxMatches50 dan template layanan cocok dengan 25 item, panjang itemsarray yang dikembalikan dan nilai totalMatcheskeduanya adalah 25. Alternatifnya, jika maxMatches50 tetapi template layanan cocok dengan 100 item, panjang itemsarray yang dikembalikan adalah 50 dan nilai dari totalMatchesadalah 100. Ketika template layanan cocok dengan lebih dari maxMatchesitem layanan, item layanan yang dikembalikan oleh dua parameter lookup()dipilih secara acak dari set lengkap item layanan yang cocok.

Bentuk satu parameter dari lookup ()

Metode satu parameter lookup()mengembalikan satu objek layanan yang cocok yang dipilih secara acak dari semua kecocokan. Berikut kutipan javadoc yang menjelaskan formulir ini:

publik Object lookup (ServiceTemplate tmpl) melempar java.rmi.RemoteException; 
Mengembalikan objek layanan (yaitu, hanya ServiceItem.service) dari item yang cocok dengan template, atau nulljika tidak ada yang cocok. Jika beberapa item cocok dengan template, itu akan berubah menjadi objek layanan yang dikembalikan. Jika objek yang dikembalikan tidak dapat dideserialisasi, maka UnmarshalExceptionakan dilempar dengan semantik RMI standar.

Karena satu-parameter lookup()mengembalikan hanya satu objek layanan yang cocok, klien dapat meminimalkan jumlah status objek yang diunduh dan file kelas. Tapi karena objek layanan kembali dipilih secara sewenang-wenang, dan tidak diidentifikasi oleh ID layanan atau dijelaskan oleh atribut set terkait, klien harus yakin bahwa setiap objek layanan yang cocok akan cukup.

Metode penjelajahan

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.

Misalnya, TRANSITION_MATCH_MATCHmenunjukkan bahwa setidaknya satu item layanan cocok dengan template Anda sebelum dan setelah operasi. TRANSITION_MATCH_NOMATCHmenunjukkan bahwa, meskipun setidaknya satu item layanan tertentu cocok dengan template Anda sebelum operasi, itu tidak lagi cocok dengan template Anda setelah operasi. Untuk menerima pemberitahuan ketika ada layanan baru yang ditambahkan ke layanan pencarian, Anda cukup menentukan template yang cocok dengan layanan apa pun dan meneruskannya TRANSITION_NOMATCH_MATCHsebagai transisi ke notify()metode.

SUBHEAD_BREAK: Layanan pencarian versus server nama