gcm サービス全体で 1 秒あたり 500 のプッシュ通知を送信する必要があります。残念ながら、chrome49 とは異なり、chrome50 の顧客ごとにメッセージを暗号化する必要があります。暗号化キーはリクエスト ヘッダーに示されています。5000 を超えるメッセージが送信された後、 https: //android.googleapis.com/gcm/send からタイムアウトと接続拒否を受け取り、しばらくの間動作を停止し、定期的に正常に動作します
スレッドで実行される投稿リクエスト
try {
String path = "https://android.googleapis.com/gcm/send";
URI uri = new URIBuilder()
.setPath(path)
.build();
HttpPost httpPost = new HttpPost(uri);
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Content-Encoding", "aesgcm");
httpPost.addHeader("Cache-Control", "no-cache");
httpPost.addHeader("Connection", "Keep-Alive");
httpPost.addHeader("Content-Type", "application/json");
httpPost.addHeader("Authorization", "key=" + appKey);
httpPost.addHeader("Encryption", encryptionHeader);
httpPost.addHeader("Crypto-Key", cryptoKeyHeader);
httpPost.setEntity(new StringEntity(jsonFromData));
HttpResponse response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity).replace("%", "@");
LOGGER.info(responseString);
} catch (Exception e) {
e.printStackTrace();
}
例外: 接続が拒否されました
org.apache.http.conn.HttpHostConnectException: https://android.googleapis.comへの接続org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:190) で org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) で拒否されました。 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479) の impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643) org.apache.http.impl.client.AbstractHttpClient.execute( AbstractHttpClient.java:906) の org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) の org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) の com .mpsdevelopment.push.threads.SenderThread.sent(SenderThread.java:100) com.mpsdevelopment.push.threads.SenderThread.java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) で実行 (SenderThread.java:76) java.util.concurrent.FutureTask.run(FutureTask.java:266) で.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
接続がタイムアウトしました
原因: java.net.ConnectException: 接続タイムアウト: java.net.DualStackPlainSocketImpl.connect0(Native Method) で接続: java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) で java.net.AbstractPlainSocketImpl.doConnect( AbstractPlainSocketImpl.java:350) で java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) で java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) で java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) で) java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) で java.net.Socket.connect(Socket.java:589) で sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668) で org org.apache.http.impl の .apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414)。conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) ... 13 詳細