数日前は、データベースに約 1000 個のデバイス トークンがあったため、Android デバイスのプッシュ通知は正常に機能していましたが、現在は約 1500 個のデバイス トークンに達しているため、機能していません。java.io.IOException
サーバー側に入ります。
java.io.IOException: Server returned HTTP response code: 400 for URL: https://android.googleapis.com/gcm/send
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:363)
at com.google.android.gcm.server.Sender.send(Sender.java:261)
at com.orange.server.ws.androidpns.androidPNHandler.run(androidPNHandler.java:58)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://android.googleapis.com/gcm/send
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:362)
... 2 more
1 つのデバイス トークンを確認したところ正常に動作しましたが、データベース テーブルに多数のデバイス トークン (>800) がある場合、上記の例外が発生します。GCM のサーバー コードを次に示します。
Sender sender = new Sender("SENDER-ID");
AndroidPNSEntityHandler androidPNSEntityHandler = new AndroidPNSEntityHandler();
ArrayList<String> androidDeviceIds = androidPNSEntityHandler.getList();
/* I checked by adding only one device token to this arraylist like
this **androidDeviceIds.add("Android-Device-Token");**
It worked fine...
*/
if(androidDeviceIds.size() != 0)
{
String title;
if(!isOrangeCall)
title = "title";
else
title = "oTitle";
Message message = new Message.Builder()
.collapseKey(pnsCollapseKey)
.timeToLive(86400)
.addData(title,msgTitle)
.addData("content",msgContent)
.build();
try
{
MulticastResult result = sender.send(message, androidDeviceIds, 5);
if (result.getResults() != null)
{
int failureMsgs = result.getFailure();
int canonicalRegId = result.getCanonicalIds();
List<Result> multicastResults = result.getResults();
Boolean flag =true;
int total;
if(failureMsgs != 0 || canonicalRegId != 0)
{
for(total = 0;flag;total++)
{
if(canonicalRegId != 0)
{
String tempCanId = multicastResults.get(total).getCanonicalRegistrationId();
if( tempCanId != null)
{
if(androidPNSEntityHandler.deleteDuplicate(androidDeviceIds.get(total), tempCanId))
canonicalRegId--;
}
}
if(failureMsgs != 0)
{
if(multicastResults.get(total).getErrorCodeName().equals(Constants.ERROR_NOT_REGISTERED))
{
if(androidPNSEntityHandler.deleteUid(androidDeviceIds.get(total)));
failureMsgs--;
}
}
if(canonicalRegId == 0 && failureMsgs == 0)
flag = false;
}
}
}
}catch (java.lang.IllegalArgumentException e)
{
e.printStackTrace();
}catch (InvalidRequestException e)
{
e.printStackTrace();
}catch (java.io.IOException e)
{
e.printStackTrace();
}catch (Exception e)
{
e.printStackTrace();
}
}
この問題を解決するために私を導いてください...