2011-12-20 2 views
0

~ 50 명의 사용자가있는 애플리케이션을 만들었습니다. 채널 API를 사용하려고하는데 메시지를 보낼 때 테스트하는 동안 문제가 발생했습니다. 사용자가 동일한 인터페이스로 여러 개의 탭을 열고 만료시 토큰을 재설정하는 서블릿이있는 경우 동일한 토큰을 사용할 수 있도록 토큰을 데이터베이스에 저장합니다.앱 엔진 채널 배포

응용 프로그램을 다시 배포하거나 응용 프로그램의 버전을 변경하기 전까지는 문제가 없습니다. 메시지 수신을 중단합니다. 이전 앱 버전 토큰이있는 채널을 열려고하면 오류가 발생하지 않지만 열면 해당 채널에서 메시지가 수신되지 않습니다.
토큰을 다시 설정하면 다시 작동합니다.

누구든지이 버그에 대한 해결책을 알고 있습니까? 나는 사람들을 일하는 동안 자주 배치하므로 무시할 수 없다.

가장 좋은 추측은 ChannelServiceFactory.getChannelService()ChannelService의 다른 인스턴스를 반환하므로 channelService.sendMessage("id","message");을 호출하면이를 다른 채널로 보냅니다.

+1

여러 탭에서 동일한 채널을 사용하면 효과가 없습니다. 한 번에 하나의 클라이언트 만 각 채널에 연결해야합니다. –

답변

1

저장 한 토큰이 앱을 다시 배포 할 때 작동하지 않는 이유를 설명 할 수는 없지만 버전을 변경할 때 왜 작동하지 않는지 설명 할 수 있습니다. 간단히 말해서 토큰은 앱 버전에만 해당됩니다.

먼저, 다른 데이터를 보내거나 메시지 형식을 변경하거나 다른 버전의 메시지를 보내지 않는 응용 프로그램이 버전 경계를 넘어 메시지를 보내지 않도록해야합니다. v2에서 서블릿에 대한 v1 렌더링에서 자바 스크립트 번들을 원하지 않는 것과 같은 방식으로, v1에서 v2 서블릿으로 메시지를 수신하는 자바 스크립트 메시지 핸들러를 원하지 않을 것이다 (또는 그 반대).

그래서, 잘하면 무슨 일이 일어나고 있는지 분명히 만들려면 :

채널은 당신이 createChannel 또는 sendMessage 첨부를 호출 할 때 제공하여 APPID, 앱 버전, 클라이언트 ID의 조합에 의해 확인된다. 채널 API의 구현은 appid/clientid -> token의 매핑을 저장하지 않습니다. 크게 간소화하기 위해이 같은 일을 같은 createChannel 생각할 수 :

public String createChannel(clientid) { 
    // obviously we don't really just append strings to each other for actual implementation. 
    return encryptStringSomehow(clientid + globalAppInfo.version + globalAppInfo.appid); 
} 

및 sendMessage 첨부는 다음과 같이이다 :

public void sendMessage(clientid, message) { 
    // identify the JID used for this channel. 
    JID xmppJid = new JID(mutateString(clientid + globalAppInfo.version + globalAppInfo.appid), 
         CHANNEL_XMPP_DOMAIN); // some domain used for channel messages 
    // send the <message> stanza to that jid with the application message as the body 
    xmppService.sendMessage(xmppJid, encodeSomehow(message)); 
} 

및 클라이언트 측에서

이 채널에 대한 책임을 서블릿이 토큰을 해독 sendMessage 기능과 동일한 메소드로 작성된 JID로 식별되는 엔드 포인트에 바인드합니다.

토큰은 토큰이 해당 토큰을 만든 앱의 동일한 버전에서 보낸 메시지에만 유효합니다.