Úvod
Caucho Hessian je protokol použiteľný na vzdialené volanie procedúr alebo na implementáciu myšlienky webových služieb. Samotný protokol je binárny a ako transportná vrstva je použitý klasické HTTP.
Paralelne s Hessian-om jestvuje spriatelený protokol Burlap, ktorý namiesto binárnej reprezentácie prenášaných dát používa XML.
Hessian umožňuje zverejniť na vzdialené volanie procedúr ľubovoľný interfejs, za ktorým stojí vhodná implementačná trieda.
Vzťah s podobnými technológiami
Hessian vs RMI
- oba používajú binárne protokoly a Java serializáciu
- RMI používa vlastnú sieťovú komunikáciu, Hessian beží nad HTTP (je teda potrebný aspoň minimalistický servletový kontajner (príklad viď nižšie))
- RMI je zabudovaný priamo v JDK
- Pre Hessian existuje interoperabilita: existujú implementácie pre iné programovacie jazyky (Python, C# a pod.), RMI je obmedzené na Javu
Hessian vs SOAP
- SOAP využíva protokol založený na XML a rovnako serializáciu objektov do XML
- SOAP beží štandardne nad HTTP (je potrebný servletový kontajner) s možnosťou ďalších protokolov
- SOAP umožňuje mnohé vychytralosti (bezpečnosť a autentifikácia, správy s prílohami) a podporuje interoperabilitu medzi mnohými jazykmi
- kvôli tomu však SOAP vyžaduje omnoho komplexnejšiu konfiguráciu a praktická rýchlosť môže byť nižšia
Hessian vs Spring HTTP Invoker
- oba využívajú HTTP protokol a Java serializáciu
- Spring HTTP Invoker nepodporuje interoperabilitu
- v ostatných aspektoch približne rovnaké
Jednoduchý príklad
Server
Vytvorme si interfejs pre službu poskytujúcu aktuálny čas na serveri.
public interface DateService {
Date getCurrentDate();
}
a vytvorme jeho implementáciu
public class DateServiceImpl implements DateService {
public Date getCurrentDate() {
return new Date();
}
}
Ako sme spomenuli, Hessian beží nad protokolom HTTP, presnejšie povedané využíva technológiu servletov. Na tento účel je k dispozícii špeciálny HTTP servlet com.caucho.hessian.server.HessianServlet, ktorému poskytneme dva parametre:
- názov interfejsu s metódami
- názov implementačnej triedy
Tie môžeme nakonfigurovať v rámci inicializačných parametrov servletu vo
web.xml. V našom prípade však použijeme programovú konfiguráciu v kontajneri Jetty.
Vytvoríme inštanciu HessianServletu a nakonfigurujeme ju nasledovne:
HessianServlet hessianServlet = new HessianServlet();
hessianServlet.setHomeAPI(DateService.class);
hessianServlet.setHome(new DateServiceImpl());
Následne naštartujeme a nakonfigurujeme Jetty.
Server server = new Server(8080);
Context context = new Context(server, "/", Context.SESSIONS);
context.addServlet(new ServletHolder(hessianServlet), "/*");
server.start();
server.join();
Server predstavuje hlavnú triedu servera, do ktorej pridáme webový kontext namapovaný na koreňovú adresu (/). Do tohto kontextu pridáme jeden už nakonfigurovaný servlet (inštanciu HessianServletu obaľuje ServletHolder) a namapujeme ju na ľubovoľnú adresu pod webovým kontextom.
Následne server naštartujeme.
Klient
Klient je o niečo jednoduchší než server. Centrom je továreň HessianProxyFactory, ktorú požiadame o vytvorenie inštancie triedy implementujúcej DateService. Táto inštancia skrytá za interfejsom bude riešiť všetku špinavú prácu (pripojenie k serveru, serializácia a deserializácia dát a pod.)
Továrni stačí odovzdať URL adresu, na ktorej beží serverovská časť.
String url = "http://localhost:8080/";
HessianProxyFactory factory = new HessianProxyFactory();
DateService dateService = (DateService) factory.create(DateService.class, url);
Objekt dateService je takto pripravený a môžeme na ňom pohodlne volať metódy.
System.out.println(dateService.getCurrentDate());
Všimnime si, že pracujeme so samotným interfejsom, ktorý stiera rozdiely medzi tým, či pracujeme na lokálnej alebo vzdialenej inštancii triedy DateServiceImpl.
Aké triedy je možné posielať po kábli?
Hessian podporuje všetky základné dátové typy a objekty, ktoré sú serializovateľné a majú viditeľný prázdny konštruktor. Triedy určené na posielanie nie je potrebné nijak špeciálne konfigurovať ani upravovať.
>> Home