2011-10-05 5 views
4

CometD를 사용하는 Java 웹 응용 프로그램이 있습니다. 작업 흐름은 간단합니다.자바 가입자가 소비 할 수있는 CometD Java 클라이언트를 사용하여 메시지 게시

  1. "/ service/hello"채널에서 메시지를 수신 할 때 작동하는 서비스를 정의했습니다. 이 서비스는 "name"매개 변수를 필요로합니다. 이를 기반으로 "/"+message.getDataAsMap().get("name")이라는 이름의 채널이 생성됩니다. 이 채널에는 모든 가입자에게 메시지를 다시 전송하는 콜백 메소드가 연결됩니다.
  2. Javascript 클라이언트 (dojo 사용)는 "/ service/hello"채널에 메시지를 게시하고 이름이 인 채널을 "/ service/hello"as 매개 변수에 등록합니다. 예를 취할 수 있습니다 :
.... 
    cometd.subscribe('/1234', function(message) 
    { 
        //do smth on message received; 
    }); 

    cometd.publish('/service/hello', { name: '1234' }); 
.... 

이 잘 작동합니다. 이제 Javascript 클라이언트를 구독자로 만 게시하고 게시를 수행하는 Java 클라이언트를 갖기를 원합니다. Java 클라이언트 API 용 CometD2 설명서에 제공된 예제를 사용하여이 방법을 시도했지만 예상대로 작동하지 않습니다. 서비스가 호출 된 것 같지만 메시지는 Javascript 소비자에게 표시되지 않습니다.

이것을 달성 할 수 있습니까? 무엇이 잘못되었는지에 대한 아이디어가 있습니까? 감사. 여기

서버 측 코드 :

공용 클래스의 HelloService는 { 공공의 HelloService (BayeuxServer 바 이외) { 슈퍼 (베 이유, "안녕하세요") AbstractService 확장; addService ("/ service/hello", "processHello"); }

public void processHello(ServerSession remote, Message message) 
{ 
    Map<String, Object> input = message.getDataAsMap(); 
    String name = (String)input.get("name"); 
    String channelId = "/"+name; 
    addService(channelId, "processId"); 
    processId(remote, message); 

} 

public void processId(ServerSession remote, Message message) 
{ 
    Map<String, Object> input = message.getDataAsMap(); 
    String name = (String)input.get("name"); 
    int i = 0; 
    Map<String, Object> output = new HashMap<String, Object>(); 
    while(i<1){ 
     i++; 
     output.put("greeting", "Hello, " + name); 
     remote.deliver(getServerSession(), "/"+name, output, null); 
     try { 
      Thread.sleep(1000);    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace();   } 
    } 
} } 
+0

서버 측 코드를 게시 할 수 있습니까? – perissf

+0

서버 쪽 코드를 추가했습니다. 필자의 경우에 맞춰진 cometd 문서 페이지의 것입니다. – mihaela

답변

3

remote.deliver()는 서비스 채널에 게시 remote 세션 (즉, 클라이언트)에 "답"을 보냅니다.

요청하지 않은 메시지는 일반 채널 (서버 쪽에서 아직 존재하지 않음)에 게시해야합니다. 따라서, 다음과 같이 작성하십시오.

String channelName = "whatever - not beginning with /service"; 
getBayeux().createIfAbsent(channelName); 
getBayeux().getChannel(channelName).publish(getServerSession(), output, null); 
+0

감사합니다. 그것은 효과가있다! – mihaela