Фоновая служба Java EE - PullRequest
       40

Фоновая служба Java EE

2 голосов
/ 10 апреля 2011

Вы должны извинить меня, если я описываю это неправильно, но по сути я пытаюсь получить сервис-подобный класс, который создается один раз при запуске сервера, и вроде как "существовать" в фоновом режиме до он останавливается на остановке сервера. По крайней мере из того, что я могу сказать, это не совсем то же самое, что и типичный сервлет (хотя я могу ошибаться в этом). Еще более важно то, что мне также необходимо иметь доступ к этому сервису / объекту позже по линии.

Например, в другом проекте, над которым я работал, мы использовали Spring Framework для достижения чего-то похожего. По сути, мы использовали XML-файл конфигурации вместе со встроенными аннотациями, чтобы позволить Spring знать, как создавать экземпляры некоторых из наших сервисов. Позже мы использовали аннотацию @Autowired, чтобы «захватить» ссылку на объект этой предварительно созданной службы / объекта.

Итак, хотя это может показаться противоречащим некоторым основным концепциям самой Java, я просто пытаюсь выяснить, как изобрести это колесо здесь. Наверное, иногда я чувствую, что эти большие фреймворки приложений слишком много "магии черного ящика" за кулисами, что я действительно хотел бы иметь возможность настроить.

Спасибо за любую помощь и / или предложения!


О, и я пытаюсь запустить все это из JBoss 6

Ответы [ 4 ]

4 голосов
/ 10 апреля 2011

Вот один из способов сделать это. Добавьте прослушиватель контекста сервлета к вашему web.xml, например ::100100

<listener>
    <listener-class>com.example.BackgroundServletContextListener</listener-class>
</listener>

Затем создайте этот класс для управления вашим фоновым сервисом. В этом примере я использую однопоточный ScheduledExecutorService, чтобы запланировать его запуск каждые 5 минут:

public class BackgroundServletContextListener implements ServletContextListener {
    private ScheduledExecutorService executor;
    private BackgroundService service;

    public void contextInitialized(ServletContextEvent sce) {
        service = new BackgroundService();

        // setup single thread to run background service every 5 minutes
        executor = Executors.newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(service, 0, 5, TimeUnit.MINUTES);

        // make the background service available to the servlet context
        sce.getServletContext().setAttribute("service", service);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        executor.shutdown();
    }
}

public class BackgroundService implements Runnable {
    public void run() {
        // do your background processing here
    }
}

Если вам нужен доступ к BackgroundService из веб-запросов, вы можете получить к нему доступ через ServletContext. E.g.:

ServletContext context = request.getSession().getServletContext();
BackgroundService service = (BackgroundService) context.getAttribute("service");
2 голосов
/ 10 апреля 2011

Рассматривали ли вы использование сессионного компонента EJB 3.1?Они могут быть развернуты в файле войны и могут быть аннотированы с помощью @Singleton и @Startup.

Ряд аннотаций, доступных в EJB 3.1, предназначен для добавления положительных качеств Spring в инфраструктуру Java EE.Это может быть повторное изобретение, которое вы рассматриваете, было сделано для вас.

0 голосов
/ 10 апреля 2011

Если вам нужно свернуть свой собственный, вы можете создать сервлет и настроить его запуск, когда приложение использует load-on-startup . Я построил такую ​​систему несколько лет назад. Затем мы использовали новый (ish) java.util.concurrent, например, ExecutorService , чтобы заставить его обрабатывать другие сервлеты.

Было бы полезно получить дополнительную информацию о том, что вы пытаетесь сделать, и о том, почему существующие способы ведения дел недостаточны.

0 голосов
/ 10 апреля 2011

Вы можете использовать messaging для этого. Просто отправьте сообщение на queue и позвольте message listener выполнить обработку asynchronously in the background. Вы можете использовать JMS для реализации и ActiveMQ для посредника сообщений. Spring имеет JMSTemplate, JMSGateWaySupport API для простой реализации JMS

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jms.html

...