2
votes

We are using google cloud messenger for push notification. It was working fine few days before but suddenly it has started giving an exception.

Following is the stack trace

java.lang.IllegalArgumentException: argument cannot be null at com.google.android.gcm.server.Sender.nonNull(Sender.java:553) at com.google.android.gcm.server.Sender.getString(Sender.java:534) at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:365) at com.google.android.gcm.server.Sender.send(Sender.java:261) at org.cdac.gist.restws.gcm.GCMSender.sendGCM(GCMSender.java:48) at org.cdac.gist.restws.handlers.GCMAndroidPushHandler.gcmSender(GCMAndroidPushHandler.java:156) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.cdac.gist.restws.security.ClickjackFilter.doFilter(ClickjackFilter.java:64) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

Following is my source code

public final static int sendGCM(final String title, final List<String> registrationID)  throws IOException{         
            int status = 0;
            Sender sender = new Sender(apiKey);

            Message message = new Message.Builder()
                // .collapseKey("1")
                .timeToLive(86400)//sets the time of 1 day for GCM to push notifications when android device is off, offline or unavailable
                .delayWhileIdle(true)
                .addData("message", title)              
                .build();                        

            MulticastResult  result = sender.send(message, registrationID, 1);
            System.out.println("Result "+result);
                if(result == null){
                    throw new IOException("Could not send message");                    
                }else{
                    status = 1;
                }

                return status;  
    } 
1
I am not sure but this was an issue way back and its resolved . You might wanna update your libs .ADM
my push notification was working fine few days before, suddenly it has started giving an exception. if it is lib issue then how it was working before?Pawan Patil
my current jar version is gcm-server-1.0.2Pawan Patil

1 Answers

0
votes

The problem was due to GCM support for up to 1,000 recipients for a single message

so I divided my registration ArrayList into 1000 equal parts and then I sent the message to GCM. Now I am able to send the push notification.

Following is my updated code

public final static int sendGCM(final String title, final List<String> registrationID)  throws IOException{         
        int status = 0;
        MulticastResult  result =null;


        for (int start = 0; start < registrationID.size(); start += 1000) {
            int end = Math.min(start + 1000, registrationID.size());
            List<String> sublist = registrationID.subList(start, end);
            System.out.println(sublist);
            Sender sender = new Sender(apiKey);

            Message message = new Message.Builder()
                // .collapseKey("1")
                .timeToLive(86400)//sets the time of 1 day for GCM to push notifications when android device is off, offline or unavailable
                .delayWhileIdle(true)
                .addData("message", title)              
                .build();                        

            result = sender.send(message, sublist, 1);
            System.out.println("Result "+result);
        }
         if(result == null){
                throw new IOException("Could not send message");                    
            }else{
                status = 1;
            }
            return status;  
        }