0

我正在寻找一种方法来批处理我的 APN 有效负载并使用 JavaPNS 发送它们。GAE 不允许使用 JavaPNS 队列类(真可惜——我喜欢它!)。抛出异常(由于 GAE 中线程处理方式的限制,这是预期的):

Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
    at java.security.AccessController.checkPermission(AccessController.java:565)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.apphosting.runtime.security.CustomSecurityManager.checkPermission(CustomSecurityManager.java:56)
    at com.google.apphosting.runtime.security.CustomSecurityManager.checkAccess(CustomSecurityManager.java:131)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.ThreadGroup.checkParentAccess(ThreadGroup.java:135)
    at java.lang.ThreadGroup.<init>(ThreadGroup.java:117)
    at java.lang.ThreadGroup.<init>(ThreadGroup.java:96)
    at javapns.notification.transmission.NotificationThreads.<init>(NotificationThreads.java:150)
    at javapns.Push.queue(Push.java:234)
    ...

那么我的选择是什么?TaskQueue 和拉取队列听起来很有希望,但这需要后端应用程序类型,这使得它更加昂贵。是否可以在基于 GAE servlet 的应用程序中创建多个生产者、一个消费者模型?

4

2 回答 2

1

我假设您的主要目标是发送推送通知,JavaPNS 不一定是必需的。

你可以签出java-apns-gae

它是一个开源 Java APNS 库,专为在 Google App Engine 上工作(和使用)而设计。

https://github.com/ZsoltSafrany/java-apns-gae

于 2014-08-27T11:00:03.697 回答
0

您可以使用谷歌云平台。它是为 GAE 编写的,它与 JavaPN 集成并实现了自己的队列。

您使用我们的框架类与部署的后端进行交互,就好像它是设备本地的一样。我们整合了我们最近的工作 ,通过 Apple 推送通知服务向数千台 iOS 设备提供可扩展、可靠的推送通知。

与后端实例和拉队列的连接池

如果你有一个流行的应用程序,你可以很快地生成大量的推送通知——即使是在一个事件之后。

出于两个性能原因,应该避免打开大量与 APNS 的安全连接,而是简单地保持一些连接打开并汇集您的应用程序通过这些连接生成的任何推送通知。这种方法通常称为连接池。

幸运的是,App Engine 为可扩展的连接池提供了构建块。常驻后端实例是长时间运行的 App Engine 容器,可用作工作人员来保存打开的 APNS 通知以发送通知。然后,这些工作人员可以监视一个拉取队列,该队列可以在应该发送通知时向工作人员发出信号。当应用程序的另一个组件中发生应该触发推送通知的事件(例如由前端实例中的移动 API 触发的操作)时,应用程序的其他组件可以简单地将任务排入拉取队列。

然后,每个工作人员可以定期从拉取队列中读取,以查看应用程序是否需要发送任何通知,如果有,则租用其中的一个块,通过先前建立的 APNS 连接发送它们,然后删除它们。

连接到 APNS

虽然您可以使用 App Engine 的出站套接字支持直接从 Java 或 Python 与 APNS 对话,但 JavaPNS 等流行的第 3 方库也可以正常工作,并且通常提供更清晰的高级接口来发送通知。

于 2013-10-23T16:53:13.643 回答