2017-05-03 21 views
1

iOSデバイスのバルク通知を送信するときに問題が発生しました。デバイスを数個(1〜20個は多かれ少なかれ)送信すると問題なく動作しますが、バルク送信3000 +)それは私に次のエラーを与えている:バルクiOS通知を送信する際の問題

[2017-04-27 15:12:07] ERROR (Notificaciones:347) - IOS: Error en envio notificaciones - CommunicationException: javapns.communication.exceptions.CommunicationException: Communication exception: java.net.ConnectException: Expir tiempo de conexiConnection timed out) at javapns.communication.ConnectionToAppleServer.getSSLSocket(ConnectionToAppleServer.java:156) at javapns.notification.PushNotificationManager.initializeConnection(PushNotificationManager.java:106) at javapns.notification.transmission.NotificationThread.runList(NotificationThread.java:215) at javapns.notification.transmission.NotificationThread.run(NotificationThread.java:199) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.ConnectException: Expir tiempo de conexiConnection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:576) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:635) at sun.security.ssl.SSLSocketImpl.(SSLSocketImpl.java:423) at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:88) at javapns.communication.ConnectionToAppleServer.getSSLSocket(ConnectionToAppleServer.java:153) ... 4 more

は私のコードは次のとおりです:

private static void realizaEnvioIOSLista (final List<DispositivoDto> dispositivos, final String textoES, final String textoCA, final String textoEN, final String tipoNotificacion){  

     Thread thread = new Thread(){ 
      public void run(){    
       try {   
        final List<String> idsDispositivos = new ArrayList<String>();     

        final String keystore = XmlUtils.dirCertIOS + XmlUtils.nomCertificado; 
        final String password = XmlUtils.password; 
        final boolean production = XmlUtils.production; 

        //Obtenemos los ids de los dispositivos 
        for(DispositivoDto r : dispositivos) 
         idsDispositivos.add(r.getIdDispositivo());     

        PushNotificationPayload payload = PushNotificationBigPayload.complex(); 

        /* Customize the payload */ 
        payload.addAlert(textoES);  
//     payload.addSound('default'); 
        payload.setContentAvailable(true); 

        payload.addCustomDictionary("es", textoES); 
        payload.addCustomDictionary("en", textoCA); 
        payload.addCustomDictionary("ca", textoEN); 
        payload.addCustomDictionary("tiponotificacion", tipoNotificacion); 

        List<PushedNotification> notifications = new ArrayList<PushedNotification>(); 

        if(idsDispositivos.size()<= 200){ 
         notifications = Push.payload(payload, keystore, password, production, idsDispositivos); 

        } else { 
         int threads = 1; 

         if(dispositivos.size() > 200) { 
          threads = (int) Math.ceil(dispositivos.size()/200); 
         } 

         notifications = Push.payload(payload, keystore, password, production, threads, idsDispositivos); 
        } 

        int dispEliminados = 0; 
        int dispNotificados = 0; 

        for (PushedNotification notification : notifications) { 
         if (notification.isSuccessful()) { 
          dispNotificados ++; 
         } else { 
          String invalidToken = notification.getDevice().getToken(); 

          int index = idsDispositivos.indexOf(invalidToken); 

          Integer usuario = dispositivos.get(index).getUsuario(); 
          String idHardware = dispositivos.get(index).getIdHardwareDis(); 

          aBD.unregisterDispositivo(usuario, invalidToken,idHardware); 
          dispEliminados ++; 

     //     Exception theProblem = notification.getException(); 
     //     theProblem.printStackTrace(); 

          //If the problem was an error-response packet returned by Apple, get it 
          ResponsePacket theErrorResponse = notification.getResponse(); 

          if (theErrorResponse != null){ 
           logNot.info("IOS: " +theErrorResponse.getMessage()); 
          } 
         } 
        } 
        logNot.info("IOS: Dispositivos Notificados correctamente: " + dispNotificados); 
        logNot.info("IOS: Dispositivos Eliminados: " +dispEliminados); 

       } catch (CommunicationException e) { 
        logNot.error("IOS: Error en envio notificaciones - CommunicationException: ",e); 
       } catch (KeystoreException e) { 
        logNot.error("IOS: Error en envio notificaciones - KeystoreException: ",e); 
       } catch (JSONException e) { 
        logNot.error("IOS: Error en envio notificaciones - JSONException: ",e); 
       } catch (Exception e) { 
        logNot.error("IOS: Error en envio notificaciones",e); 
       } 
      } 
     }; 

     thread.start(); 
    } 

間違って何か? Appleサーバーへの最大接続数はどのくらいですか?どんな助けも歓迎です。

答えて

0

私はシステム管理者と話をした後、私の問題の解決策を見つけました。サーバーの構成の問題であることがわかりました。appleのこのリンクに従うと、また

If you use Wi-Fi behind a firewall, or private Access Point Name for cellular data, connect to specific ports. You need a direct, unproxied connection to the APNs servers on these ports:

  • TCP port 5223 to communicate with APNs.
  • TCP port 2195 to send notifications to APNs.
  • TCP port 2196 for the APNs feedback service.
  • TCP port 443 is required during device activation, and afterwards for fallback (on Wi-Fi only) if devices can't reach APNs on port 5223.

だから

To use Apple Push Notification service (APNs), your Mac and iOS clients need a direct and persistent connection to Apple's servers.

:通知は、次のことが考慮されなければなりません

システム管理者がこれらの接続を許可するようにファイアウォールを設定することで、すべてが解決されました。私はそれが誰かを助けることを望む。

関連する問題