2013-05-01 9 views
8

Chcę utworzyć i wdrożyć usługę WWW do kontenera OSGi. Na przykład opublikować usługę na adres:Sposób korzystania z serwletu z osgi

http://localhost:8080/testservice. 

Usługa generuje odpowiedź HTML w serwletu.

Szukałem dużo i otrzymała:

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>"); 
} 

}

narzędzia muszę używać:

  1. Maven, aby utworzyć projekt

  2. Fuse ESB karaf jako kontener OSGi

Chodzi o to, że nie wiem, jak używać Maven tworzyć i realizować taką usługę internetową, jak:

jak określić webapp/web.xml

jak określić pom.xml: zależności, rodzaj opakowania, plugin

jak zarejestrować usługę: wdrożenie BundlActivator lub konfiguracji sprężyny pliku xML

czy ktoś może mi pomóc z tym? Czy istnieje szczegółowy samouczek dla początkujących?

+0

Moja https://github.com/bdelacretaz/OSGi-for-mere-mortals przykład demonstruje proste, ale kompletne aplikacje oparte na OSGi, które używa kilku serwletów . Nie używa Apache Karaf w swoim kontenerze, ale powinno pomóc ci zorientować się, jak to działa w ogóle. –

Odpowiedz

4

Jeśli używasz bndtools utwórz projekt deklaratywna usługi i dodać adnotację do serwletu:

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

Następnie utwórz BND deskryptor biegać z ' Apache Felix 4 z Web Console i Gogo ', wystarczy dodać pakiet Whiteboard Apache Felix Http i jesteś gotowy. Możesz znaleźć swój serwlet pod adresem http://localhost:8080/hello

Jak to działa. Adnotacja @Component powoduje, że twoja klasa staje się usługą (usługa Servlet w tym przypadku ze względu na atrybut provide). Jest on zarejestrowany w usłudze "alias". Pakiet Apache Felix Http Whiteboard podnosi te usługi i rejestruje je jako serwlety. Nie sądzę, żeby to było prostsze niż to.

+0

Czy @Compoment wystarczy? Zawsze myślałem, że Servlet będzie również zadeklarowany jako \ @ Service. – ilikeorangutans

+0

Potrzebuję użyć FUSE ESB Enterprise. Nie można przełączyć na Apache Felix. Czy Apache Felix jest podobny do Apache Karaf? –

+0

@ilikeorangutans Tak, to wystarczy. Zwróć uwagę na atrybut "provide = Servlet.class". –

1

Poniższy samouczek może okazać się pomocny: http://www.javabeat.net/2011/11/writing-an-osgi-web-application/. Opiera się na drugim rozdziale z Enterprise OSGi in Action. Rozdział ósmy zawiera również dyskusję na temat użycia narzędzi do budowania, takich jak maven, do uzyskania odpowiedniej struktury pakietu, a ponadto http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html ma również naprawdę pomocne wskazówki.

Na najwyższym poziomie najlepsza trasa to prawdopodobnie wykorzystanie czegoś takiego jak Apache Aries lub Eclipse Gemini, aby umożliwić uruchomienie WAB (pakietu internetowego). Struktura WAB ma strukturę zbliżoną do WAR, z tym że manifest zawiera w sobie metadane OSGi. Twoja klasa serwletów byłaby identyczna jak w przypadku innym niż OSGi. Framework zajmie się odkrywaniem i uruchamianiem serwletu.

0

Aby odpowiedzieć na to pytanie, ponieważ Karaf (FUSE ESB) wykorzystuje Pax Web jak to domyślny Web-Container przyjrzeć Pax Web więcej szczegółów, jak to działa i prawdopodobnie najlepszy dla Ciebie w ponad 100 integration tests Pax Web do daje ci pomysł, jak z niego korzystać. Dostępne są również samples, aby pokazać, jak korzystać ze std. Http-Service, przez Whiteboard-Extender lub jako WAR/WAB.

2

Chciałbym odpowiedzieć na odpowiedź Peter Kriens. Z @Component adnotacje dostępny w specyfikacji OSGi, przykład mógłby wyglądać następująco:

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

@Component adnotacja jest importowany z org.osgi.service.component a właściwość, która określa wdrożony serwis zmienił nazwę na service.

Pomimo nazwy, property może posiadać wiele właściwości np

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

lub można użyć properties aby określić jeden lub więcej plików właściwości tak:

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

Powyższe zostało przetestowane z HttpService dostarczany z Apache Felix. Dokumentację usługi HTTP Apache Felix można znaleźć tutaj: http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html