RamosLi / dbay-apns-for-java

High performance Java client for APNS(Apple Push Notification Service)
Apache License 2.0
238 stars 152 forks source link

重试机制如果再次失败,会不会进入死循环 ? #12

Open luffyliups opened 9 years ago

luffyliups commented 9 years ago

作者同志,您好! 如题。 在 startErrorWorker() 中会把上一条失败的消息加入 resentQueue, 然后通过ApnsResender.getInstance().resend(name, resentQueue); 这里的 resend() 函数其实也是调用 service.sendNotification(queue.poll()); 来发送。 那么理论上,如果一直出错,那么会不断创建新线程去重试? 我的理解有问题么? 多谢并期待您的答复。

RamosLi commented 9 years ago

不是这样的。我们假设queue有ABCDEF这6条消息,假设第三条C出错了,那么就会跳过C,把DEF重发一遍。所以不会出现你说的情况。

luffyliups commented 9 years ago

多谢,我再仔细看一下代码。其实我在研究在你这个基础上,怎么能让发送者知道所有发送任务已经执行完成。比如10个token,循环发送,怎么知道什么时候真正发送完成?

RamosLi commented 9 years ago

苹果的APNS接口是这么设计的:你发条通知过去,成功与否不知道,得等着,等多少时间呢,1分钟,2分钟,1个小时。。。也不知道。 HTTP协议有request和response,苹果的接口相当于只有request而没有response。所以不确定是否发送成功。 因此这个类库设计时就采用了异步。如果你想知道咱们的消息是否通过网络发出去了,抱歉,现在没有提供回调接口,不过你可以改改源代码来满足你的需求

luffyliups commented 9 years ago

这个我知道。其实我只是想知道所有“发送”动作是不是都做完,因为这里用到线程池发送,在重发机制里面又用到 Thread.start(),所以顶层的调用主线程没办法知道是不是所有的子线程已经执行完。我要的就是这个效果而已。 多谢多谢。

qysnowqy commented 9 years ago

作者,您好。一次推送完成,是否有成功多少?失败多少的api呢

RamosLi commented 9 years ago

不会,因为失败的再次发送也会失败,所以会丢弃

qysnowqy commented 9 years ago

我的意思是,是否有成功多少、失败多少的统计结果