2010-03-22 2 views
4

나는 자바 애플리케이션 서버로 마이그레이션하려고 생각하고있는 데이터베이스에 대해 대기열 기반 처리를하는 독립형, 헤드리스, 자바 서버 애플리케이션을 가지고있다. 나는 많은 백엔드 자바 경험과 JSP를 가지고 있지만 서블릿 경험은 많지 않다.헤드리스 자바 서블릿?

마치 내 앱을 서블릿에 랩핑하고 시작시 배포하도록하는 방법이있는 것 같습니다 (그리고 하나의 인스턴스 만 배포되었는지 확인하십시오).

몇 가지 질문 : 내 응용 프로그램은 어떤 HTTP (또는 다른) 요청/응답 메커니즘을 가지고 있지 않기 때문에

1)이 더 URL 매핑이없는 서블릿을 구현하는 어리석은 것? API를 보면 GenericServlet을 구현하고 service() 메소드를 비워두면 될까요?

2) 내 Java 앱의 다른 부분은 들어오는 데이터의 스트림을 받아들이는 자체 네트워크 소켓 (비 HTTP)을 열고 관리합니다. 서블릿 요청/응답 모델에 맞히기 위해서는 상당한 노력이 필요하다고 생각합니다. 서블릿이 자체 네트워크 소켓을 열거 나 관리하는지 확인합니까?

3) 우리는 또한 자바 응용 프로그램과 잘 통합되지 않은 (현재는 coldfusion에있는) 웹 응용 프로그램을 가지고 있습니다 (DB를 통해서만 통신 할 수 있다는 점에서). 우리는 railo (다른 서블릿)을보고 있으며 coldfusion/railo 앱 (동일한 앱 서버에서 실행)이 서로 직접 통신하는 것이 얼마나 쉬운 지 파악하려고합니다. 어쩌면 자바 엔진의 현재 런타임 통계/메트릭을 표시하고 궁극적으로 자바 엔진에서 비즈니스 로직 중 일부를 호출하는 웹 페이지 일 수도 있습니다.

감사합니다,

답변

2
  1. 서블릿 브라이언은 특히 HTTP 세계에 연결되지 않은 일반적인 메커니즘 (HttpServlets이 경우 99.999 %에 사용된다는 사실 despites). 메일 이벤트에 응답하는 MailServlet을 구현하기 위해 Servlet 클래스를 서브 클래스화할 수 있습니다. 그러나 현재 알고있는 한, 현재 웹 서버는 HTTP 매핑 만 지원합니다.

  2. 소켓은 Java EE 세계에 속해 있으며이 환경에서 사용자 정의 스레드를 시작하는 것은 좋지 않은 것으로 간주됩니다. 소켓을 여는 경우 (데이터 폴링 등을 위해) 가장 확실하게 수행해야합니다.

+0

필자는 실행/관리하는 스레드를 분명히 가지고 있습니다. 서블릿에서 스레드를 생성하는 것이 그렇게 나쁠까요? 스레드가 안전해야하지만 스레드를 생성하는 것에 대해서는 본 적이 없다는 것을 읽었습니다. – Brian

+1

@ 브라이언 그것은 일반적으로 눈살을 찌른 연습입니다. 서블릿에 의해 시작된 관리되지 않는 스레드가 서블릿 컨테이너/서버가 종료 명령에 응답하지 못하게 할 수 있기 때문입니다. 대신 Executor 프레임 워크를 사용하십시오. –

+2

@Brian - 왜 산란 스레드가 나쁜 것으로 간주되는 이유 -> http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847. 귀하의 경우 컨테이너가 관리 할 수없는 일을하고 있기 때문에 귀하의 경영 추리를 무효화합니다. – Robin

2

HTTP 요청을 가로 채지 않으려면 HttpServlet을 확장하지 마십시오. 이것은 말이되지 않습니다. webapp의 시작시 "백그라운드 작업"으로 실행하고 webapp의 종료시 중지하려면 실제로 ServletContextListener을 구현하십시오.

public class Config implements ServletContextListener { 

    private YourApp yourApp; 

    public void contextInitialized(ServletContextEvent event) { 
     yourApp = new YourApp(); 
     yourApp.start(); 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     yourApp.stop(); 
    } 

} 

다음과 같이 web.xml에 등록 할 수있는 : 실제로 별도의 스레드에서 작업을 발생하지 않습니다

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

YourApp 경우에, 당신은 Runnable에서 그것을 마무리하기 위해 필요합니다 ExecutorService을 사용하여 실행하십시오. 예 : 결국, 당신의 웹 애플리케이션이보다 다른 아무것도하지 않습니다 경우

public class Config implements ServletContextListener { 

    private ExecutorService executor; 

    public void contextInitialized(ServletContextEvent event) { 
     executor = Executors.newSingleThreadExecutor(); 
     executor.submit(new YourApp()); // YourApp should implement Runnable. 
    } 

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

} 

후 나는 servletcontainer에서 실행의 가치에 의문을 제기. 대신, main() 메소드를 사용하여 독립 실행 형 Java 응용 프로그램으로 실행하십시오.

+0

현재 main()을 통해 독립 실행 형으로 실행됩니다. 1) 관리 편의성 (특히 웹 응용 프로그램의 나머지 부분과 함께 실행할 수있는 경우) 2) 웹 응용 프로그램을 엔진과 통합하는 경우 (원래 게시물의 3 번 질문) 3) 길게 용어 : 내부 서비스 중 일부를 웹 서비스로 노출. – Brian

+0

또한 응용 프로그램 서비스가 응용 프로그램 서버에서 어떻게 노출됩니까? Coldfusion/Railo의 스케줄러 서비스와 비슷합니까? 그들은 ServletContextListener 메커니즘을 사용합니까? – Brian

+0

그런 다음'ServletContextListener' 접근 방식을 사용하면'Runnable'으로 래핑하면됩니다. 나는 Coldfusion/Railo를하지 않지만 비슷한 일을한다고 상상할 수 있습니다. 다른 점은 자신의 문서/소스 코드를 크롤링하면됩니다. – BalusC