2014-10-14 6 views
0

내가했던 다음과 같은 몇 가지 요청이 일부 엔티티와 수정이 수행 될 때까지 블록 (클라이언트 측 변경 사항을 통지하는) 것을 요청Playframework 1.2. * EventStream, @PostUpdate 및 @PostPersist

수정을 허용하는 응용 프로그램이 :

@Entity 
class TheEntity extends Model { 

    public static Collection<TheEntity> getLastEntities(after) { 
     //finds the entities where the `lastUpdateTimestamp` is greater than `after` 
     return TheEntity.find("byLastUpdateTimestampGreaterThan", after).fetch(); 
    } 

    @PostUpdate 
    @PostPersist 
    private void notifyChannel() { 
     lastUpdateTimestamp = System.currentTime(); 
     Job asyncNotifier = new Job() { 
      @Override 
      public void doJob() throws Exception { 
       //we manage the updates. the message channel trigs the channel 
       MyChannel.publish(AcEvent.this); 
      } 

     }; 
     asyncNotifier.now(); 
    } 
} 

는 지금, 나는하지 않습니다 채널 사실

public static void listenMessageUpdate(Long after,Long blockDuration) { 
    Collection<TheEntity> evts = MyChannel.getLast(after); 
    if (evts.isEmpty()) { 
     Timeout timeout = F.Timeout(blockDuration*1000); 
     Promise<TheEntity> nextFlt = MyChannel.nextEvent(); 
     Either<Timeout, TheEntity> await = await(F.Promise.waitEither(
       timeout, nextFlt)); 

     evts = TheEntity.getLastEntities(after); 
    } 
    renderJSON(TheEntity.toJson(evts)); 
} 

수신 컨트롤러, (후) TheEntity.getLastEntities이 최근에 수정되거나 생성 된 요소를 PROD 모드로 반환합니다.

조사 후, 트랜잭션이 eventstream은,이 앞을 통지 할 때, 기업이 가장 좋은 방법은 각 엔티티 수정에 통보하는 것입니다 무엇 DB

날짜까지없는 노력되지 않는 이유는 무엇입니까?

+0

당신이'asyncNotifier.now()를 변경할 수있는 유용한 필드와 함께 IO 구조를 통과해야,'asyncNotifier.in'에 (5)'당신은 작업 초기화에게 사실 – hgoz

+0

@hzog을 지연시킬 수 있도록 그것은 아주 나쁜 생각입니다. 프로덕션 모드에서 postgresql을 사용할 때이 비 결정적 오류가 발생했습니다 : 2014-11-29 18:46 : 04,239 오류 ~ 어설 션 오류가 발생했습니다 (이것은 Hibernate의 버그를 나타낼 수 있지만 안전하지 않은 세션 사용) 마지막으로 _PostUpdate_ annotation 주석을 삭제하고 save 메소드를 대체하여 notifyChannel()을 호출합니다. –

답변

0

문제는 AcEvent.this 세션 + 거래 내부 실체, 라인 사실 MyChannel.publish(AcEvent.this);

입니다. listenMessageUpdate은 다른 세션 + 트랜잭션에 속하므로 액세스가 결정적이지 않습니다. 해결책은 엔티티가 아닌 것을 게시하는 것입니다. 플러시되지 않았으므로 ID가 될 수 없습니다 (listenMessageUpdate이 실행될 때 트랜잭션이 커밋되지 않음).

우리는