Java 谷歌云Messanger,“比预期更多的ACK”
每隔一段时间,我就会在服务器上从客户端收到一条类似以下内容的消息:Java 谷歌云Messanger,“比预期更多的ACK”,java,spring,google-cloud-messaging,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"/>&
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">{"to":"ClientsRegistrationIDGoesHere","message_id":"1054919404","message_type":"ack"}</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消息吗?
或
更好的是,我如何预防它
有什么想法吗?这些错误肯定是相关的。我的问题是,我每次发送消息时都在呼叫连接。这是因为我替换了Google的main方法,并没有在编译时形成连接,而是在发送时形成连接 我添加了这个@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();
}
}
然后再也不要给connect打电话了。唯一使用连接的其他时间是接受消息时。所有发送消息都使用相同的连接。这是一个代表我的网站的重大事件