2012-10-31 3 views
4

Clojure에서 프로토콜로 ZeroMQ 및 BSON을 사용하여 두 개 이상의 다른 서버 응용 프로그램을 개발했다고 가정합니다. 단일 종속성을 공유하면서 단일 JVM 인스턴스를 사용하여 어떻게 배포 할 수 있습니까?단일 JVM 인스턴스에 Clojure 응용 프로그램 배포

각 독립 실행 형 응용 프로그램에 JVM 인스턴스를 사용하는 것이 메모리 낭비 인 것 같습니다. 앞으로 여러 Clojure 응용 프로그램을 개발할 계획이며 VPS 메모리는 저렴하지 않습니다.

명시 적으로 언급하지는 않았지만 응용 프로그램 서버 (Jetty, Glassfish)에서 실행되는 응용 프로그램은 상태를 격리하면서 동일한 JVM을 공유하는 것처럼 보입니다. 그러나 컨테이너가 필요하며 Servlets 또는 Enterprise JavaBeans에는 사용자 정의 프로토콜에 쉽게 적응할 수있는 구현이 없습니다.

난 무의미한 HTTP 서버 오버 헤드가 있다는 생각이 싫지만 Servlet을 사용하고 더미 service() 메소드를 구현하려고 생각 해왔다. EJB 컨테이너에 관해서는, 나는 심지어 그 구현을 이해할 수 없다.

init() 및 destroy() 메소드 만 필요한 컨테이너가 있으면 좋겠지 만 제공하는 응용 프로그램 서버를 찾을 수 없습니다.

어쩌면 방법이 있거나 응용 프로그램 서버가 필요하지 않을 수도 있습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

2

EJB 컨테이너를 사용하는 것이 좋을 것 같지만, 작업하기가 더 쉽거나 더 간단 할 때만 들립니다. Immutant을 보셨습니까? 그것은 기본적으로 Clojure를위한 JBossAS를 둘러싼 래퍼입니다. Red Hat의 사람들 (JBossAS를 소유하고있는 사람들)이 작성했습니다. 응용 프로그램 서버 일뿐만 아니라

, 그 사람은 JMS 및 기타 자바 EE는 Clojure의를, 주변 기능 감쌌다 등 그 응용 프로그램간에 메시지 appears pretty simple 전송 : 또한

을, 그들은 뭔가를 제공 할 수있는 DaemonsJobsinit()destroy()으로 간단한 서비스로 설명했던 것과 비슷합니다.

나는 그것을 사용하지 않았기 때문에 나는 그것을 awesomenss/awfulness라고 보증 할 수는 없다.

2

두 개의 응용 프로그램이 모두 동일한 종속성을 공유하며 둘 다 메시지 버스에서 이벤트에 응답하거나 이벤트를 생성하려고합니다.

내가 말하는 것을 이해한다면, 이것은 classpath의 모든 코드에 액세스 할 수있는 JVM을 시작하고 main 메소드에서 메시지 버스와 코드를 초기화하는 것처럼 간단해야합니다.

컨테이너를 사용하려는 경우 메시지 버스 용 JMS 어댑터가 있다고 가정하고 클로저 코드와 메시지 버스 사이에있는 더미 메시지 구동 빈을 만들 수 있습니다. netbeans/glassfish를 사용하면 나쁘지 않을 수도 있습니다. 모니터링 측면에서 어떤 것을 얻을 수는 있지만, 다른 무엇을 얻게 될지 확신 할 수 없습니다.

1

OSGi 서비스 플랫폼을 구현하는 일부 애플리케이션 서버는 Java EE가 제공하는 것보다 더 간단한 경량 컨테이너를 가지고 있습니다.

Apache Karaf은 JAR 파일에서 직접 POJO 응용 프로그램을로드 할 수 있습니다.

+1

당신은 이미 대부분의 사람들이 필요로하지 않는 많은 기능을 가진 Karaf에 갈 필요조차 없습니다. OSGi 프레임 워크 (Apache Felix, Equinox)는 이러한 응용 프로그램에서 작동합니다. 매우 가벼운 시작하고 사용합니다. –

+0

응용 프로그램 내부에 인터페이스 (서블릿, EJB)를 구현할 필요없이? OSGi 응용 프로그램 서버에 JAR 파일 (DD 형식)을로드 할 수 있습니까? – adeandrade

0

DD가 무엇인지 확실하지 않지만 모든 JAR이 유효한 번들입니다.clojure는 타입 안전이 아니므로 클로저 월드와 OSGi/Java 세계를 연결해야하지만 OSGi API는 이러한 브릿지에 대한 꿈이 아닙니다.

OSGi 번들에서 자동으로 컨텐츠를 제공하지는 않지만 OSGi에서는 기본적으로 private입니다. 그러나 API를 사용하면 원하는 곳 어디에서나 구멍을 뚫을 수 있습니다.