В этой статье я покажу вам, как создать простой сервлет на основе OSGI. Позже мы развернем этот сервлет в экземпляре Amazon EC 2 — это должно быть весело!
Прежде всего , некоторые предварительные шаги. Нам нужно создать новый проект OSGi и добавить некоторые зависимости:
- Создайте новый проект плагина, назвав его simple.servlet . Убедитесь, что выбрали Equinox в качестве целевой платформы OSGI на первой странице мастера. Также убедитесь, что у вас есть активатор (эта опция включена по умолчанию).
- Откройте редактор манифеста и добавьте следующие пакеты в раздел «Импортированные пакеты» на вкладке «Зависимости»:
- javax.servlet
- javax.servlet.http
- org.osgi.framework
- org.osgi.service.http
- org.osgi.util.tracker
Далее давайте создадим сервлет. Сервлеты — это простые классы Java, которые реализуют интерфейс javax.servlet.Servlet. Поскольку мы хотим предоставлять информацию по HTTP, мы можем просто создать подкласс javax.servlet.http.HttpServlet, который уже выполняет некоторые тяжелые задачи для нас. Все, что нам нужно сделать, это переопределить метод doGet (). Этот метод не имеет возвращаемого значения. Вместо этого нам нужно заполнить его второй параметр, HttpServletResponse или, соответственно, текстом, который мы хотим отобразить в веб-браузере. Мы могли бы вернуть HTML, но для простоты давайте просто вернем простой текст (поэтому убедитесь, что для типа содержимого установлено значение text / plain):
package simple.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/plain");
resp.getWriter().write("Hello from the cloud!");
}
}
Чтобы сервлет был доступен через HTTP, нам нужно зарегистрировать его. Если вы выполнили некоторые разработки JEE / J2EE, вы знаете, что сервлеты регистрируются с использованием дескриптора сервлета web.xml. Поскольку мы больше не в мире JEE, мы не можем идти по этому пути. Вместо этого мы зарегистрируем сервлет с помощью org.osgi.util.tracker.ServiceTracker. Это немного больше кода для написания, но позвольте мне сказать вам: оно того стоит, как вы увидите очень скоро.
Сервисный трекер будет зарегистрирован для определенного класса — в нашем случае это org.osgi.service.http.HttpService:
package simple.servlet;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.util.tracker.ServiceTracker;
public class HttpServiceTracker extends ServiceTracker {
public HttpServiceTracker(BundleContext context) {
super(context, HttpService.class.getName(), null);
}
// ...
Когда сервисный трекер запрашивает возврат HttpService, мы можем зарегистрировать наш сервлет:
/ ...
public Object addingService(ServiceReference reference) {
HttpService httpService = (HttpService) super.addingService(reference);
if (httpService == null)
return null;
try {
System.out.println("Registering servlet at /simple");
httpService.registerServlet("/simple", new SimpleServlet(), null, null);
} catch (Exception e) {
e.printStackTrace();
}
return httpService;
}
/...
Аналогично, мы должны обязательно отменить регистрацию сервлета, когда сервисный трекер запрашивает отключение HttpService.
// ..
public void removedService(ServiceReference reference, Object service) {
HttpService httpService = (HttpService) service;
System.out.println("Unregistering /simple");
httpService.unregister("/simple");
super.removedService(reference, service);
}
}
Теперь , когда у нас есть сервлет, нам нужно убедиться, что сервисный трекер запущен и остановлен, когда наш пакет запускается и останавливается. Те из вас, кто знаком с OSGi, знают, куда мы идем сейчас: нам нужно реализовать методы start () и stop () нашего активатора:
package simple.servlet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private HttpServiceTracker serviceTracker;
public void start(BundleContext context) throws Exception {
serviceTracker = new HttpServiceTracker(context);
serviceTracker.open();
}
public void stop(BundleContext context) throws Exception {
serviceTracker.close();
serviceTracker = null;
}
Чтобы проверить ваш сервлет локально , создайте новую конфигурацию запуска:
- В главном меню выберите Run -> Run Configurations …
- Дважды щелкните OSGi Framework в дереве слева, чтобы создать новую конфигурацию запуска на основе OSGi.
- Убедитесь, что вы выбрали следующие восемь (8) комплектов на вкладке Комплекты :
- simple.servlet
- javax.servlet
- org.eclipse.equinox.http.jetty
- org.eclipse.equinox.http.servlet
- org.eclispe.osgi
- org.eclispe.osgi.services
- org.mortbay.jetty.server
- org.mortbay.jetty.util
- Зайдем на Arguments вкладке, убедившись , что аргументы VM текстовое поле читает -Declipse.ignoreApp = истина -Dosgi.noShutdown = истина -Dorg.osgi.service.http.port = 8080
и назовите его Simple Servlet (OSGi)
Теперь вы можете запустить сервер , выполнив конфигурацию запуска. Через очень короткое время в окне консоли должен появиться текст «Регистрация сервлета в / simple», указывающий, что ваш сервер на базе OSGi и ваш сервлет запущены (намного быстрее, чем это было бы на Tomcat или любом другом сервере JEE, в этом отношении).
Откройте ваш веб-браузер по адресу http: // localhost: 8080 / simple, чтобы увидеть ваш сервлет в действии:
Поздравляем , вы только что создали свой первый сервлет с поддержкой OSGi. В следующем посте я покажу вам, как развернуть этот сервлет в экземпляре Amazon EC2. Вы можете скачать исходный код этого поста из моего репозитория SVN в коде Google.