Domanda

Ho notato errori nel mio registro di Google App Engine durante l'analisi dei messaggi. La traccia dello stack non era inutile per diagnosticare il problema, quindi ho scritto un piccolo dumper ispirato all'implementazione di Google di InboundMessageParser.

public class ChatRequestParser extends HttpRequestParser {

    public static Map<String, String> parseMessage(HttpServletRequest request)
    throws IOException {
        try {
            Map<String, String> message = new HashMap<String, String>();
            MimeMultipart multipart = parseMultipartRequest(request);
            int parts = multipart.getCount();
            for (int i = 0; i < parts; i++) {
                BodyPart part = multipart.getBodyPart(i);
                String fieldName = getFieldName(part);
                String fieldValue = getTextContent(part);
                message.put(fieldName, fieldValue);
            }
            return message;
        } catch (MessagingException ex) {
            throw new IOException("Could not parse incoming request.", ex);
        }
    }

}

Ho scoperto che Google+ invia due messaggi per ogni messaggio, solo uno dei quali contiene un corpo (Gmail Talk Client invia solo un messaggio).

Ecco il primo messaggio, senza un corpo:

{to=xxx@appspot.com, stanza=<message to="xxx@appspot.com" type="chat"
from="yyy@gmail.com/TalkGadgetD9F45A83" xmlns="jabber:client">
<cha:composing xmlns:cha="http://jabber.org/protocol/chatstates"/>
<nos:x value="disabled" xmlns:nos="google:nosave"/>
<arc:record otr="false" xmlns:arc="http://jabber.org/protocol/archive"/>
</message>, from=yyy@gmail.com/TalkGadgetD9F45A83}

E il secondo è (il mio carico utile è molti asterischi, le mail sono cambiate):

{to=xxx@appspot.com, body=**********************************, 
stanza=<message to="xxx@appspot.com" type="chat" 
id="7279D79D0.17809585028724073_:sl" from="yyy@gmail.com/TalkGadgetD9F45A83"
xmlns="jabber:client"><body>**********************************</body>
<cha:active xmlns:cha="http://jabber.org/protocol/chatstates"/>
<nos:x value="disabled" xmlns:nos="google:nosave"/><arc:record otr="false"
xmlns:arc="http://jabber.org/protocol/archive"/></message>,
from=yyy@gmail.com/TalkGadgetD9F45A83}

Dal momento che il primo messaggio non ha un corpo che chiama ParseMessage () su XMPPService lancia un'eccezione. Qualcuno ha notato questo problema?

Ora sto catturando illegalargumentException e sto buttando via messaggi insignificanti, ma il vero problema è quello La risposta al messaggio valido non risale a Google+ Cliente, mentre lavora perfettamente con Gmail e anche con il mio client Jabber su Linux.

Ho archiviato Numero 6467.

È stato utile?

Soluzione

Posso riprodurre l'incidente quando non è impostato alcun corpo e viene chiamato parsemessage e lo sto aggiustando. Grazie per averlo trovato!

Tuttavia, non riesco a reprimere il bug "Invia risposta non funziona". Ho un codice come questo:

  XMPPService xmpp = XMPPServiceFactory.getXMPPService();
  Message message = xmpp.parseMessage(req);
  Message reply = new MessageBuilder().withFromJid(message.getRecipientJids()[0])
    .withRecipientJids(message.getFromJid())
    .withBody("Back at you!")
    .build();
  xmpp.sendMessage(reply);

E ricevo la risposta sia in Google+ che in Gmail. Cosa stai facendo diversamente?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top