2013-05-01 12 views
8

Desidero creare e distribuire un servizio Web sul contenitore OSGi. Ad esempio, pubblica il servizio all'indirizzo:Come utilizzare servlet con osgi

http://localhost:8080/testservice. 

Il servizio genera una risposta HTML in un servlet.

Ho cercato un sacco e ottenuto:

public class HelloWorldServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 

    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>Hola</title>"); 
    out.println("</head>"); 
    out.println("<body bgcolor=\"white\">"); 
    out.println("</body>"); 
    out.println("</html>"); 
} 

}

Lo strumento che ho bisogno di usare:

  1. Maven per creare il progetto

  2. FUSE ESB karaf come contenitore OSGi

la questione è che non so come usare Maven per creare e implementare tale servizio web, come:

come specificare webapp/web.xml

come specificare pom.xml: dipendenze, tipo di pacchetto, di plugin

come registrare il servizio: implementare BundlActivator o configurare file xml primavera

qualcuno mi può aiutare con questo? Esiste un tutorial dettagliato per principianti?

+0

Il mio esempio https://github.com/bdelacretaz/OSGi-for-mere-mortals mostra una semplice ma completa applicazione basata su OSGi che utilizza alcuni servlet . Non usa Apache Karaf nel suo contenitore ma dovrebbe aiutarti a capire come funziona in generale. –

risposta

4

Se si utilizza bndtools, creare un progetto dichiarativa Servizi e aggiungere questa annotazione al servlet:

@Component(provide = Servlet.class, properties = {"alias=/hello"}) 
public class HelloWorldServlet extends HttpServlet { ... } 

quindi creare un descrittore di corsa BND con ' Apache Felix 4 con Web Console e Gogo ', basta aggiungere il bundle di lavagna Apache Felix Http e sei a posto. Puoi trovare il tuo servlet al http://localhost:8080/hello

Come funziona. L'annotazione @Component rende la tua classe un servizio (un servizio Servlet in questo caso a causa dell'attributo provide). Questo è registrato con l'alias della proprietà del servizio. Il bundle Apache Felix Http Whiteboard preleva questi servizi e li registra come servlet. Non penso che possa essere più semplice di così.

+0

@Compoment è sufficiente? Ho sempre pensato che il Servlet avrebbe dovuto essere dichiarato come \ @Service. – ilikeorangutans

+0

Ho bisogno di usare FUSE ESB Enterprise. Impossibile passare ad Apache Felix. Apache Felix è simile ad Apache Karaf? –

+0

@ilikeorangutans Sì, è abbastanza. Si noti l'attributo "fornire = Servlet.class". –

1

È possibile trovare il seguente tutorial utile: http://www.javabeat.net/2011/11/writing-an-osgi-web-application/. Si basa sul secondo capitolo di Enterprise OSGi in Action. Il capitolo otto ha anche una discussione su come usare gli strumenti di costruzione come Maven per ottenere la giusta struttura di bundle, e http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html ha anche delle utili istruzioni di preparazione.

Ad un livello elevato, il percorso migliore è probabilmente quello di sfruttare Apache Aries o Eclipse Gemini per consentire l'esecuzione di un WAB (un pacchetto Web). Un WAB è strutturato quasi esattamente come un WAR, tranne per il fatto che il manifest contiene metadati OSGi. La classe servlet stessa sarebbe identica al caso non OSGi. Il framework gestirà la scoperta e l'avvio del servlet.

0

Per rispondere alla tua domanda, dal momento che Karaf (FUSE ESB) utilizza Pax Web come è di default Web-Container dare un'occhiata a Pax Web per maggiori dettagli come funziona e probabilmente il migliore per voi al più di 100 integration tests di Pax Web darti un'idea su come usarla. Ci sono anche samples disponibili per mostrarti come usare entrambi gli std. Servizio Http, tramite Whiteboard-Extender o WAR/WAB.

2

Vorrei rispondere alla risposta di Peter Kriens. Con @Component annotazioni disponibili nella specifica OSGi, l'esempio potrebbe essere la seguente:

@Component(service = Servlet.class, property = { "osgi.http.whiteboard.servlet.pattern = /hello" }) 
public class HelloWorldServlet extends HttpServlet { ... } 

Il @Component di annotazione è importata da org.osgi.service.component e la proprietà che specifica il servizio implementato ha cambiato il suo nome in service.

Nonostante il nome, property può contenere più proprietà, ad esempio

@Component(service = ..., property = { "a=b", "c=d" }) 

Oppure si potrebbe usare properties per specificare uno o più file di proprietà in questo modo:

@Component(service = ..., properties = { "OSGI-INF/servlet.properties" }) 

Quanto sopra è stato testato con HttpService fornito con Apache Felix. La documentazione del servizio HTTP Apache Felix può essere trovata qui: http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

Problemi correlati