2012-01-24 1 views
3

spring-jpa-hibernate로 구동되는 계층화 된 웹 응용 프로그램이 있으며 이제 elasticsearch (검색 엔진)를 통합하려고합니다.최대 절전 모드 이벤트를 수신 대기하는 모듈을 엔티티 자체에서 분리하는 방법은 무엇입니까?

내가하고 싶은 일은 모든 postInsert/postUpdate 이벤트를 캡처하여 해당 엔티티를 elasticindarch에 보내어 다시 인덱싱하도록하는 것입니다.

내가 직면 한 문제는 "dal-entities"프로젝트에 "search-indexer"에 대한 런타임 종속성이 있고 "search-indexer"에 "dal-entities"에 대한 컴파일 종속성이 있다는 것입니다. 다른 개체에 대해 다른 일을해야합니다.

"검색 인덱서"를 DAL의 일부로 생각했는데 (데이터에서 작업을 수행한다고 주장 할 수 있기 때문에) DAO 섹션의 일부 여야합니다.

나는 내 질문을 다음과 같이 바꿔 쓸 수 있다고 생각한다 : 어떻게 그것의 책임이 아니기 때문에 엔티티 프로젝트에서만 전적으로 캡슐화 될 수없는 최대 절전 이벤트 리스너에서 로직을 가질 수 있을까?

업데이트
DAL-기관 프로젝트는 인덱서에 의존하는 이유는 내가 obviousely DAL-기관에있는 JPA 상황에 대한 책임이 스프링 구성 파일의 수신기를 (구성 할 필요가 있다는 것입니다).
종속성은 컴파일 타임 범위가 아니라 런타임 범위입니다 (런타임에 최대 절전 모드 컨텍스트에 해당 수신기가 필요하기 때문에).

답변

1

답변은 인터페이스입니다.

다양한 클래스에 직접적으로 (어느 방향 으로든) 의존하지 않고 필요한 기능을 제공하는 인터페이스에 의존 할 수 있습니다. 이렇게하면 은 직접 클래스에 종속적이지 않고 대신 인터페이스에 의존하며 "dal-entities"에 필요한 인터페이스를 가질 수 있습니다. 예를 들어 dal-entities와 동일한 패키지에 있고 인덱서는 단순히 해당 인터페이스를 구현합니다.

것은이 완전히 종속성을 제거하지만, 않습니다는 커플 링의 당신에게 훨씬 덜 타이트을 제공하고 응용 프로그램에 좀 더 유연하게하지 않습니다.

이되는 것들에 대해 여전히 고민하는 경우에 너무 밀접하게 결합 또는 정말이 두 가지가 모두 원형 의존하지 않으려면, 나는 당신이 당신의 응용 프로그램 디자인을 다시 생각 건의 할 것입니다. 여기에 또 다른 질문을 던지십시오. 코드에 대한 자세한 내용과 더 잘 구조화 될 수있는 방법을 통해 디자인을 개선하는 방법에 대한 좋은 조언을 얻으실 수 있습니다.

+0

간단한 pojos에 대해서도 이것이 구성되어 있다고 생각하십니까? dal-entities는 이미 인덱서의 인터페이스에만 의존하고 있지만 인덱서는 구체적인 모델 인 pojos에 의존하기 때문에 여기서는 어떤 문제가 있습니다. 나는 인터페이스를 pojos에서도 사용하는 방법에 대해 생각했지만 그 방법이 확실하지 않았습니다. – Ittai

+0

_how_ (또는 _why_) 도메인 포지가 인덱서에 의존하는지 궁금합니다. 인덱서가 의존하는 것이 맞지만 다른 방법은 아닙니다. 도메인 클래스 샘플 (pojos)을 게시 할 수 있습니까? – cdeszaq

+0

더 많은 질문을 던지 셨습니다. 그렇습니다. 종속성을 제거해야하는 경우 인터페이스는 놀라 울 정도로 간단한 클래스에도 사용할 수 있습니다. 결국 Runable 인터페이스를 봐라. 단 하나의 메소드! – cdeszaq

0

하이버 네이트는 PostUpdateEventListener와 PostInsertEventListener를 지원한다. 여기

은 실체가 변경된 행동 다음과 같이 그 후 때

주요 개념을 찾을 수있는 귀하의 경우 스위트 수있는 good example이다.

public class ElasticSearchListener implements PostUpdateEventListener { 

@Override 
public void onPostUpdate(PostUpdateEvent event) { 
    if (event.getEntity() instanceof ElasticSearchEntity) { 
     callSearchIndexerService(event.getEntity()); 
     Or 
     InjectedClass.act(event.getEntity()); 
     Or 
     callWebService(InjectedClassUtility.modifyData(event.getEntity())); 

     ........ 
} 
} 

편집

당신이 프로젝트에서 분리하려는 클래스를 주입 고려해 봄을 사용하여 (즉, 논리를 보유).

다른 옵션은 코드에 종속되지 않는 외부 웹 서비스를 호출하는 것일 수 있습니다. 원래 프로젝트 개체 또는 유틸리티로 수정 된 개체를 elasticsearch에 맞게 전달합니다.

+0

감사합니다. 저는이 청취자에 대해 알고 있으며 현재 청취자를 사용하고 있습니다. 문제는 cdeszaq가 그것을 어떻게 인식했는지, 즉 엔티티 - 리스너 - 인덱서 간의 논리적 결합을 설계하는 방법에 관한 것입니다. – Ittai

+0

@ Ittai, 의견을 보내 주셔서 감사합니다. 내 대답이 바뀌 었습니다. 도움이되기를 바랍니다. –