Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android web服务内部的GCM应用服务器_Android_Web Services_Google Cloud Messaging - Fatal编程技术网

Android web服务内部的GCM应用服务器

Android web服务内部的GCM应用服务器,android,web-services,google-cloud-messaging,Android,Web Services,Google Cloud Messaging,我创建了一个Android应用程序,允许用户向其他用户发送消息。为了实现这一点,我使用了GCM。因此,用户可以使用使用web API框架开发的web服务发送消息,该服务将消息保存在远程数据库SQL Server上,并与GCM服务器联系,以便将GCM消息传递给收件人 例如,由于GCM服务器暂时不可用,可能无法收到发送给GCM的消息。因此谷歌建议尝试使用指数退避重新发送。这是我的体系结构的一个问题,因为我从另一个WS中调用GCM,这是我创建的WS,用于从用户向其他用户发送消息。如果我尝试使用expo

我创建了一个Android应用程序,允许用户向其他用户发送消息。为了实现这一点,我使用了GCM。因此,用户可以使用使用web API框架开发的web服务发送消息,该服务将消息保存在远程数据库SQL Server上,并与GCM服务器联系,以便将GCM消息传递给收件人

例如,由于GCM服务器暂时不可用,可能无法收到发送给GCM的消息。因此谷歌建议尝试使用指数退避重新发送。这是我的体系结构的一个问题,因为我从另一个WS中调用GCM,这是我创建的WS,用于从用户向其他用户发送消息。如果我尝试使用exponensial后退,我的外部WS应该处于活动状态,因为GCM返回有效响应


所以,从另一个web服务内部调用GCMWeb服务似乎不是一件好事。是这样吗?你能给我一些建议吗?使用GCM的IM应用程序最常见的体系结构是什么?

在我看来,您的问题在于向GCM发送消息的web服务是同步的,至少基于您的问题,我认为是同步的。即,它从您的客户端接收请求,向GCM服务器发送请求,并在从GCM服务器获得响应后向您的客户端返回响应

我建议你改变架构。您的web服务应该接收来自客户端的消息,将其存储在数据库中,并向客户端返回响应


服务器中的单独线程应该定期唤醒,查看数据库中是否有任何挂起的消息,并尝试将它们发送到GCM服务器。如果您从GCM收到一个错误,表明您应该稍后重试,那么您可以使用下一次发送尝试的时间戳更新数据库中的消息,并根据指数退避要求设置时间戳。如果您从GCM获得成功响应,您将从数据库中删除该消息。

谢谢@Eran。但是,使用周期性唤醒系统并不能使我的系统接近即时消息应用程序所要求的实时性。@Joseph82周期性唤醒不需要很长时间。它可能会每秒唤醒一次,检查是否有任何挂起的消息要发送到GCM服务器。如果希望减少延迟,可以在从客户端获取消息的web服务中执行第一次传递尝试,并且仅在必要时在单独的线程中重试。我认为这个解决方案不那么优雅,但它仍然有效。当然@Eran,但是安排一个非常频繁的工作我认为这不是一个好主意。SQL代理作业调度器本身非常轻,SQL Server本机支持的最小间隔为1分钟。如果您的目标是让作业尽快响应新文件,则将计划设置为每1分钟运行一次。