美文网首页
简单mpush长连接实现

简单mpush长连接实现

作者: jia々 | 来源:发表于2019-10-22 16:43 被阅读0次

    1.mpush服务搭建,根据官网http://mpush.mydoc.io/?t=134336服务部署搭建redis服务,zk服务

    2.服务端sdk接入,根据文档配置,发送send实现如下

    public class MpushUtils {
    
        private static MpushUtils mpushUtils;
    
        static Logger log = LoggerFactory.getLogger(MpushUtils.class);
        private final static PushSender sender = PushSender.create();
    
        public static void send(String userId, PushMsg msg, String msgId) throws Exception {
            FutureTask<PushResult> future = null;
    
            if (!sender.isRunning()) {
                sender.start();
            }
    
            msg.setMsgId("msgId" + msgId);
            PushContext context = PushContext.build(msg)
                    .setAckModel(AckModel.AUTO_ACK)
                    .setUserId(userId)
                    //.setUserIds(userIds)
                    .setBroadcast(false)
                    .setTimeout(2000)
                    .setCallback(new PushCallback() {
                        //推送成功后的回调
                        @Override
                        public void onResult(PushResult result) {
                            log.info("\n\n" + result);
                        }
                    });
            future = sender.send(context);
            log.info("推送结果===========>" + future.toString());
    
        }
    

    3.MPushClient(Java)是一个java写的客户端具体接入mpush服务如下

    public class MpushUtil {
    
        private static final Logger logger = LogManager.getLogger(MpushUtil.class);
        private static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCghPCWCobG8nTD24juwSVataW7iViRxcTkey/B792VZEhuHjQvA3cAJgx2Lv8GnX8NIoShZtoCg3Cx6ecs+VEPD2fBcg2L4JK7xldGpOJ3ONEAyVsLOttXZtNXvyDZRijiErQALMTorcgi79M5uVX9/jMv2Ggb2XAeZhlLD28fHwIDAQAB";
    
        public static Client client;
    
        public static void connectAndbind(String userId) {
                String serverHost = "192.168.80.182";//部署好的mpush服务ip
       
            String cacheDir = MpushUtil.class.getResource("/").getFile();
            ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
            ClientListener listener = new L(scheduledExecutor);
            client = ClientConfig
                    .build()
                    .setPublicKey(publicKey)
                    //.setAllotServer(allocServer) //未使用alloc服务
                    .setServerHost(serverHost)
                    .setServerPort(3000) //mpush服务端口号默认是3000
                    .setDeviceId("deviceId")
                    .setUserId(userId)
                    .setSessionStorageDir(cacheDir)
                    .setLogger(new DefaultLogger())
                    .setLogEnabled(true)
                    .setEnableHttpProxy(true)
                    .setClientListener(listener)
                    .create();
            client.start();
    
        }
    
        public static class L implements ClientListener {
            private final ScheduledExecutorService scheduledExecutor;
            boolean flag = true;
    
            public L(ScheduledExecutorService scheduledExecutor) {
                this.scheduledExecutor = scheduledExecutor;
            }
    
            @Override
            public void onConnected(Client client) {
                System.out.println("================>connected");
                flag = true;
            }
    
            @Override
            public void onDisConnected(Client client) {
                System.out.println("================>disconnected");
                flag = false;
            }
    
            @Override
            public void onHandshakeOk(final Client client, final int heartbeat) {
    
                System.out.println("=================>handshakeOk");
    
                System.out.println();
                scheduledExecutor.scheduleAtFixedRate(new Runnable() {
                    @Override
                    public void run() {
                        client.healthCheck();
                    }
                }, 10, 10, TimeUnit.SECONDS);
    
                //client.push(PushContext.build("test"));
    
            }
    
            @Override
            public void onKickUser(String deviceId, String userId) {
                System.out.println("==============================>onkickUser");
            }
    
            /**
             * <B>方法名称:</B><BR>
             * <B>概要说明:推送消息监听</B><BR>
             * 
             * @see com.mpush.api.ClientListener#onReceivePush(com.mpush.api.Client, byte[])
             */
            @Override
            public void onReceivePush(Client client, byte[] content) {
                System.out.println("======================>onReceivePush");
               //用于监听后台服务推送信息
              
            }
    
        }
    
        public static void main(String[] args) {
            connectAndbind("12345");
          //client.stop();//关闭进程后要将长连接关闭不然可能导致心跳重连的时候出错
        }
    
    }
    

    注意:在客户端启动连接的时候本人是报错
    PushSender推送建立连接超时
    错误如下:io.netty.channel.ConnectionTimeOutException:connection timed out: /xxx.xxx.xxx.xxx:3001

    解决方式:
    a.) 首先检查ip是否正确 telnet xxx.xxx.xxx.xxx 3001是否通
    b.) 如果ip不正确增加配置mp.net.local-ip="指定具体的ip"
    解决方法是在搭建的mpush服务中修改
    mp.net.local-ip="192.168.80.182" //本地ip, 默认取第一个网卡的本地IP

    image.png

    相关文章

      网友评论

          本文标题:简单mpush长连接实现

          本文链接:https://www.haomeiwen.com/subject/shoqvctx.html