Google Cloud Messanger,“比预期的更多”

时间:2014-10-09 01:47:49

标签: java spring google-cloud-messaging

每隔一段时间我就会从客户端收到服务器上的消息,如下所示:

INCOMING MESSAGE!!!!!!!!!!!!
<message id='2u650-31' to='xxxxxxxxxxx@gcm.googleapis.com/Smack0152E3A3' type='error'><error type="cancel"><not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><text xml:lang="en" xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">Received more acks than expected.</text></error><gcm xmlns="google:mobile:data">{&quot;to&quot;:&quot;ClientsRegistrationIDGoesHere&quot;,&quot;message_id&quot;:&quot;1054919404&quot;,&quot;message_type&quot;:&quot;ack&quot;}</gcm></message>
GCM PACKET
com.bannervision.web.controller.admin.SmackCcsClient$GcmPacketExtension@6454f46b
JSON
{"to":"ClientsRegistrationIDGoesHere","message_id":"1054919404","message_type":"ack"}

在出现此错误后,我得到一个如下所示的堆栈跟踪:

WARNING: Not connected anymore, echo message is not sent
org.jivesoftware.smack.SmackException$NotConnectedException
    at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:584)
    at com.bannervision.web.controller.admin.SmackCcsClient.send(SmackCcsClient.java:106)
    at com.bannervision.web.controller.admin.SmackCcsClient.sendDownstreamMessage(SmackCcsClient.java:84)
    at com.bannervision.web.controller.admin.SmackCcsClient.handleUpstreamMessage(SmackCcsClient.java:228)
    at com.bannervision.web.controller.admin.SmackCcsClient$2.processPacket(SmackCcsClient.java:409)
    at org.jivesoftware.smack.XMPPConnection$ListenerWrapper.notifyListener(XMPPConnection.java:1233)
    at org.jivesoftware.smack.XMPPConnection$ListenerNotification.run(XMPPConnection.java:1143)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

Oct 08, 2014 10:36:01 PM com.bannervision.web.controller.admin.SmackCcsClient$2 processPacket
SEVERE: Failed to process packet
org.jivesoftware.smack.SmackException$NotConnectedException
    at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:584)
    at com.bannervision.web.controller.admin.SmackCcsClient.send(SmackCcsClient.java:106)
    at com.bannervision.web.controller.admin.SmackCcsClient$2.processPacket(SmackCcsClient.java:415)
    at org.jivesoftware.smack.XMPPConnection$ListenerWrapper.notifyListener(XMPPConnection.java:1233)
    at org.jivesoftware.smack.XMPPConnection$ListenerNotification.run(XMPPConnection.java:1143)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

弹出的错误似乎没有影响其他任何东西,一切都在继续发送和进入,但在此错误开始弹出后,它将每5秒继续。

问题 我如何捕获此错误?该错误仅出现在xml中。这不应该被认为是一个nack消息吗? 要么 更好但我该如何预防呢?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这些错误肯定是相关的。我的问题是我每次发送消息时都在调用连接。之所以发生这种情况,是因为我替换了Google的main方法,并且没有在编译时形成连接,而是在send上建立连接。

我添加了这个(@PostConstruct特定于spring):

@PostConstruct
    public void init() throws Exception{
        try {
            smackCcsClient.connect(Long.parseLong(env.getProperty("gcm.api")), env.getProperty("gcm.key"));
        }catch (IOException e ){
            e.printStackTrace();
        }catch(SmackException e){
            e.printStackTrace();
        }catch(XMPPException e){
            e.printStackTrace();
        }
    }

然后再也不要再联系。使用唯一的其他时间连接是接受消息。所有发送消息都使用相同的连接。这是我代表的主要网站。

相关问题