2011-07-26 3 views
1

분위기 0.7.2를 사용하여 내 브로드 캐스트 범위를 제한하는 데 문제가 있습니다.대기 요청 범위가 지정된 브로드 캐스트

나는 open 방법을 사용하여 저지 POJO를 보유하고 있으며 방송사를 비 웹 서비스 클래스로 전달하려고합니다. 이는 WAR과 EJB 계층을 분리 할 수있게 해줍니다.

@Path("/") 
public class MyJerseyPojo { 
    @Context 
    private Broadcaster broadcaster; 

    @GET 
    @Suspend 
    public String open() { 
     Manager.register(/* Session ID */, new NonWebservice(this.broadcaster)); 
     return ""; 
    } 
} 

public class NonWebService implements Sender { 
    private Broadcaster broadcaster; 

    public NonWebService(Broadcaster b) { 
     this.broadcaster = b; 
    } 

    @Override 
    public void send(String thing) { 
     this.broadcaster.broadcast(thing); 
    } 
} 

아이디어는 해당 업데이트 이벤트가 send를 호출하고,이 일시 중단 된 응답으로 클라이언트에 통지합니다. 각 클라이언트는 별도의 방송사와 연결되어야합니다.

문제는이 솔루션이 모든 클라이언트에 대해 동일한 브로드 캐스터를 사용한다는 것입니다. 을 open 메서드에 추가하려고 시도했지만 브로드 캐스트 메시지가 수신되지 않습니다.

@GET 
@Suspend 
public String open() { 
    Broadcaster b = BroadcasterFactory.getDefault().get(JerseyBroadcaster.class, UUID.randomUUID()); 
    b.setScope(Broadcaster.SCOPE.REQUEST); 
    Manager.register(/* Session ID */, new NonWebservice(b)); 
} 

이 작동하지 않았다, 중 @Suspend 또는 @Suspend(scope = Suspend.SCOPE.REQUEST)를 사용하여 :

은 또한하여 open 방법으로 다음과 같은 노력했다. 각각의 경우 클라이언트는 브로드 캐스트 메시지를받지 못했습니다. 방송사가 파괴되어 사용할 수 없다는 메시지를 한 번 들었지만 어떻게했는지 기억이 안납니다!

나는 AtmosphereHandler을 확장하지 않으므로 similar question을 보았지만 POJO로 변환하는 방법을 모르겠습니다.

감사

답변

0

사실, 결국 I 내 일시 중지 된 방법에서 브로드 캐스터 블을 반환해야한다는 것을 알았습니다. 브로드 캐스터는 세션 범위로 재생성되었지만 나중에 방송 할 수 있도록 유지되었습니다. 일시 중지 된 메소드가 반환 될 때까지 아무것도 브로드 캐스트하지 않도록하십시오. 그러면 메소드가 손실 될 수 있습니다.

1

내 open() 메서드가 완료된 후 AtmosphereFilter가 새로운 요청 범위의 방송을 만드는 한 것처럼, 그것은 캐시 방송사에없는 안전 것을, 파고의 많은 후, 밝혀졌습니다.

는 따라서 NonWebservice 클래스에서 이제 다음과 같습니다

이제
public class NonWebService implements Sender { 
    private Class<? extends Broadcaster> clazz; 
    private Object broadcasterId; 

    public NonWebService(Class<? extends Broadcaster> clazz, Object broadcasterId) { 
     this.clazz = clazz; 
     this.broadcasterId = broadcasterId; 
    } 

    @Override 
    public void send(String thing) { 
     Broadcaster b = BroadcasterLookup.getDefault().get(this.clazz, this.broadcasterId); 
     b.broadcast(thing); 
    } 
} 

내가 요청 범위의 고정 방송을 예약하는 방법을 알아내는와 함께 할 수있는 ...

관련 문제