내가했던 다음과 같은 몇 가지 요청이 일부 엔티티와 수정이 수행 될 때까지 블록 (클라이언트 측 변경 사항을 통지하는) 것을 요청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
날짜까지없는 노력되지 않는 이유는 무엇입니까?
당신이'asyncNotifier.now()를 변경할 수있는 유용한 필드와 함께 IO 구조를 통과해야,'asyncNotifier.in'에 (5)'당신은 작업 초기화에게 사실 – hgoz
@hzog을 지연시킬 수 있도록 그것은 아주 나쁜 생각입니다. 프로덕션 모드에서 postgresql을 사용할 때이 비 결정적 오류가 발생했습니다 : 2014-11-29 18:46 : 04,239 오류 ~ 어설 션 오류가 발생했습니다 (이것은 Hibernate의 버그를 나타낼 수 있지만 안전하지 않은 세션 사용) 마지막으로 _PostUpdate_ annotation 주석을 삭제하고 save 메소드를 대체하여 notifyChannel()을 호출합니다. –