2013-05-01 37 views
8

Tôi muốn tạo và triển khai một dịch vụ web cho vùng chứa OSGi. Ví dụ: xuất bản dịch vụ tới địa chỉ:Cách sử dụng servlet với osgi

http://localhost:8080/testservice. 

Dịch vụ tạo phản hồi HTML trong servlet.

Tôi đã tìm kiếm rất nhiều và có:

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

}

Các công cụ tôi cần phải sử dụng:

  1. maven để tạo dự án

  2. Fuse ESB karaf dưới dạng thùng chứa OSGi

Câu hỏi đặt ra là tôi không biết làm thế nào để sử dụng Maven để tạo ra và thực hiện các dịch vụ web như vậy, như:

làm thế nào để xác định webapp/web.xml

làm thế nào để xác định pom.xml: phụ thuộc, loại gói, plugin

cách đăng ký dịch vụ: thực hiện BundlActivator hoặc cấu hình mùa xuân file xml

bất cứ ai có thể giúp tôi với điều này? Có hướng dẫn chi tiết cho newbie không?

+0

Mẫu https://github.com/bdelacretaz/OSGi-for-mere-mortals của tôi minh họa một ứng dụng dựa trên OSGi đơn giản nhưng đầy đủ sử dụng một vài servlet . Nó không sử dụng Apache Karaf tại container của nó nhưng sẽ giúp bạn có được một cảm giác về cách thức hoạt động này nói chung. –

Trả lời

4

Nếu bạn sử dụng bndtools, tạo một dự án khai báo dịch vụ và thêm chú thích này để servlet của bạn:

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

Sau đó, tạo ra một mô tả chạy BND với ' Apache Felix 4 với Web Console và Gogo ', chỉ cần thêm gói bảng Apache Felix Http và bạn đã sẵn sàng. Bạn có thể tìm thấy servlet của mình tại http://localhost:8080/hello

Cách hoạt động. Chú thích @Component làm cho lớp của bạn trở thành một dịch vụ (dịch vụ Servlet trong trường hợp này do thuộc tính cung cấp). Điều này được đăng ký với thuộc tính dịch vụ 'bí danh'. Gói Apache Http Http Whiteboard chọn các dịch vụ này và đăng ký chúng như các servlet. Tôi không nghĩ rằng nó có thể nhận được bất kỳ đơn giản hơn này.

+0

Đủ @Compoment? Tôi luôn nghĩ Servlet sẽ phải được khai báo là \ @Service. – ilikeorangutans

+0

Tôi cần sử dụng FUSE ESB Enterprise. Không thể chuyển sang Apache Felix. Apache Felix có giống với Apache Karaf không? –

+0

@ilikeorangutans Có đủ rồi. Lưu ý thuộc tính "provide = Servlet.class". –

1

Bạn có thể tìm thấy hướng dẫn sau hữu ích: http://www.javabeat.net/2011/11/writing-an-osgi-web-application/. Nó dựa trên chương hai của Enterprise OSGi in Action. Chương 8 cũng có một cuộc thảo luận về cách sử dụng các công cụ xây dựng như maven để có được cấu trúc bó phù hợp, và http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html cũng có các hướng dẫn maven thực sự hữu ích.

Ở mức cao, tuyến đường tốt nhất của bạn có thể tận dụng lợi thế của một thứ như Apache Aries hoặc Eclipse Gemini để cho phép bạn chạy WAB (gói web). WAB được cấu trúc gần giống như một WAR, ngoại trừ việc tệp kê khai có siêu dữ liệu OSGi trong đó. Lớp servlet của bạn sẽ giống hệt với trường hợp không phải OSGi. Khung công tác sẽ xử lý việc khám phá và khởi chạy servlet của bạn.

0

Để trả lời câu hỏi của bạn, vì Karaf (FUSE ESB) sử dụng Web Pax làm Web-Container mặc định hãy xem Pax Web để biết thêm chi tiết về cách hoạt động và có thể tốt nhất cho bạn tại hơn 100 integration tests của Pax Web cung cấp cho bạn một ý tưởng về cách sử dụng nó. Cũng có sẵn samples để chỉ cho bạn cách sử dụng std. Http-Service, thông qua Whiteboard-Extender hoặc như WAR/WAB.

2

Tôi muốn theo dõi câu trả lời của Peter Kriens. Với @Component chú thích có sẵn trong các đặc điểm kỹ thuật OSGi, ví dụ có thể trông như thế này:

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

Các @Component chú thích được nhập khẩu từ org.osgi.service.component và tài sản đó quy định các dịch vụ thực hiện đã đổi tên thành service.

Mặc dù tên của nó, property có thể chứa nhiều thuộc tính ví dụ

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

hoặc bạn có thể sử dụng properties để chỉ định một hoặc nhiều tập tin thuộc tính như sau:

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

Trên đây đã được thử nghiệm với HttpService đi kèm với Apache Felix. Bạn có thể tìm thấy tài liệu về Dịch vụ HTTP Felix Apache tại đây: http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html

Các vấn đề liên quan