2011-04-09 6 views
2

내가 잘못 설명하는 경우 실례지만, 본질적으로 서비스와 비슷한 클래스를 서버 시작시 한 번만 인스턴스화하고 "존재" 백그라운드에서 서버 중지 때까지 종료됩니다. 적어도 내가 알 수있는 것에서 이것은 전형적인 서블릿과 정확히 똑같지는 않다. 더 중요한 것은 나중에이 서비스/객체에 액세스 할 수 있어야한다는 것입니다.java ee 백그라운드 서비스

예를 들어, 필자가 작업 한 다른 프로젝트에서 비슷한 것을 달성하기 위해 Spring Framework를 사용했습니다. 본질적으로 Spring은 내장 된 주석과 함께 설정 XML 파일을 사용하여 Spring이 일부 서비스의 인스턴스를 인스턴스 화하도록 알려줍니다. 나중에 우리는 @Autowired 어노테이션을 사용하여 미리 인스턴스화 된이 서비스/객체의 객체 참조를 "잡아"정렬했습니다.

Java의 주요 개념 중 일부에 비해 보일지 모르지만, 저는이 바퀴를 재발 명하는 방법을 알아 내려고하고 있습니다. 나는 때때로 이러한 큰 앱 프레임 워크가 내가 정말 미세 조정할 수 있기를 바란 장면에서 너무 많은 "블랙 박스 마법"을하는 것처럼 느낀다고 생각한다.

도움을 주셔서 감사합니다.


아, 그리고 난 당신이 EJB 3.1 세션 빈을 사용하는 것으로 간주 모든

+0

어떤 방식으로 Spring의 IOC 및 autowiring이 원하는 것이 아닌가요? 다른 클래스에서 얻을 수있는 싱글 톤을 만들 수 있습니다. –

+0

제 생각 엔 그의 현재 프로젝트에는 스프링이 없습니다. 싱글 톤에 대해서만 Spring을 추가하는 것은 과잉 일 것입니다, IMHO. –

답변

4

여기 한 가지 방법이 있습니다. 예컨대, 당신의 web.xml에 서블릿 컨텍스트 리스너를 추가 :

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

가 그런 다음, 백그라운드 서비스를 관리하는 클래스를 만듭니다. 이 예에서는 내가 5 분마다 실행되도록 일정을 단일 스레드 ScheduledExecutorService를 사용하면 웹 요청에서 BackgroundService에 액세스해야하는 경우

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 
    } 
} 

을, 당신은 ServletContext를 통해 액세스 할 수 있습니다. 예 ::

ServletContext context = request.getSession().getServletContext(); 
BackgroundService service = (BackgroundService) context.getAttribute("service"); 
+0

이것은 꽤 직관적입니다. 나는 컨텍스트 리스너를 구현한다는 개념에 넘어 섰고, 웹 애플 리케이션의 다른 부분에 서비스를 제공하는 방법을 알지 못했습니다. context.setAttribute()는 트릭을 수행해야하는 것처럼 보입니다. 감사! – jerluc

+0

이것은 매우 유용합니다. JBoss AS 5.1.0에서 사용할 수 있는지 궁금합니다. 이 버전에 내장 된 ServletContextListener를 찾을 수 없습니다 ... JBoss 7.1 다운로드에서 "jboss-servlet-api_3.0_spec-1.0.0.Final.jar"을 lib 또는 build 경로에 추가하면 javax. 서블릿,하지만 이것은 몇 가지 호환성 문제가 발생할 것이라 확신합니다. 5.1에 좋은 대안이 있습니까? –

2

보스 (6)에서이 작업을 실행하기 위해 노력하고있어? 이 파일들은 war 파일에 배포 할 수 있으며 @Singleton 및 @Startup으로 주석을 달 수 있습니다.

EJB 3.1에서 사용할 수있는 주석의 수는 스프링 제품을 Java EE 프레임 워크로 가져 오는 용도로 설계되었습니다. 고려중인 재발 명이 당신을 위해 완료되었을 수 있습니다.

0

messaging을 사용할 수 있습니다. 메시지를 queue으로 보내고 message listener 처리를 asynchronously in the background으로하십시오. 구현에 JMS을 사용할 수 있으며 메시지 브로커에는 ActiveMQ을 사용할 수 있습니다. Spring은 자신의 롤해야하는 경우, 당신은 서블릿을 만들 수 있습니다 및 응용 프로그램이 load-on-startup를 사용하여 않는 때 시작 구성

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

0

JMS 구현이 간단하게 할 수 JMSTemplate, JMSGateWaySupport API가 있습니다. 나는 몇 년 전에 그런 시스템을 만들었습니다. 그런 다음 새로운 서블릿의 작업을 처리하기 위해 ExecutorService과 같은 새로운 (ish) java.util.concurrent 항목을 사용했습니다.

당신이하려는 일에 대한 더 많은 정보와 기존 일하는 방식이 불충분 한 이유가 도움이 될 것입니다.