java服务端发送完成后,进程没有关闭,JPushClient也没有close方法


#2


#3

我调的是jpushClient.sendPush(payload)


#4

jpushClient并没有close方法


(KenChoi) #5

调用一下 NettyHttpClient.close()


#6

是这样吗?好像还是没关闭


(KenChoi) #7

试下这个

public void testSendPushWithCallback() {
        ClientConfig clientConfig = ClientConfig.getInstance();
        String host = (String) clientConfig.get(ClientConfig.PUSH_HOST_NAME);
        final NettyHttpClient client = new NettyHttpClient(ServiceHelper.getBasicAuthorization(APP_KEY, MASTER_SECRET),
                null, clientConfig);
        try {
            URI uri = new URI(host + clientConfig.get(ClientConfig.PUSH_PATH));
            PushPayload payload = buildPushObject_all_alias_alert();
            client.sendRequest(HttpMethod.POST, payload.toString(), uri, new NettyHttpClient.BaseCallback() {
                @Override
                public void onSucceed(ResponseWrapper responseWrapper) {
                    LOG.info("Got result: " + responseWrapper.responseContent);
                }
            });
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

这是带回调的用法


(KenChoi) #8

你可以在 PushClient 中声明一个方法,让 NettyHttpClient 调用 close 这个方法,在得到响应后就调用这个 close。

public static void testSendPush() {
	    // HttpProxy proxy = new HttpProxy("localhost", 3128);
	    // Can use this https proxy: https://github.com/Exa-Networks/exaproxy
		ClientConfig clientConfig = ClientConfig.getInstance();
        JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, clientConfig);
        
        // For push, all you need do is to build PushPayload object.
        PushPayload payload = buildPushObject_android_newly_support();
        try {
            PushResult result = jpushClient.sendPush(payload);
            LOG.info("Got result - " + result);
            Thread.sleep(5000);
            jpushClient.close();
        } catch (APIConnectionException e) {
            LOG.error("Connection error. Should retry later. ", e);
            LOG.error("Sendno: " + payload.getSendno());

        } catch (APIRequestException e) {
            LOG.error("Error response from JPush server. Should review and fix it. ", e);
            LOG.info("HTTP Status: " + e.getStatus());
            LOG.info("Error Code: " + e.getErrorCode());
            LOG.info("Error Message: " + e.getErrorMessage());
            LOG.info("Msg ID: " + e.getMsgId());
            LOG.error("Sendno: " + payload.getSendno());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


JPushClient.java

public void close() {
        _pushClient.close();
    }

PushClient.java

public void close() {
        _httpClient.close();
    }

#9

我这是引用的.jar包,没法在里面加close方法


(KenChoi) #10

这样,你可以先 clone 下来,然后改一下代码,然后再打包也行。我比较推荐这种,你可以定制化 PushClient,你可以选择用 NativeHttpClient 还是 NettyHttpClient。如果是多线程队列发送请求,并且每秒的请求量很大,推荐用 NettyHttpClient


(joe) #11

怎么让NettyHttpClient 调用 close这个方法,我没看明白你的方法。jpushClient.close()是怎么关闭NettyHttpClient的呢?


(KenChoi) #12

这个需要改一下 JPush Client 的代码 ,最终在 PushClient 中调用 NettyHttpClient.close


(joe) #13

你说的JPushClient.java和PushClient.java之间是啥关系,代码没有贴全,我搞不清楚在JPushClient.java

怎么加代码,

public static void testSendPush()这个方法是PushClient.java类的方法吗?


关于no netty-tcnative-windows-x86_64 in java.library.path问题
spring集成Jpush,链接是否关闭问题?
(KenChoi) #14

JPushClient 里面实例化了 PushClient,PushClient 实例化了 NettyHttpClient,你要在 JPushClient 中调用 NettyHttpClient 的 close 方法。你可以先切换为 NativeHttpClient,我上面解释了为什么要增加 NettyHttpClient,下个版本默认还是使用 NativeHttpClient。


(等_天蓝再看海) #15

NettyHttpClient 中没有close这个方法呀


#16

手动调用 close 方法,目前 close 方法在 PushClient 及 JPushClient 中被注释掉了,去掉注释


(等_天蓝再看海) #17

去掉注释后是这样的,NativeHttpClient这个类里面也没有close方法,调用会报错的


(等_天蓝再看海) #18

_httpNettyClient.close();这个方式是我加NettyHttpClient类里面的close方法


#19

看上面的说明


(KenChoi) #20

如果你用 NativeHttpClient 不用调用 close 方法,看清楚了。


(   —— ) #21

这个好用 顶一个