WindChat/openzaly-message/src/main/java/com/windchat/im/message/push/PushClient.java

109 lines
4.3 KiB
Java
Executable File

/**
* Copyright 2018-2028 Akaxin Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.windchat.im.message.push;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.akaxin.common.command.RedisCommand;
import com.akaxin.common.constant.CommandConst;
import com.akaxin.common.netty.IRedisCommandResponse;
import com.akaxin.common.netty.PlatformSSLClient;
import com.akaxin.proto.core.CoreProto;
import com.google.protobuf.ByteString;
import io.netty.util.concurrent.Future;
/**
* 通过平台发送push客户端
*
* @author Sam{@link an.guoyue254@gmail.com}
* @since 2018-06-20 21:45:07
*/
public class PushClient {
private static final Logger logger = LoggerFactory.getLogger(PushClient.class);
private static final String AKAXIN_PUSH_ADDRESS = "push.akaxin.com";
private static final int AKAXIN_PUSH_PORT = 443;
private PushClient() {
}
public static byte[] syncWrite(String action, byte[] byteData) {
try {
CoreProto.TransportPackageData.Builder packageDataBuilder = CoreProto.TransportPackageData.newBuilder();
Map<Integer, String> header = new HashMap<Integer, String>();
header.put(CoreProto.HeaderKey.SITE_SERVER_VERSION_VALUE, CommandConst.SITE_VERSION);
packageDataBuilder.putAllHeader(header);
packageDataBuilder.setData(ByteString.copyFrom(byteData));
PlatformSSLClient nettyClient = new PlatformSSLClient();
nettyClient.connect(AKAXIN_PUSH_ADDRESS, AKAXIN_PUSH_PORT);
Future<IRedisCommandResponse> future = nettyClient.sendRedisCommand(new RedisCommand()
.add(CommandConst.PROTOCOL_VERSION).add(action).add(packageDataBuilder.build().toByteArray()));
IRedisCommandResponse response = future.get(5, TimeUnit.SECONDS);
nettyClient.disconnect();
if (response != null && response.isSuccess()) {
return getResponseBytes(response.getRedisCommand());
}
logger.debug("write push to platform finish response={}", response);
} catch (Exception e) {
logger.error("sync send package error ", e);
}
return null;
}
public static void asyncWrite(String action, byte[] byteData) {
try {
CoreProto.TransportPackageData.Builder packageDataBuilder = CoreProto.TransportPackageData.newBuilder();
Map<Integer, String> header = new HashMap<Integer, String>();
header.put(CoreProto.HeaderKey.SITE_SERVER_VERSION_VALUE, CommandConst.SITE_VERSION);
packageDataBuilder.putAllHeader(header);
packageDataBuilder.setData(ByteString.copyFrom(byteData));
PlatformSSLClient nettyClient = new PlatformSSLClient();
nettyClient.connect(AKAXIN_PUSH_ADDRESS, AKAXIN_PUSH_PORT);
Future<IRedisCommandResponse> future = nettyClient.sendRedisCommand(new RedisCommand()
.add(CommandConst.PROTOCOL_VERSION).add(action).add(packageDataBuilder.build().toByteArray()));
IRedisCommandResponse response = future.get(5, TimeUnit.SECONDS);
logger.debug("write push to platform finish response={}", response);
nettyClient.disconnect();
} catch (Exception e) {
logger.error("async send package to platform error", e);
}
}
private static byte[] getResponseBytes(RedisCommand redisCommand) {
try {
String version = redisCommand.getParameterByIndex(0);
String action = redisCommand.getParameterByIndex(1);
byte[] params = redisCommand.getBytesParamByIndex(2);
logger.debug("get package bytes from platform {},{},{}", version, action, params);
if (CommandConst.ACTION_RES.equals(action)) {
CoreProto.TransportPackageData packageData = CoreProto.TransportPackageData.parseFrom(params);
CoreProto.ErrorInfo error = packageData.getErr();
if ("success".equals(error.getCode())) {
return packageData.getData().toByteArray();
}
}
} catch (Exception e) {
logger.error("get package bytes eror,redisCommand={}", redisCommand.toString());
}
return null;
}
}