Commit 61a0ab9d by giaogiao

优化Response指令为枚举类;

添加指令:单人WebRTC音视频通话;
优化Cmd策略模式抽象类和实现类名
parent b6b1e169
package com.wecloud.im.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
......@@ -14,6 +15,7 @@ import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.ResponseModel;
import com.wecloud.im.ws.service.WriteDataService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
......@@ -191,7 +193,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
}
// 向接收方推送
ResponseModel<ImMessageOnlineSend> responseModel = new ResponseModel<>();
responseModel.setCmd(ResponseModel.ONLINE_EVENT_MSG);
responseModel.setCmd(WsResponseCmdEnum.ONLINE_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
......
......@@ -17,7 +17,7 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//RUNTIME运行时保留
@Target(ElementType.TYPE) //type描述类、接口
@Documented
public @interface ReceiveTypeAnnotation {
public @interface CmdTypeAnnotation {
WsRequestCmdEnum type();
}
......@@ -15,7 +15,12 @@ public enum WsRequestCmdEnum {
/**
* ping
*/
PING(2);
PING(2),
/**
* 单人WebRTC音视频通话
*/
SINGLE_RTC(3);
private final int cmdCode;
......
......@@ -8,14 +8,25 @@ package com.wecloud.im.ws.enums;
public enum WsResponseCmdEnum {
/**
* 离线消息下发完成指令
* 下发单人在线RTC事件
*/
OFFLINE_MSG_SUC(100),
SINGLE_RTC_MSG(4),
/**
* 主动下发消息指令
* 下发在线事件消息
*/
WRITE_MSG(101);
ONLINE_EVENT_MSG(3),
/**
* 下发在线基本类型消息
*/
ONLINE_MSG(2),
/**
* 响应数据类型
*/
RES(1);
private final int cmdCode;
......
......@@ -15,23 +15,8 @@ import java.io.Serializable;
public class ResponseModel<T> implements Serializable {
/**
* 下发在线事件消息
*/
public static final Integer ONLINE_EVENT_MSG = 3;
/**
* 下发在线基本类型消息
*/
public static final Integer ONLINE_MSG = 2;
/**
* 响应数据类型
*/
public static final Integer RES = 1;
/**
* 枚举类UriPathEnum 请求uri的编码
* 由于websocket使用同一个通道发送数据,需要区分不同类型请求
* 枚举类WsResponseCmdEnum 请求uri的编码
* 由于webSocket使用同一个通道发送数据,需要区分不同类型请求
*/
private Integer cmd;
......
......@@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.model.request.ReceiveModel;
import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.im.ws.strategy.AbstractReceiveStrategy;
import com.wecloud.im.ws.strategy.ReceiveStrategyContext;
import com.wecloud.im.ws.strategy.ImCmdAbstract;
import com.wecloud.im.ws.strategy.ImCmdContext;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
......@@ -26,7 +26,7 @@ public class ReadWsData {
// idea此处报红 属于正常
// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Resource
private ReceiveStrategyContext receiveStrategyContext;
private ImCmdContext receiveStrategyContext;
@Resource
private WriteDataService writeDataService;
......@@ -57,7 +57,7 @@ public class ReadWsData {
WsRequestCmdEnum wsRequestUriPathEnum = WsRequestCmdEnum.getByCode(receiveModel.getCmd());
// 使用策略模式, 根据不同类型请求调用不同实现类
AbstractReceiveStrategy receiveStrategy = receiveStrategyContext.getStrategy(wsRequestUriPathEnum);
ImCmdAbstract receiveStrategy = receiveStrategyContext.getStrategy(wsRequestUriPathEnum);
receiveStrategy.process(receiveModel, ctx, data, appKey, clientId);
}
......
......@@ -30,7 +30,7 @@ import java.util.Map;
*/
@Component
@Slf4j
public class PushTask {
public class SystemPush {
@Autowired
private ImIosApnsService imIosApnsService;
......@@ -56,7 +56,7 @@ public class PushTask {
* @param imClientReceiver
*/
@Async
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) {
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication, PushType pushType) {
log.info("push:" + imClientReceiver.getClientId());
PushModel pushModel = new PushModel();
......@@ -82,7 +82,7 @@ public class PushTask {
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
ios(pushModel, imClientReceiver, imApplication);
ios(pushModel, imClientReceiver, imApplication, pushType);
} else {
android(pushModel, imClientReceiver, imApplication);
......@@ -122,7 +122,7 @@ public class PushTask {
}
}
private void ios(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) {
private void ios(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication, PushType pushType) {
// ios推送通道,友盟:1;firebase:2; apns原生:3
if (imApplication.getIosPushChannel() == 1) {
log.info("友盟");
......@@ -153,7 +153,7 @@ public class PushTask {
// apns原生:3
log.info("apns原生");
apnsPush(pushModel, imClientReceiver, imApplication);
apnsPush(pushModel, imClientReceiver, imApplication, pushType);
} else {
log.info("没有找到推送类型");
}
......@@ -200,7 +200,7 @@ public class PushTask {
}
}
private void apnsPush(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) {
private void apnsPush(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication, PushType pushType) {
// 查询apns证书
ImIosApns apns = imIosApnsService.getImIosApnsByAppId(imApplication.getId());
Map<String, Object> customProperty = new HashMap<String, Object>(1);
......@@ -227,7 +227,7 @@ public class PushTask {
IosPush.push(certificatePassword, inputStream2, productFlag, deviceToken, alertTitle, alertBody,
contentAvailable, customProperty, badge
, DeliveryPriority.IMMEDIATE, PushType.ALERT, topicBundleId,
, DeliveryPriority.IMMEDIATE, pushType, topicBundleId,
sound);
}
......
......@@ -6,12 +6,12 @@ import com.wecloud.im.ws.model.request.ReceiveModel;
import io.netty.channel.ChannelHandlerContext;
/**
* @Description 接收netty不同类型请求
* @Description 处理Cmd请求
* 抽象类 策略设计模式
* @Author hewei hwei1233@163.com
* @Date 2020-01-02
*/
public abstract class AbstractReceiveStrategy {
public abstract class ImCmdAbstract {
/**
* 处理业务流程
......
......@@ -11,15 +11,15 @@ import java.util.Map;
* 维护指令码与策略实现的对应
* @Author hewei hwei1233@163.com
*/
public class ReceiveStrategyContext {
public class ImCmdContext {
private final Map<WsRequestCmdEnum, Class> strategyMap;
public ReceiveStrategyContext(Map<WsRequestCmdEnum, Class> strategyMap) {
public ImCmdContext(Map<WsRequestCmdEnum, Class> strategyMap) {
this.strategyMap = strategyMap;
}
public AbstractReceiveStrategy getStrategy(WsRequestCmdEnum wsRequestPathEnum) {
public ImCmdAbstract getStrategy(WsRequestCmdEnum wsRequestPathEnum) {
if (wsRequestPathEnum == null) {
throw new IllegalArgumentException("not fond enum");
......@@ -35,6 +35,6 @@ public class ReceiveStrategyContext {
throw new IllegalArgumentException("not fond strategy for type:" + wsRequestPathEnum.getCmdCode());
}
return (AbstractReceiveStrategy) SpringBeanUtils.getBean(aClass);
return (ImCmdAbstract) SpringBeanUtils.getBean(aClass);
}
}
package com.wecloud.im.ws.strategy;
import com.google.common.collect.Maps;
import com.wecloud.im.ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.ws.annotation.CmdTypeAnnotation;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.utils.ClassScanner;
import org.springframework.beans.BeansException;
......@@ -22,7 +22,7 @@ import java.util.Set;
* @Date 2020-01-02
*/
@Component
public class ReceiveStrategyProcessor implements BeanFactoryPostProcessor {
public class ImCmdStrategyProcessor implements BeanFactoryPostProcessor {
// 扫码注解的包路径
private static final String STRATEGY_PACK = "com.wecloud.im.ws.strategy.concrete";
......@@ -32,20 +32,20 @@ public class ReceiveStrategyProcessor implements BeanFactoryPostProcessor {
Map<WsRequestCmdEnum, Class> handlerMap = Maps.newHashMapWithExpectedSize(5);
// 扫码ReceiveTypeAnnotation注解的类
Set<Class<?>> classSet = ClassScanner.scan(STRATEGY_PACK, ReceiveTypeAnnotation.class);
Set<Class<?>> classSet = ClassScanner.scan(STRATEGY_PACK, CmdTypeAnnotation.class);
classSet.forEach(clazz -> {
// 获取注解中的类型值,与枚举类一一对应
WsRequestCmdEnum type = clazz.getAnnotation(ReceiveTypeAnnotation.class).type();
WsRequestCmdEnum type = clazz.getAnnotation(CmdTypeAnnotation.class).type();
handlerMap.put(type, clazz);
});
// 初始化Contenxt, 将其注册到spring容器当中
ReceiveStrategyContext context = new ReceiveStrategyContext(handlerMap);
ImCmdContext context = new ImCmdContext(handlerMap);
try {
configurableListableBeanFactory.registerResolvableDependency(Class.forName(ReceiveStrategyContext.class.getName()), context);
configurableListableBeanFactory.registerResolvableDependency(Class.forName(ImCmdContext.class.getName()), context);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
......
......@@ -3,6 +3,7 @@ package com.wecloud.im.ws.strategy.concrete;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.turo.pushy.apns.PushType;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
......@@ -15,13 +16,14 @@ import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.ws.annotation.CmdTypeAnnotation;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.ResponseModel;
import com.wecloud.im.ws.model.request.ReceiveModel;
import com.wecloud.im.ws.sender.PushTask;
import com.wecloud.im.ws.sender.SystemPush;
import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.im.ws.strategy.AbstractReceiveStrategy;
import com.wecloud.im.ws.strategy.ImCmdAbstract;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.util.SnowflakeUtil;
......@@ -38,10 +40,10 @@ import java.util.List;
/**
* @Description 处理app数据消息
*/
@ReceiveTypeAnnotation(type = WsRequestCmdEnum.DATA)
@CmdTypeAnnotation(type = WsRequestCmdEnum.DATA)
@Service
@Slf4j
public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
public class ImChatConcrete extends ImCmdAbstract {
private static final String TO_CONVERSATION_KEY = "toConversation";
private static final String PUSH_KEY = "push";
......@@ -71,7 +73,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
private ImClientService imClientService;
@Autowired
private PushTask pushTask;
private SystemPush pushTask;
@Override
public void process(ReceiveModel receiveModel, ChannelHandlerContext ctx, String data, String appKey, String clientId) throws JsonProcessingException {
......@@ -172,7 +174,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 向接收方推送
ResponseModel<ImMessageOnlineSend> responseModel = new ResponseModel<>();
responseModel.setCmd(ResponseModel.ONLINE_MSG);
responseModel.setCmd(WsResponseCmdEnum.ONLINE_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
......@@ -181,13 +183,13 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
writeDataService.write(responseModel, appKey, imClientReceiver.getClientId());
// 异步推送系统通知消息
pushTask.push(pushMap, imClientReceiver, imApplication);
pushTask.push(pushMap, imClientReceiver, imApplication, PushType.ALERT);
}
// 响应发送方消息id等信息
ResponseModel<HashMap<String, Long>> responseModel = new ResponseModel<>();
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCmd(ResponseModel.RES);
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
HashMap<String, Long> stringHashMap = new HashMap<>(3);
......@@ -234,7 +236,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 响应发送方
ResponseModel<HashMap<String, Long>> responseModel = new ResponseModel<>();
ApiResult<Boolean> result = ApiResult.result(ApiCode.IS_BE_BLACK);
responseModel.setCmd(ResponseModel.RES);
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setReqId(receiveModel.getReqId());
......@@ -249,7 +251,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 响应发送方
ResponseModel<HashMap<String, Long>> responseModel = new ResponseModel<>();
ApiResult<Boolean> result = ApiResult.result(ApiCode.IS_TO_BLACK);
responseModel.setCmd(ResponseModel.RES);
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setReqId(receiveModel.getReqId());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment