Browse Source

快速返回IM服务的调用

imhao183 4 years ago
parent
commit
4ede98636c

+ 41 - 23
src/main/java/cn/wildfirechat/push/android/AndroidPushServiceImpl.java

@@ -13,6 +13,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
 @Service
 public class AndroidPushServiceImpl implements AndroidPushService {
     private static final Logger LOG = LoggerFactory.getLogger(AndroidPushServiceImpl.class);
@@ -34,32 +39,45 @@ public class AndroidPushServiceImpl implements AndroidPushService {
     @Autowired
     private FCMPush fcmPush;
 
+    private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 100,
+            60L, TimeUnit.SECONDS,
+            new SynchronousQueue<Runnable>());
+
     @Override
     public Object push(PushMessage pushMessage) {
         LOG.info("Android push {}", new Gson().toJson(pushMessage));
-        switch (pushMessage.getPushType()) {
-            case AndroidPushType.ANDROID_PUSH_TYPE_XIAOMI:
-                xiaomiPush.push(pushMessage);
-                break;
-            case AndroidPushType.ANDROID_PUSH_TYPE_HUAWEI:
-                hmsPush.push(pushMessage);
-                break;
-            case AndroidPushType.ANDROID_PUSH_TYPE_MEIZU:
-                meiZuPush.push(pushMessage);
-                break;
-            case AndroidPushType.ANDROID_PUSH_TYPE_VIVO:
-                vivoPush.push(pushMessage);
-                break;
-            case AndroidPushType.ANDROID_PUSH_TYPE_OPPO:
-                oppoPush.push(pushMessage);
-                break;
-            case AndroidPushType.ANDROID_PUSH_TYPE_FCM:
-                fcmPush.push(pushMessage);
-                break;
-            default:
-                LOG.info("unknown push type");
-                break;
-        }
+        final long start = System.currentTimeMillis();
+        executorService.execute(()->{
+            long now = System.currentTimeMillis();
+            if (now - start > 15000) {
+                LOG.error("等待太久,消息抛弃");
+                return;
+            }
+
+            switch (pushMessage.getPushType()) {
+                case AndroidPushType.ANDROID_PUSH_TYPE_XIAOMI:
+                    xiaomiPush.push(pushMessage);
+                    break;
+                case AndroidPushType.ANDROID_PUSH_TYPE_HUAWEI:
+                    hmsPush.push(pushMessage);
+                    break;
+                case AndroidPushType.ANDROID_PUSH_TYPE_MEIZU:
+                    meiZuPush.push(pushMessage);
+                    break;
+                case AndroidPushType.ANDROID_PUSH_TYPE_VIVO:
+                    vivoPush.push(pushMessage);
+                    break;
+                case AndroidPushType.ANDROID_PUSH_TYPE_OPPO:
+                    oppoPush.push(pushMessage);
+                    break;
+                case AndroidPushType.ANDROID_PUSH_TYPE_FCM:
+                    fcmPush.push(pushMessage);
+                    break;
+                default:
+                    LOG.info("unknown push type");
+                    break;
+            }
+        });
         return "ok";
     }
 }

+ 0 - 10
src/main/java/cn/wildfirechat/push/ios/ApnsServer.java

@@ -28,7 +28,6 @@ import static java.lang.System.exit;
 @Component
 public class ApnsServer  {
     private static final Logger LOG = LoggerFactory.getLogger(ApnsServer.class);
-    private static ExecutorService mExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 5);
 
     final SimpleMeterRegistry meterRegistry = new SimpleMeterRegistry();
     final MicrometerApnsClientMetricsListener productMetricsListener =
@@ -90,13 +89,6 @@ public class ApnsServer  {
 
 
     public void pushMessage(PushMessage pushMessage) {
-        final long start = System.currentTimeMillis();
-        mExecutor.submit(()-> {
-            long now = System.currentTimeMillis();
-            if (now - start > 5000) {
-                LOG.error("等待太久,消息抛弃");
-                return;
-            }
             ApnsClient service;
             if (pushMessage.getPushType() == IOSPushType.IOS_PUSH_TYPE_DISTRIBUTION) {
                 if (!mConfig.voipFeature || pushMessage.pushMessageType == PushMessageType.PUSH_MESSAGE_TYPE_NORMAL || StringUtils.isEmpty(pushMessage.getVoipDeviceToken())) {
@@ -254,7 +246,5 @@ public class ApnsServer  {
                     }
                 }
             });
-        });
-
     }
 }

+ 18 - 1
src/main/java/cn/wildfirechat/push/ios/IOSPushServiceImpl.java

@@ -7,16 +7,33 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
 @Service
 public class IOSPushServiceImpl implements IOSPushService {
     private static final Logger LOG = LoggerFactory.getLogger(IOSPushServiceImpl.class);
     @Autowired
     public ApnsServer apnsServer;
 
+    private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 100,
+            60L, TimeUnit.SECONDS,
+            new SynchronousQueue<Runnable>());
+
     @Override
     public Object push(PushMessage pushMessage) {
         LOG.info("iOS push {}", new Gson().toJson(pushMessage));
-        apnsServer.pushMessage(pushMessage);
+        final long start = System.currentTimeMillis();
+        executorService.execute(()->{
+            long now = System.currentTimeMillis();
+            if (now - start > 15000) {
+                LOG.error("等待太久,消息抛弃");
+                return;
+            }
+            apnsServer.pushMessage(pushMessage);
+        });
         return "OK";
     }
 }