gpt4 book ai didi

java - GCM - 6 次尝试后无法将 JSON 请求发布到 GCM

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:09 26 4
gpt4 key购买 nike

我遇到了与 this 相同的问题.我会尝试提供更多信息。

我正在使用 Play Framework,用 Java 编写。我写了一个叫做 PushNotificationQueue 的插件。 PushNotificationQueue 同时运行 iOS 和 Android 推送消息队列。下面,作为引用,是我的 GCM 实现。

public class AndroidPushNotificationQueue {

// (constructors and fields not included for brevity)
// constructor starts a daemon thread

/**
* Sends a notification.
* @param notifyKeys - device tokens
* @param data - data to send
**/
public void sendNotification(List<String> notifyKeys, Map<String, String> data) {
if (notifyKeys.size() == 0) {
return;
}

Builder b = new Message.Builder();
if (data != null) {
for (String key : data.keySet()) {
b.addData(key, data.get(key));
}
}
if (testMode) {
b.dryRun(true);
}
Message message = b.build();
queue.add(new Notification(notifyKeys, message));
}

public void stop() {
stopped = true;
sendingThread.interrupt();
}

private class SendNotificationRunner implements Runnable {

@Override
public void run() {
while (true) {
try {
sendNotifications();
//TODO: handle errors
} catch (InterruptedException e) {
if (stopped) break;
Logger.error("Error processing android notification", e);
} catch (InvalidRequestException e) {
if (stopped) break;
Logger.error("Error processing android notification", e);
} catch (IOException e) {
if (stopped) break;
Logger.error("Error processing android notification", e);
} catch (Exception e) {
if (stopped) break;
Logger.error("Unexpected Exception in Android Notification thread", e);
}
}
Logger.info("Stopping Android push queue");
}

private void sendNotifications() throws IOException, InterruptedException, InvalidRequestException {

Notification n = queue.take(); // will wait until an element becomes available
MulticastResult result = sender.send(n.message, n.notifyKeys, NUM_RETRIES);
List<Result> results = result.getResults();

for (int i = 0; i < results.size(); ++i) {
Result r = results.get(i);
String mId = r.getMessageId();
String notifyKey = n.notifyKeys.get(i);

if (mId == null) {
String error = r.getErrorCodeName();
if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
removeDeadRegistration(notifyKey);
} else {
//TODO: something better when error occurs
Logger.error("Error sending android notification to " + notifyKey + ": " + error);
}
} else {
String newNotifyKey = r.getCanonicalRegistrationId();
if (newNotifyKey != null && !newNotifyKey.equals(notifyKey)) {
// do something to handle this error case - not included for brevity
}
}
}
}

}

这行得通……有时。大多数时候我会收到以下错误。

java.io.IOException: Could not post JSON requests to GCM after 6 attempts
at com.google.android.gcm.server.Sender.send(Sender.java:319) ~[classes/:na]
at utils.AndroidPushNotificationQueue$SendNotificationRunner.sendNotifications(AndroidPushNotificationQueue.java:131) ~[classes/:na]
at utils.AndroidPushNotificationQueue$SendNotificationRunner.run(AndroidPushNotificationQueue.java:103) ~[classes/:na]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_55]
[debug] application - Endpoint - BaseStationAuth.getUsername

我进行了一些挖掘,并在 GCM 实现中发现了这一点。

/**
* Sends a message to one device, retrying in case of unavailability.
*
* <p>
* <strong>Note: </strong> this method uses exponential back-off to retry in
* case of service unavailability and hence could block the calling thread
* for many seconds.
*
* @param message message to be sent, including the device's registration id.
* @param registrationId device where the message will be sent.
* @param retries number of retries in case of service unavailability errors.
*
* @return result of the request (see its javadoc for more details).
*
* @throws IllegalArgumentException if registrationId is {@literal null}.
* @throws InvalidRequestException if GCM didn't returned a 200 or 5xx status.
* @throws IOException if message could not be sent.
*/
public Result send(Message message, String registrationId, int retries)
throws IOException {
int attempt = 0;
Result result = null;
int backoff = BACKOFF_INITIAL_DELAY;
boolean tryAgain;
do {
attempt++;
if (logger.isLoggable(Level.FINE)) {
logger.fine("Attempt #" + attempt + " to send message " +
message + " to regIds " + registrationId);
}
result = sendNoRetry(message, registrationId);
tryAgain = result == null && attempt <= retries;
if (tryAgain) {
int sleepTime = backoff / 2 + random.nextInt(backoff);
sleep(sleepTime);
if (2 * backoff < MAX_BACKOFF_DELAY) {
backoff *= 2;
}
}
} while (tryAgain);
if (result == null) {
throw new IOException("Could not send message after " + attempt +
" attempts");
}
return result;
}

我改变了尝试次数 - 5、10、15。

  • 还有其他人遇到过这个问题吗?我在网上找了几个人有同样的问题,但是至今没有找到解决办法。
  • 对我可以尝试解决的问题有什么建议吗?
  • 我应该继续增加尝试次数吗?

最佳答案

我遇到了同样的问题。但修复它。

1.我认为只需将“Sender.BACKOFF_INITIAL_DELAY = 1000;”的间隔时间变量编辑为“Sender.BACKOFF_INITIAL_DELAY = 10000;”在 com.google.android.gcm.server 上的 Sender.java 中。

您可以阅读Sender.java 文件。它是开源的。

2。 我将 collaps_key 值更改为 gcm 有效负载中的 long 类型。 我认为谷歌服务器不接受 collaps_key 的特殊字符。 “.”、“,”、任何字母表。

祝你好运。

关于java - GCM - 6 次尝试后无法将 JSON 请求发布到 GCM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25815253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com