복붙노트

[SPRING] JBoss와 Spring을 사용하여 Java 웹 응용 프로그램간에 비즈니스 객체 인스턴스를 공유하는 가장 좋은 방법은 무엇입니까?

SPRING

JBoss와 Spring을 사용하여 Java 웹 응용 프로그램간에 비즈니스 객체 인스턴스를 공유하는 가장 좋은 방법은 무엇입니까?

우리는 현재 비즈니스 객체, DAO 객체 및 Hibernate 스택을 인스턴스화하는 Spring 애플리케이션 컨텍스트를로드하는 웹 애플리케이션을 가지고있다. 동일한 객체를 여러 인스턴스로 사용하지 않으려면이 스택을 다른 웹 응용 프로그램과 공유하고 싶습니다.

우리는 몇 가지 접근 방식을 살펴 보았습니다. JMX 또는 JNDI를 사용하거나 EJB3를 사용하여 객체를 노출합니다.

서로 다른 접근법에는 모두 문제가 있으며 가벼운 방법을 찾고 있습니다.

이 문제를 해결하는 방법에 대한 제안?

편집 : 나는 약간을 정성 들일 것을 요구하는 코멘트를 받았다, 그래서 여기에 간다 :

우리가 해결하고자하는 주된 문제는 Hibernate 인스턴스를 하나만 가지기를 원한다는 것입니다. 이는 동일한 데이터 소스로 작업하는 여러 클라이언트 응용 프로그램을 실행할 때 Hibernate의 2 차 레벨 캐시가 무효 화되는 문제 때문에 발생합니다. 또한 비즈니스 / DAO / Hibernate 스택은 다소 커지기 때문에 중복되지 않는 것이 더 합리적입니다.

먼저, 비즈니스 레이어만으로도 다른 웹 애플리케이션에 어떻게 노출 될 수 있는지 살펴 보았습니다. Spring은 적은 양의 XML 가격으로 JMX를 래핑합니다. 그러나 JMX 엔티티를 JNDI 트리에 바인딩 할 수 없어서 웹 응용 프로그램에서 객체를 조회 할 수 없었습니다.

그런 다음 비즈니스 계층을 JNDI에 직접 바인딩했습니다. Spring은 이것에 대한 어떤 메소드도 제공하지 않았지만, JNDITemplate을 사용하여 바인딩했다. 하지만 이로 인해 몇 가지 새로운 문제가 발생했습니다. 1) 보안 관리자가 RMI 클래스 로더에 대한 액세스를 거부 했으므로 JNDI 자원에 대한 메소드를 호출하려고 시도한 후에 클라이언트가 실패했습니다. 2) 보안 문제가 해결되면 JBoss는 IllegalArgumentException을 throw합니다. object가 선언 클래스의 인스턴스가 아닙니다. 약간의 독서를 통해 우리는 JNDI 자원에 대한 스텁 구현이 필요하다는 것을 알았지 만, 이것은 많은 번거 로움처럼 보입니다 (아마도 Spring이 도움이 될 수 있습니까?).

우리는 아직 EJB를 너무 많이 보지 않았지만, 처음 두 번 시도한 후에 우리가 달성하고자하는 것이 가능한지 궁금합니다.

우리가 성취하고자하는 것을 요약하면 : 하나의 JBoss 인스턴스, DAO 레이어와 Hibernate 위에 하나의 비즈니스 객체 스택을 사용하는 여러 웹 어플리케이션.

친애하는,

닐스

해결법

  1. ==============================

    1.웹 응용 프로그램이 동일한 서버에 배포됩니까?

    웹 응용 프로그램이 동일한 서버에 배포됩니까?

    Spring에서는 말할 수 없지만 Session Beans를 사용하여 비즈니스 로직을 EJB 계층으로 이동하는 것은 간단합니다.

    신청 조직은 간단합니다. Logic은 Session Beans에 들어가며, 이러한 Session Beans는 하나의 jar 파일 안에 ejb-jar.xml 파일로 Java EE 아티팩트로 묶입니다 (EJB3에서는 거의 비어있을 것입니다).

    그런 다음 Entity 클래스를 별도의 jar 파일로 묶습니다.

    그런 다음 각 웹 앱을 자체 WAR 파일로 빌드합니다.

    마지막으로, 모든 jar 및 war는 Java EE EAR에 관련 application.xml 파일과 함께 번들로 제공됩니다 (EAR에서 jar 파일을 열거 함).

    이 EAR은 앱 서버에 도매로 배포됩니다.

    각각의 WAR는 자신의 세션, 자신의 컨텍스트 경로 등을 효과적으로 독립적입니다. 그러나 공통된 EJB 백엔드를 공유하기 때문에 두 번째 레벨 캐시는 하나 밖에 없습니다.

    또한 EJB가 동일한 서버에 있기 때문에 로컬 참조와 호출 시맨틱을 사용하여 EJB와 통신한다. 여기에 원격 호출이 필요 없습니다.

    저는 이것이 여러분이 가지고있는 문제를 아주 잘 해결한다고 생각합니다. EJB 3를 사용하는 Java EE 5에서는 매우 간단합니다.

    또한 이해할 수있는 것처럼 많은 일을 위해 Spring을 사용할 수는 있습니다. 그러나 저는 Spring 담당자가 아니므로 세부 사항을 말할 수는 없습니다.

  2. ==============================

    2.spring parentContext는 어떻습니까? 이 기사를 확인하십시오.

    spring parentContext는 어떻습니까? 이 기사를 확인하십시오.

    http://springtips.blogspot.com/2007/06/using-shared-parent-application-context.html

  3. ==============================

    3.테라코타는 여기에 적합 할 수 있습니다 (공개 : 저는 테라코타 개발자입니다). 테라코타는 JVM 수준에서 투명하게 Java 객체를 클러스터링하고 Spring 및 Hibernate와 통합됩니다. 그것은 자유롭고 오픈 소스입니다.

    테라코타는 여기에 적합 할 수 있습니다 (공개 : 저는 테라코타 개발자입니다). 테라코타는 JVM 수준에서 투명하게 Java 객체를 클러스터링하고 Spring 및 Hibernate와 통합됩니다. 그것은 자유롭고 오픈 소스입니다.

    앞에서 말했듯이, L2 캐시를 사용하는 둘 이상의 클라이언트 웹 앱의 문제점은 이러한 캐시를 동기화 상태로 유지하는 것입니다. Terracotta를 사용하면 하나의 최대 절전 모드 L2 캐시를 클러스터링 할 수 있습니다. 각 클라이언트 노드는 클러스터 된 캐시 사본과 함께 작동하며 테라코타는이를 동기화 상태로 유지합니다. 이 링크는 더 많은 것을 설명합니다.

    비즈니스 객체의 경우 Terracotta의 Spring 통합을 사용하여 Bean을 클러스터링 할 수 있습니다. 각 웹 응용 프로그램은 클러스터 된 Bean 인스턴스를 공유 할 수 있으며 Terracotta는 클러스터 된 상태를 투명하게 유지합니다.

  4. ==============================

    4.사실, 가벼운 솔루션이 필요하고 트랜잭션이나 클러스터링이 필요하지 않은 경우 RMI 용 Spring 지원을 사용하십시오. 최신 버전의 간단한 어노테이션을 사용하여 Spring 빈을 원격으로 노출 할 수 있습니다. http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html을 참조하십시오.

    사실, 가벼운 솔루션이 필요하고 트랜잭션이나 클러스터링이 필요하지 않은 경우 RMI 용 Spring 지원을 사용하십시오. 최신 버전의 간단한 어노테이션을 사용하여 Spring 빈을 원격으로 노출 할 수 있습니다. http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html을 참조하십시오.

  5. ==============================

    5.Terracotta Reference Web Application - Examinator를 살펴보아야합니다. 그것은 당신이 찾고있는 대부분의 구성 요소를 가지고 있습니다. 그것은 MySQL 백엔드가있는 Hibernate, JPA, Spring을 가지고 있습니다.

    Terracotta Reference Web Application - Examinator를 살펴보아야합니다. 그것은 당신이 찾고있는 대부분의 구성 요소를 가지고 있습니다. 그것은 MySQL 백엔드가있는 Hibernate, JPA, Spring을 가지고 있습니다.

    최대 16 개의 노드, 20,000 명의 동시 사용자를 확장 할 수 있도록 미리 튜닝되었습니다.

    그것을 여기에서 조사해라 : http://reference.terracotta.org/examinator

  6. ==============================

    6.지금까지 답변 해 주셔서 감사합니다. 우리는 여전히 그곳에는 아직 가지 못했지만, 우리는 지금 몇 가지 시도를하고 더 명확하게 일들을 보았습니다. 다음은 간단한 업데이트입니다.

    지금까지 답변 해 주셔서 감사합니다. 우리는 여전히 그곳에는 아직 가지 못했지만, 우리는 지금 몇 가지 시도를하고 더 명확하게 일들을 보았습니다. 다음은 간단한 업데이트입니다.

    가장 실용적인 솔루션은 EJB입니다. 그러나 이렇게하려면 코드에 약간의 변경이 필요하므로 지금 당장은 해당 솔루션을 완전히 구현하지 않을 것입니다. 나는 우리가 여기서 우리를 돕기 위해 Spring 기능을 찾을 수 없었던 것에 거의 놀랐다.

    우리는 또한 모든 공유 인터페이스에 대한 스텁의 필요성으로 끝나는 JNDI 경로를 시도했습니다. 이것은 모든 것이 어쨌든 동일한 서버에 있다는 것을 고려하면 많은 번거 로움처럼 느껴집니다.

    어제 우리는 JMX로 작은 휴식을 취했습니다. JMX는 이런 종류의 사용을위한 것이 아닙니다. 코드 변경이나 XML의 최소화 (MBeanExporter 및 MBeanProxyFactoryBean에 대한 큰 감사의 표시)를 통해 이것이 가능하다는 것을 입증했습니다. 이 방법의 가장 큰 단점은 성능과 도메인 클래스가 JBoss의 server / lib 폴더를 통해 공유되어야한다는 사실입니다. 즉, WAR에서 몇 가지 종속성을 제거하고이를 server / lib로 이동해야합니다. 그렇지 않으면 비즈니스 계층에서 자체 도메인 모델의 객체를 반환 할 때 ClassCastException이 발생합니다. 나는 이것이 왜 일어나는지를 완전히 이해하지만, 우리가 성취하고자하는 것에 이상적이지 않습니다.

    나는 그것이 가장 좋은 해결책 인 것처럼 보이기 때문에 약간의 업데이트가 필요할 것이라고 생각했다. 우리가 그 일을 끝내면 여기에 결과를 게시 할 것입니다.

  7. ==============================

    7.Spring은 EJB 3 injection nterceptor와 같은 통합 포인트를 가지고 있습니다. 이렇게하면 EJB에서 스프링 빈에 액세스 할 수 있습니다.

    Spring은 EJB 3 injection nterceptor와 같은 통합 포인트를 가지고 있습니다. 이렇게하면 EJB에서 스프링 빈에 액세스 할 수 있습니다.

  8. ==============================

    8.나는 정말로 당신이 해결하려고하는 것이 확실하지 않습니다. 결국 각 jvm은 객체의 복제 된 인스턴스 또는 다른 (논리) 서버에있는 객체를 나타내는 스텁을 복제합니다.

    나는 정말로 당신이 해결하려고하는 것이 확실하지 않습니다. 결국 각 jvm은 객체의 복제 된 인스턴스 또는 다른 (논리) 서버에있는 객체를 나타내는 스텁을 복제합니다.

    두 개의 웹 앱에서 호출 할 수있는 원격 API가있는 세 번째 '비즈니스 로직'서버를 설정할 수 있습니다. 전형적인 해결책은 EJB를 사용하는 것이지만, 스프링에는 원격 옵션이 스택에 내장되어 있다고 생각합니다.

    다른 옵션은 공유 캐시 아키텍처의 일부 형식을 사용하는 것인데 ... 서버 간의 개체 변경을 동기화하지만 여전히 두 세트의 인스턴스가 있습니다.

  9. ==============================

    9.JBossCache를 살펴보십시오. 여러 개의 JVM 인스턴스 (동일한 박스 또는 다른 서버)간에 데이터 맵을 쉽게 공유 / 복제 할 수 있습니다. 사용하기 쉽고 유선 수준 프로토콜 옵션 (TCP, UDP 멀티 캐스트 등)이 많이 있습니다.

    JBossCache를 살펴보십시오. 여러 개의 JVM 인스턴스 (동일한 박스 또는 다른 서버)간에 데이터 맵을 쉽게 공유 / 복제 할 수 있습니다. 사용하기 쉽고 유선 수준 프로토콜 옵션 (TCP, UDP 멀티 캐스트 등)이 많이 있습니다.

  10. from https://stackoverflow.com/questions/268129/whats-the-best-way-to-share-business-object-instances-between-java-web-apps-usi by cc-by-sa and MIT license