Commit 60b245ba by lixiaozhong

1、json转换性能提升

2、代码结构优化
3、策略模块优化
4、消息体优化
parent 665de18a
package io.geekidea.springbootplus.test; package io.geekidea.springbootplus.test;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.wecloud.im.ws.model.request.ReceiveVO;
import com.fasterxml.jackson.databind.json.JsonMapper; import com.wecloud.utils.JsonUtils;
import com.wecloud.im.ws.model.request.ReceiveModel;
public class JsonTest { public class JsonTest {
public static void main(String[] args) throws JsonProcessingException { public static void main(String[] args) {
// jsonTest(); // jsonTest();
} }
private static void jsonTest() throws JsonProcessingException { private static void jsonTest() {
String data = "{\n" + String data = "{\n" +
"\"reqId\":\"123123\",\n" + "\"reqId\":\"123123\",\n" +
"\"cmd\":1,\n" + "\"cmd\":1,\n" +
...@@ -24,12 +23,10 @@ public class JsonTest { ...@@ -24,12 +23,10 @@ public class JsonTest {
"}\n"; "}\n";
// json转换成对象 // json转换成对象
JsonMapper jsonMapper = new JsonMapper(); ReceiveVO receiveVO = JsonUtils.decodeJson(data, ReceiveVO.class);
ReceiveModel receiveModel = jsonMapper.readValue(data, ReceiveModel.class);
// data对象转换成json // data对象转换成json
ObjectMapper objectMapper = new ObjectMapper(); JsonUtils.encodeJson(receiveVO.getData());
String s = objectMapper.writeValueAsString(receiveModel.getData());
} }
......
package io.geekidea.springbootplus.test; package io.geekidea.springbootplus.test;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.wecloud.im.ws.model.request.ReceiveVO;
import com.fasterxml.jackson.databind.json.JsonMapper; import com.wecloud.utils.JsonUtils;
import com.wecloud.im.ws.model.request.ReceiveModel;
import org.springframework.util.DigestUtils; import org.springframework.util.DigestUtils;
/** /**
...@@ -52,12 +51,10 @@ public class SignTest { ...@@ -52,12 +51,10 @@ public class SignTest {
"}\n"; "}\n";
// json转换成对象 // json转换成对象
JsonMapper jsonMapper = new JsonMapper(); ReceiveVO receiveVO = JsonUtils.decodeJson(data, ReceiveVO.class);
ReceiveModel receiveModel = jsonMapper.readValue(data, ReceiveModel.class);
// data对象转换成json // data对象转换成json
ObjectMapper objectMapper = new ObjectMapper(); JsonUtils.encodeJson(receiveVO.getData());
String s = objectMapper.writeValueAsString(receiveModel.getData());
} }
......
...@@ -14,13 +14,13 @@ import java.util.concurrent.TimeUnit; ...@@ -14,13 +14,13 @@ import java.util.concurrent.TimeUnit;
*/ */
public class BusinessThreadPool { public class BusinessThreadPool {
private final static ThreadFactory BUSINESS_THREAD_FACTORY = new ThreadFactoryBuilder() private static final ThreadFactory BUSINESS_THREAD_FACTORY = new ThreadFactoryBuilder()
.setNamePrefix("-business-").build(); .setNamePrefix("-business-").build();
/** /**
* 业务处理线程池 * 业务处理线程池
*/ */
public final static ExecutorService BUSINESS_TASK_THREAD_POOL_EXECUTOR = public static final ExecutorService BUSINESS_TASK_THREAD_POOL_EXECUTOR =
new ThreadPoolExecutor(WsConstants.CPU_PROCESSORS, WsConstants.CPU_PROCESSORS * 2, new ThreadPoolExecutor(WsConstants.CPU_PROCESSORS, WsConstants.CPU_PROCESSORS * 2,
60L, TimeUnit.MILLISECONDS, 60L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024 * 2), BUSINESS_THREAD_FACTORY, new ThreadPoolExecutor.CallerRunsPolicy()); new LinkedBlockingQueue<Runnable>(1024 * 2), BUSINESS_THREAD_FACTORY, new ThreadPoolExecutor.CallerRunsPolicy());
......
package com.wecloud.im.netty.core; package com.wecloud.im.netty.core;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.wecloud.im.executor.BusinessThreadPool; import com.wecloud.im.executor.BusinessThreadPool;
import com.wecloud.im.ws.model.WsConstants;
import com.wecloud.im.ws.receive.WsDataReader;
import com.wecloud.im.ws.service.MangerChannelService; import com.wecloud.im.ws.service.MangerChannelService;
import com.wecloud.im.ws.strategy.AbstractImCmdStrategy;
import com.wecloud.rtc.service.RtcService; import com.wecloud.rtc.service.RtcService;
import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
...@@ -16,11 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -16,11 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* @Description app端 长连接事件处理 * @Description app端 长连接事件处理
...@@ -34,19 +27,7 @@ public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFram ...@@ -34,19 +27,7 @@ public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFram
private static final String PING = "ping"; private static final String PING = "ping";
private static final String PONG = "pong"; private static final String PONG = "pong";
private final static ThreadFactory NAMED_THREAD_FACTORY = new ThreadFactoryBuilder()
.setNamePrefix("WS-business-").build();
/**
* 耗时核心业务处理线程池
* 属于io密集型业务
* io密集型任务配置尽可能多的线程数量
*/
private final static ExecutorService TASK_THREAD_POOL_EXECUTOR =
new ThreadPoolExecutor(WsConstants.CPU_PROCESSORS * 5, WsConstants.CPU_PROCESSORS * 10,
10L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(10), NAMED_THREAD_FACTORY, new ThreadPoolExecutor.CallerRunsPolicy());
@Resource
private WsDataReader wsDataReader;
@Autowired @Autowired
private RtcService rtcService; private RtcService rtcService;
@Resource @Resource
...@@ -91,7 +72,8 @@ public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFram ...@@ -91,7 +72,8 @@ public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFram
return; return;
} }
wsDataReader.convertModel(data, ctx, appKey, clientId); AbstractImCmdStrategy.process(appKey, clientId, ctx, data);
} catch (Exception e) { } catch (Exception e) {
log.error("系统繁忙data:" + data + ",appKey:" + appKey + ",clientId:" + clientId + log.error("系统繁忙data:" + data + ",appKey:" + appKey + ",clientId:" + clientId +
",channelId:" + ctx.channel().id().asLongText(), e); ",channelId:" + ctx.channel().id().asLongText(), e);
......
...@@ -3,11 +3,11 @@ package com.wecloud.im.netty.handler; ...@@ -3,11 +3,11 @@ package com.wecloud.im.netty.handler;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.netty.core.WsReadHandler; import com.wecloud.im.netty.core.WsReadHandler;
import com.wecloud.im.ws.model.WsConstants; import com.wecloud.im.ws.model.WsConstants;
import com.wecloud.im.ws.service.MangerChannelService; import com.wecloud.im.ws.service.MangerChannelService;
import com.wecloud.im.ws.utils.FullHttpRequestUtils; import com.wecloud.im.ws.utils.FullHttpRequestUtils;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.config.constant.CommonConstant; import io.geekidea.springbootplus.config.constant.CommonConstant;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
...@@ -56,7 +56,7 @@ public class NettyApiRequest { ...@@ -56,7 +56,7 @@ public class NettyApiRequest {
*/ */
public void handle(ChannelHandlerContext ctx, Object msg, FullHttpRequest httpRequest) throws Exception { public void handle(ChannelHandlerContext ctx, Object msg, FullHttpRequest httpRequest) throws Exception {
if (!(msg instanceof FullHttpRequest)) { if (!(msg instanceof FullHttpRequest)) {
String context = new JsonMapper().writeValueAsString(ApiResult.fail()); String context = JsonUtils.encodeJson(ApiResult.fail());
FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK); FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK);
return; return;
} }
...@@ -83,13 +83,13 @@ public class NettyApiRequest { ...@@ -83,13 +83,13 @@ public class NettyApiRequest {
Map<String, String> paramMap = FullHttpRequestUtils.parameterParse(httpRequest); Map<String, String> paramMap = FullHttpRequestUtils.parameterParse(httpRequest);
String token = paramMap.get(WsConstants.TOKEN); String token = paramMap.get(WsConstants.TOKEN);
if (StringUtils.isBlank(token)) { if (StringUtils.isBlank(token)) {
String context = new JsonMapper().writeValueAsString(ApiResult.result(ApiCode.FAIL, "token不能为空", (Object) null)); String context = JsonUtils.encodeJson(ApiResult.result(ApiCode.FAIL, "token不能为空", (Object) null));
FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK); FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK);
return; return;
} }
if (JwtUtil.isExpired(token)) { if (JwtUtil.isExpired(token)) {
String context = new JsonMapper().writeValueAsString(ApiResult.result(ApiCode.FAIL, "JWT Token已过期,token", (Object) null)); String context = JsonUtils.encodeJson(ApiResult.result(ApiCode.FAIL, "JWT Token已过期,token", (Object) null));
FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK); FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK);
return; return;
} }
...@@ -108,14 +108,14 @@ public class NettyApiRequest { ...@@ -108,14 +108,14 @@ public class NettyApiRequest {
if (jwtToken == null) { if (jwtToken == null) {
log.info("jwtToken == null ,token和redis不一致, clientId:" + clientId + ",token:" + token); log.info("jwtToken == null ,token和redis不一致, clientId:" + clientId + ",token:" + token);
String context = new JsonMapper().writeValueAsString(ApiResult.result(ApiCode.FAIL, "jwtToken == null ,token和redis不一致", (Object) null)); String context = JsonUtils.encodeJson(ApiResult.result(ApiCode.FAIL, "jwtToken == null ,token和redis不一致", (Object) null));
FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK); FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK);
return; return;
} }
if ((!jwtToken.getClientId().equals(clientId)) || (!jwtToken.getAppKey().equals(appKey))) { if ((!jwtToken.getClientId().equals(clientId)) || (!jwtToken.getAppKey().equals(appKey))) {
log.info("clientId appKey 不一致"); log.info("clientId appKey 不一致");
String context = new JsonMapper().writeValueAsString(ApiResult.result(ApiCode.FAIL, "clientId appKey 不一致", (Object) null)); String context = JsonUtils.encodeJson(ApiResult.result(ApiCode.FAIL, "clientId appKey 不一致", (Object) null));
FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK); FullHttpRequestUtils.send(ctx, context, HttpResponseStatus.OK);
return; return;
} }
......
package com.wecloud.im.param.add; package com.wecloud.im.param.add;
import com.wecloud.im.ws.model.request.PushModel; import com.wecloud.im.ws.model.request.PushVO;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity; import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -25,6 +25,6 @@ public class ImMsgRecall extends BaseEntity { ...@@ -25,6 +25,6 @@ public class ImMsgRecall extends BaseEntity {
private Long msgId; private Long msgId;
@ApiModelProperty("自定义推送字段") @ApiModelProperty("自定义推送字段")
private PushModel push; private PushVO push;
} }
...@@ -42,7 +42,7 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -42,7 +42,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param imConversationCreate * @param imConversationCreate
* @return * @return
*/ */
ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) throws JsonProcessingException; ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate);
/** /**
......
...@@ -9,6 +9,7 @@ import com.wecloud.im.param.add.ImMsgSendToOnlineClient; ...@@ -9,6 +9,7 @@ import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate; import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.vo.ImMessageOfflineListVo; import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto; import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.model.request.ReceiveDataVO;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService; import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
...@@ -33,7 +34,7 @@ public interface ImMessageService extends BaseService<ImMessage> { ...@@ -33,7 +34,7 @@ public interface ImMessageService extends BaseService<ImMessage> {
ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication); ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication);
ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, String content); ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, ReceiveDataVO content);
/** /**
......
...@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
...@@ -25,6 +23,7 @@ import com.wecloud.im.service.ImConversationService; ...@@ -25,6 +23,7 @@ import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService; import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ImConversationMemberListVo; import com.wecloud.im.vo.ImConversationMemberListVo;
import com.wecloud.im.ws.service.WriteDataService; import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
...@@ -48,9 +47,6 @@ import java.util.List; ...@@ -48,9 +47,6 @@ import java.util.List;
@Service @Service
public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversationMembersMapper, ImConversationMembers> implements ImConversationMembersService { public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversationMembersMapper, ImConversationMembers> implements ImConversationMembersService {
// private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired @Autowired
private WriteDataService writeDataService; private WriteDataService writeDataService;
...@@ -170,17 +166,9 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -170,17 +166,9 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
// .notIn(ImConversationMembers::getId, imClientSender.getId()) // .notIn(ImConversationMembers::getId, imClientSender.getId())
// ); // );
JsonMapper jsonMapper = new JsonMapper(); String attributes = JsonUtils.encodeJson(imConversationMemAttrUpdate.getAttributes());
imConversationMember.setAttributes(attributes);
try {
String attributes = jsonMapper.writeValueAsString(imConversationMemAttrUpdate.getAttributes());
imConversationMember.setAttributes(attributes);
} catch (JsonProcessingException e) {
e.printStackTrace();
return ApiResult.fail();
}
boolean b = imConversationMembersService.updateById(imConversationMember); boolean b = imConversationMembersService.updateById(imConversationMember);
if (b) { if (b) {
......
...@@ -5,8 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; ...@@ -5,8 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
...@@ -34,6 +32,7 @@ import com.wecloud.im.ws.enums.MsgTypeEnum; ...@@ -34,6 +32,7 @@ import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponseModel; import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.service.WriteDataService; import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
...@@ -63,9 +62,6 @@ import java.util.Map; ...@@ -63,9 +62,6 @@ import java.util.Map;
@Service @Service
public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMapper, ImConversation> implements ImConversationService { public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMapper, ImConversation> implements ImConversationService {
private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired @Autowired
private WriteDataService writeDataService; private WriteDataService writeDataService;
...@@ -89,13 +85,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -89,13 +85,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean saveImConversation(ImConversation imConversation) throws Exception { public boolean saveImConversation(ImConversation imConversation) {
return super.save(imConversation); return super.save(imConversation);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) throws JsonProcessingException { public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) {
ImClient createClient = imClientService.getCurentClient(); ImClient createClient = imClientService.getCurentClient();
...@@ -152,8 +148,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -152,8 +148,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient inviteClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient inviteClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, createClient.getFkAppid()) .eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0))); .eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
JsonMapper jsonMapper = new JsonMapper(); String asString = JsonUtils.encodeJson(imConversationCreate.getAttributes());
String asString = jsonMapper.writeValueAsString(imConversationCreate.getAttributes());
log.info("RequestAttributes:" + asString); log.info("RequestAttributes:" + asString);
...@@ -186,10 +181,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -186,10 +181,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversation.setCreator(creator); imConversation.setCreator(creator);
imConversation.setName(imConversationCreate.getName()); imConversation.setName(imConversationCreate.getName());
imConversation.setSystemFlag(false); imConversation.setSystemFlag(false);
JsonMapper jsonMapper = new JsonMapper();
// 拓展数据 // 拓展数据
String writeValueAsString = jsonMapper.writeValueAsString(imConversationCreate.getAttributes()); String attributesStr = JsonUtils.encodeJson(imConversationCreate.getAttributes());
imConversation.setAttributes(writeValueAsString);
imConversation.setAttributes(attributesStr);
imConversationService.save(imConversation); imConversationService.save(imConversation);
// 将创建者自己添加到会话 // 将创建者自己添加到会话
...@@ -286,12 +281,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -286,12 +281,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID content.put("passivityOperator", client2.getClientId()); //被操作的client ID
content.put("type", MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION.getUriCode()); //xx邀请xx加入会话 -1007 content.put("type", MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION.getUriCode()); //xx邀请xx加入会话 -1007
try { imMessage.setContent(JsonUtils.encodeJson(content));
String contentString = JSON_MAPPER.writeValueAsString(content);
imMessage.setContent(contentString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(messageId); imMessage.setId(messageId);
...@@ -402,13 +392,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -402,13 +392,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID content.put("passivityOperator", client2.getClientId()); //被操作的client ID
content.put("type", MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode()); //xx被xx移出会话 -1008 content.put("type", MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode()); //xx被xx移出会话 -1008
try { imMessage.setContent(JsonUtils.encodeJson(content));
String asString = JSON_MAPPER.writeValueAsString(content);
imMessage.setContent(asString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(messageId); imMessage.setId(messageId);
...@@ -511,13 +495,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -511,13 +495,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("type", MsgTypeEnum.LEAVE_CONVERSATION.getUriCode()); // xx主动退出会话 content.put("type", MsgTypeEnum.LEAVE_CONVERSATION.getUriCode()); // xx主动退出会话
try { String asString = JsonUtils.encodeJson(content);;
String asString = JSON_MAPPER.writeValueAsString(content); imMessage.setContent(asString);
imMessage.setContent(asString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(messageId); imMessage.setId(messageId);
...@@ -687,16 +666,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -687,16 +666,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
.notIn(ImConversationMembers::getId, imClientSender.getId()) .notIn(ImConversationMembers::getId, imClientSender.getId())
); );
JsonMapper jsonMapper = new JsonMapper(); String attributes = JsonUtils.encodeJson(imConversationAttrUpdate.getAttributes());
imConversationById.setAttributes(attributes);
try {
String attributes = jsonMapper.writeValueAsString(imConversationAttrUpdate.getAttributes());
imConversationById.setAttributes(attributes);
} catch (JsonProcessingException e) {
e.printStackTrace();
return ApiResult.fail();
}
boolean b = imConversationService.updateById(imConversationById); boolean b = imConversationService.updateById(imConversationById);
if (b) { if (b) {
...@@ -800,14 +771,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -800,14 +771,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询用户加入的所有会话 与每个会话的未读条数 成员 // 查询用户加入的所有会话 与每个会话的未读条数 成员
List<MyConversationListVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(client.getId()); List<MyConversationListVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(client.getId());
JsonMapper jsonMapper = new JsonMapper();
// 返回的 // 返回的
List<MyConversationListVo> myImConversationListAndMsgCountNew = new ArrayList<>(); List<MyConversationListVo> myImConversationListAndMsgCountNew = new ArrayList<>();
// 转换json格式 // 转换json格式
for (MyConversationListVo myconversationlistvo : myImConversationListAndMsgCount) { for (MyConversationListVo myconversationlistvo : myImConversationListAndMsgCount) {
HashMap attributess = jsonMapper.readValue(myconversationlistvo.getAttribute(), HashMap.class); HashMap attributess = JsonUtils.json2Map(myconversationlistvo.getAttribute());
myconversationlistvo.setAttributes(attributess); myconversationlistvo.setAttributes(attributess);
// 查询会话的最后一条消息 // 查询会话的最后一条消息
......
...@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApiMessageOnlineSend; import com.wecloud.im.entity.ImApiMessageOnlineSend;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
...@@ -27,9 +25,11 @@ import com.wecloud.im.vo.ImMessageOfflineListVo; ...@@ -27,9 +25,11 @@ import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto; import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponseModel; import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.model.request.PushModel; import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.sender.AsyncPush; import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.service.WriteDataService; import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
...@@ -55,8 +55,6 @@ import java.util.List; ...@@ -55,8 +55,6 @@ import java.util.List;
@Service @Service
public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMessage> implements ImMessageService { public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMessage> implements ImMessageService {
// private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired @Autowired
private ImMessageMapper imMessageMapper; private ImMessageMapper imMessageMapper;
...@@ -99,16 +97,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -99,16 +97,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
ImApiMessageOnlineSend imApiMessageOnlineSend = new ImApiMessageOnlineSend(); ImApiMessageOnlineSend imApiMessageOnlineSend = new ImApiMessageOnlineSend();
imApiMessageOnlineSend.setCreateTime(new Date()); imApiMessageOnlineSend.setCreateTime(new Date());
JsonMapper jsonMapper = new JsonMapper(); String attributes = JsonUtils.encodeJson(imMsgSendToOnlineClient.getContent());
imApiMessageOnlineSend.setContent(attributes);
try {
String attributes = jsonMapper.writeValueAsString(imMsgSendToOnlineClient.getContent());
imApiMessageOnlineSend.setContent(attributes);
} catch (JsonProcessingException e) {
e.printStackTrace();
return ApiResult.fail();
}
imApiMessageOnlineSend.setConversationId(imMsgSendToOnlineClient.getConversationId()); imApiMessageOnlineSend.setConversationId(imMsgSendToOnlineClient.getConversationId());
...@@ -141,15 +132,15 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -141,15 +132,15 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) public ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, ReceiveDataVO content) {
public ImMessage saveImMessage(ImApplication imApplication, ImClient imClientSender, Long toConversationId, long messageId, String content) {
ImMessage imMessage = new ImMessage(); ImMessage imMessage = new ImMessage();
imMessage.setId(messageId); imMessage.setId(messageId);
imMessage.setCreateTime(new Date()); imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId()); imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId()); imMessage.setSender(imClientSender.getId());
imMessage.setContent(content); String contentStr = JsonUtils.encodeJson(content);
imMessage.setContent(contentStr);
imMessage.setWithdraw(false); imMessage.setWithdraw(false);
imMessage.setEvent(false); imMessage.setEvent(false);
imMessage.setSystemFlag(false); imMessage.setSystemFlag(false);
...@@ -246,10 +237,10 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -246,10 +237,10 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId()); writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
// 获取自定义推送字段 // 获取自定义推送字段
PushModel pushModel = imMsgRecall.getPush(); PushVO pushVO = imMsgRecall.getPush();
// 异步推送系统通知消息 // 异步推送系统通知消息
asyncPush.push(pushModel, imClientReceiver, imApplication); asyncPush.push(pushVO, imClientReceiver, imApplication);
} }
return ApiResult.ok(); return ApiResult.ok();
...@@ -275,15 +266,8 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -275,15 +266,8 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
ImMessage imMessage = new ImMessage(); ImMessage imMessage = new ImMessage();
imMessage.setId(imMsgUpdate.getMsgId()); imMessage.setId(imMsgUpdate.getMsgId());
JsonMapper jsonMapper = new JsonMapper(); String content = JsonUtils.encodeJson(imMsgUpdate.getContent());
imMessage.setContent(content);
try {
String content = jsonMapper.writeValueAsString(imMsgUpdate.getContent());
imMessage.setContent(content);
} catch (JsonProcessingException e) {
e.printStackTrace();
return ApiResult.fail();
}
if (this.updateById(imMessage)) { if (this.updateById(imMessage)) {
return ApiResult.ok(); return ApiResult.ok();
......
...@@ -10,7 +10,7 @@ import java.io.Serializable; ...@@ -10,7 +10,7 @@ import java.io.Serializable;
* @Date 2019-12-05 * @Date 2019-12-05
*/ */
@Data @Data
public class PushModel implements Serializable { public class PushVO implements Serializable {
/** /**
* 标题 * 标题
......
package com.wecloud.im.ws.model.request;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
@Data
public class ReceiveDataVO implements Serializable {
/**
* push 对象
*/
private PushVO push;
/**
* 自定义的值
*/
private String diyAbcd;
/**
* 发送的会话id
*/
private Long toConversation;
/**
* 发送的type
*/
private Integer type;
/**
* 发送的内容文本
*/
private String text;
/**
* 自定义可扩展的发送字段和值
*/
private HashMap attrs;
}
package com.wecloud.im.ws.model.request; package com.wecloud.im.ws.model.request;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -15,10 +16,10 @@ import java.util.HashMap; ...@@ -15,10 +16,10 @@ import java.util.HashMap;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ReceiveModel implements Serializable { public class ReceiveVO implements Serializable {
/** /**
* 枚举类UriPathEnum 请求uri的编码 * 枚举类 {@link WsRequestCmdEnum } 请求uri的编码
* 由于websocket使用同一个通道发送数据,需要区分不同类型请求 * 由于websocket使用同一个通道发送数据,需要区分不同类型请求
*/ */
private Integer cmd; private Integer cmd;
...@@ -26,7 +27,7 @@ public class ReceiveModel implements Serializable { ...@@ -26,7 +27,7 @@ public class ReceiveModel implements Serializable {
/** /**
* json数据 * json数据
*/ */
private HashMap data; private ReceiveDataVO data;
/** /**
* 请求id, 以判空是否请求成功, 服务端处理完成后 返回此id * 请求id, 以判空是否请求成功, 服务端处理完成后 返回此id
......
package com.wecloud.im.ws.receive;
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.AbstractImCmdStrategy;
import com.wecloud.im.ws.strategy.ImCmdStrategyFactory;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Description ws 数据接收 转换类
* @Author hewei hwei1233@163.com
* @Date 2019-12-03
*/
@Service
public class WsDataReader {
private static final Logger log = LoggerFactory.getLogger(WsDataReader.class);
@Resource
private ImCmdStrategyFactory receiveStrategyContext;
@Resource
private WriteDataService writeDataService;
/**
* 在此开始进入业务流程子线程,将不占netty的io线程
*
* @param data
* @throws Exception
*/
public void convertModel(String data, ChannelHandlerContext ctx, String appKey, String clientId) throws Exception {
log.info("appWS收到data:" + data + "\nappKey+clientId:" + appKey + ":" + clientId +
",channelId:" + ctx.channel().id().asLongText());
// 解析json
JsonMapper jsonMapper = new JsonMapper();
ReceiveModel receiveModel = jsonMapper.readValue(data, ReceiveModel.class);
if (null == receiveModel || null == receiveModel.getCmd()) {
throw new BusinessException("null == receiveModel || null == receiveModel.getCmd()");
}
WsRequestCmdEnum wsRequestUriPathEnum = WsRequestCmdEnum.getByCode(receiveModel.getCmd());
// 使用策略模式, 根据不同类型请求调用不同实现类
AbstractImCmdStrategy cmdStrategy = receiveStrategyContext.getStrategy(wsRequestUriPathEnum);
cmdStrategy.process(receiveModel, ctx, data, appKey, clientId);
}
}
...@@ -9,7 +9,7 @@ import com.wecloud.im.entity.ImIosApns; ...@@ -9,7 +9,7 @@ import com.wecloud.im.entity.ImIosApns;
import com.wecloud.im.push.PushUtils; import com.wecloud.im.push.PushUtils;
import com.wecloud.im.service.ImInboxService; import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImIosApnsService; import com.wecloud.im.service.ImIosApnsService;
import com.wecloud.im.ws.model.request.PushModel; import com.wecloud.im.ws.model.request.PushVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -58,13 +58,13 @@ public class AsyncPush { ...@@ -58,13 +58,13 @@ public class AsyncPush {
* @param imClientReceiver * @param imClientReceiver
*/ */
@Async @Async
public void push(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) { public void push(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push:" + imClientReceiver.getClientId()); log.info("push:" + imClientReceiver.getClientId());
if (pushModel == null) { if (pushVO == null) {
pushModel = new PushModel(); pushVO = new PushVO();
pushModel.setTitle(PUSH_TITLE); pushVO.setTitle(PUSH_TITLE);
pushModel.setSubTitle(PUSH_BODY); pushVO.setSubTitle(PUSH_BODY);
} }
// 校验参数 // 校验参数
...@@ -80,10 +80,10 @@ public class AsyncPush { ...@@ -80,10 +80,10 @@ public class AsyncPush {
// 设备类型1:ios; 2:android // 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) { if (imClientReceiver.getDeviceType() == 1) {
ios(pushModel, imClientReceiver, imApplication); ios(pushVO, imClientReceiver, imApplication);
} else { } else {
android(pushModel, imClientReceiver, imApplication); android(pushVO, imClientReceiver, imApplication);
} }
} }
...@@ -97,21 +97,21 @@ public class AsyncPush { ...@@ -97,21 +97,21 @@ public class AsyncPush {
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) { public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push:" + imClientReceiver.getClientId()); log.info("push:" + imClientReceiver.getClientId());
PushModel pushModel = new PushModel(); PushVO pushVO = new PushVO();
if (pushMap == null || pushMap.isEmpty()) { if (pushMap == null || pushMap.isEmpty()) {
pushModel.setTitle(PUSH_TITLE); pushVO.setTitle(PUSH_TITLE);
pushModel.setSubTitle(PUSH_BODY); pushVO.setSubTitle(PUSH_BODY);
} else { } else {
pushModel.setTitle(pushMap.get(TITLE)); pushVO.setTitle(pushMap.get(TITLE));
pushModel.setSubTitle(pushMap.get(SUB_TITLE)); pushVO.setSubTitle(pushMap.get(SUB_TITLE));
} }
this.push(pushModel, imClientReceiver, imApplication); this.push(pushVO, imClientReceiver, imApplication);
} }
private void android(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) { private void android(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getAndroidPushChannel() == null) { if (imApplication.getAndroidPushChannel() == null) {
return; return;
...@@ -127,7 +127,7 @@ public class AsyncPush { ...@@ -127,7 +127,7 @@ public class AsyncPush {
// 安卓 单推 // 安卓 单推
String deviceToken = imClientReceiver.getDeviceToken(); String deviceToken = imClientReceiver.getDeviceToken();
try { try {
pushUtils.sendIOSUnicast(deviceToken, pushModel.getTitle(), pushModel.getSubTitle(), PUSH_BODY); pushUtils.sendIOSUnicast(deviceToken, pushVO.getTitle(), pushVO.getSubTitle(), PUSH_BODY);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -137,7 +137,7 @@ public class AsyncPush { ...@@ -137,7 +137,7 @@ public class AsyncPush {
//firebase:2 //firebase:2
log.info("android_firebase"); log.info("android_firebase");
firebase(pushModel, imClientReceiver, imApplication); firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getAndroidPushChannel() == 3) { } else if (imApplication.getAndroidPushChannel() == 3) {
// 信鸽3 // 信鸽3
...@@ -149,7 +149,7 @@ public class AsyncPush { ...@@ -149,7 +149,7 @@ public class AsyncPush {
} }
} }
private void ios(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) { private void ios(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getIosPushChannel() == null) { if (imApplication.getIosPushChannel() == null) {
return; return;
...@@ -165,9 +165,9 @@ public class AsyncPush { ...@@ -165,9 +165,9 @@ public class AsyncPush {
// 安卓单推 // 安卓单推
String deviceToken = imClientReceiver.getDeviceToken(); String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text"; String unicastText = "Android unicast text";
String unicastTicker = pushModel.getSubTitle(); String unicastTicker = pushVO.getSubTitle();
try { try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, pushModel.getTitle()); pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, pushVO.getTitle());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -178,20 +178,20 @@ public class AsyncPush { ...@@ -178,20 +178,20 @@ public class AsyncPush {
log.info("firebase"); log.info("firebase");
firebase(pushModel, imClientReceiver, imApplication); firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getIosPushChannel() == 3) { } else if (imApplication.getIosPushChannel() == 3) {
// apns原生:3 // apns原生:3
log.info("apns原生"); log.info("apns原生");
apnsPush(pushModel, imClientReceiver, imApplication); apnsPush(pushVO, imClientReceiver, imApplication);
} else { } else {
log.info("没有找到推送类型"); log.info("没有找到推送类型");
} }
} }
public void firebase(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) { public void firebase(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
String jsonStr = null; String jsonStr = null;
try { try {
URL url = new URL(API_URL_FCM); URL url = new URL(API_URL_FCM);
...@@ -208,8 +208,8 @@ public class AsyncPush { ...@@ -208,8 +208,8 @@ public class AsyncPush {
//推送到哪台客户端机器 //推送到哪台客户端机器
json.put("to", imClientReceiver.getDeviceToken()); json.put("to", imClientReceiver.getDeviceToken());
JSONObject info = new JSONObject(); JSONObject info = new JSONObject();
info.put("title", pushModel.getTitle()); info.put("title", pushVO.getTitle());
info.put("body", pushModel.getSubTitle()); info.put("body", pushVO.getSubTitle());
//数据消息data 通知消息 notification //数据消息data 通知消息 notification
json.put("notification", info); json.put("notification", info);
...@@ -232,13 +232,13 @@ public class AsyncPush { ...@@ -232,13 +232,13 @@ public class AsyncPush {
} }
} }
private void apnsPush(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) { private void apnsPush(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
// 查询apns证书 // 查询apns证书
ImIosApns apns = imIosApnsService.getImIosApnsByAppId(imApplication.getId()); ImIosApns apns = imIosApnsService.getImIosApnsByAppId(imApplication.getId());
Map<String, Object> customProperty = new HashMap<String, Object>(1); Map<String, Object> customProperty = new HashMap<String, Object>(1);
String deviceToken = imClientReceiver.getDeviceToken(); String deviceToken = imClientReceiver.getDeviceToken();
String alertTitle = pushModel.getTitle(); String alertTitle = pushVO.getTitle();
String alertBody = pushModel.getSubTitle(); String alertBody = pushVO.getSubTitle();
// 统计未读消息数量 // 统计未读消息数量
int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId()); int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId());
String topicBundleId = apns.getBundleId(); String topicBundleId = apns.getBundleId();
......
...@@ -2,7 +2,7 @@ package com.wecloud.im.ws.service; ...@@ -2,7 +2,7 @@ package com.wecloud.im.ws.service;
import com.wecloud.im.ws.model.WsResponseModel; import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.model.request.ReceiveModel; import com.wecloud.im.ws.model.request.ReceiveVO;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
...@@ -16,10 +16,10 @@ public interface WriteDataService { ...@@ -16,10 +16,10 @@ public interface WriteDataService {
/** /**
* 可自定义状态码 带data * 可自定义状态码 带data
* *
* @param receiveModel * @param receiveVO
* @param data * @param data
*/ */
void dataAndStatus(ReceiveModel receiveModel, ApiCode apiCode, Object data, String toAppKey, String toClientId); void dataAndStatus(ReceiveVO receiveVO, ApiCode apiCode, Object data, String toAppKey, String toClientId);
/** /**
* 固定"成功"状态码 带data * 固定"成功"状态码 带data
...@@ -27,21 +27,21 @@ public interface WriteDataService { ...@@ -27,21 +27,21 @@ public interface WriteDataService {
* @param requestModel * @param requestModel
* @param data * @param data
*/ */
void successAndData(ReceiveModel requestModel, Object data, String toAppKey, String toClientId); void successAndData(ReceiveVO requestModel, Object data, String toAppKey, String toClientId);
/** /**
* 固定"成功"状态码 无data * 固定"成功"状态码 无data
* *
* @param requestModel * @param requestModel
*/ */
void nullDataSuccess(ReceiveModel requestModel, ApiCode apiCode, String toAppKey, String toClientId); void nullDataSuccess(ReceiveVO requestModel, ApiCode apiCode, String toAppKey, String toClientId);
/** /**
* 固定"参数错误"状态码 无data * 固定"参数错误"状态码 无data
* *
* @param requestModel * @param requestModel
*/ */
void paramErrorAndNullData(ReceiveModel requestModel, String toAppKey, String toClientId); void paramErrorAndNullData(ReceiveVO requestModel, String toAppKey, String toClientId);
/** /**
* 调用ws处理响应逻辑 * 调用ws处理响应逻辑
......
package com.wecloud.im.ws.service.impl; package com.wecloud.im.ws.service.impl;
import cn.hutool.core.thread.ThreadFactoryBuilder; import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.router.RouterSendService; import com.wecloud.im.router.RouterSendService;
import com.wecloud.im.ws.cache.UserCacheService; import com.wecloud.im.ws.cache.UserCacheService;
import com.wecloud.im.ws.model.WsResponseModel; import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.model.redis.ClientChannelInfo; import com.wecloud.im.ws.model.redis.ClientChannelInfo;
import com.wecloud.im.ws.model.request.ReceiveModel; import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.service.MangerChannelService; import com.wecloud.im.ws.service.MangerChannelService;
import com.wecloud.im.ws.service.WriteDataService; import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.im.ws.utils.InitIp; import com.wecloud.im.ws.utils.InitIp;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
...@@ -53,61 +52,38 @@ public class WriteDataServiceImpl implements WriteDataService { ...@@ -53,61 +52,38 @@ public class WriteDataServiceImpl implements WriteDataService {
private RouterSendService routerSendService; private RouterSendService routerSendService;
@Override @Override
public void successAndData(ReceiveModel receiveModel, Object data, String toAppKey, String toClientId) { public void successAndData(ReceiveVO receiveVO, Object data, String toAppKey, String toClientId) {
this.dataAndStatus(receiveModel, ApiCode.SUCCESS, data, toAppKey, toClientId); this.dataAndStatus(receiveVO, ApiCode.SUCCESS, data, toAppKey, toClientId);
} }
@Override @Override
public void nullDataSuccess(ReceiveModel receiveModel, ApiCode apiCode, String toAppKey, String toClientId) { public void nullDataSuccess(ReceiveVO receiveVO, ApiCode apiCode, String toAppKey, String toClientId) {
this.dataAndStatus(receiveModel, apiCode, new HashMap<>(1), toAppKey, toClientId); this.dataAndStatus(receiveVO, apiCode, new HashMap<>(1), toAppKey, toClientId);
} }
@Override @Override
public void paramErrorAndNullData(ReceiveModel receiveModel, String toAppKey, String toClientId) { public void paramErrorAndNullData(ReceiveVO receiveVO, String toAppKey, String toClientId) {
// this.nullDataSuccess(requestModel, ResultStatus.PARAM_ERROR, userId); // this.nullDataSuccess(requestModel, ResultStatus.PARAM_ERROR, userId);
} }
@Override @Override
public void dataAndStatus(ReceiveModel receiveModel, ApiCode apiCode, Object data, String toAppKey, String toClientId) { public void dataAndStatus(ReceiveVO receiveVO, ApiCode apiCode, Object data, String toAppKey, String toClientId) {
ApiResult<Boolean> apiResult = ApiResult.result(apiCode); ApiResult<Boolean> apiResult = ApiResult.result(apiCode);
WsResponseModel responseModel = new WsResponseModel(); WsResponseModel responseModel = new WsResponseModel();
responseModel.setMsg(apiResult.getMessage()); responseModel.setMsg(apiResult.getMessage());
responseModel.setCmd(receiveModel.getCmd()); responseModel.setCmd(receiveVO.getCmd());
responseModel.setReqId(receiveModel.getReqId()); responseModel.setReqId(receiveVO.getReqId());
responseModel.setData(data); responseModel.setData(data);
responseModel.setCode(apiResult.getCode()); responseModel.setCode(apiResult.getCode());
this.write(responseModel, toAppKey, toClientId); this.write(responseModel, toAppKey, toClientId);
} }
// @Override
// public void write(WsResponseModel responseModel, String toAppKey, String toClientId) {
//// WRITE_TASK_THREAD_POOL_EXECUTOR.execute(
//// () -> {
// JsonMapper jsonMapper = new JsonMapper();
// String json = null;
// try {
// json = jsonMapper.writeValueAsString(responseModel);
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
// mangerChannelService.writeData(json, toAppKey, toClientId);
// }
// );
//}
@Override @Override
public void write(WsResponseModel responseModel, String toAppKey, String toClientId) { public void write(WsResponseModel responseModel, String toAppKey, String toClientId) {
JsonMapper jsonMapper = new JsonMapper(); String msgJson = JsonUtils.encodeJson(responseModel);
String msgJson = null;
try {
msgJson = jsonMapper.writeValueAsString(responseModel);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
List<ClientChannelInfo> channelInfos = userCacheService.getIpByClientIdAndOnline(toAppKey, toClientId); List<ClientChannelInfo> channelInfos = userCacheService.getIpByClientIdAndOnline(toAppKey, toClientId);
...@@ -130,14 +106,7 @@ public class WriteDataServiceImpl implements WriteDataService { ...@@ -130,14 +106,7 @@ public class WriteDataServiceImpl implements WriteDataService {
@Override @Override
public void response(WsResponseModel responseModel, NioSocketChannel nioSocketChannel) { public void response(WsResponseModel responseModel, NioSocketChannel nioSocketChannel) {
JsonMapper jsonMapper = new JsonMapper(); String msgJson = JsonUtils.encodeJson(responseModel);
String msgJson = null;
try {
msgJson = jsonMapper.writeValueAsString(responseModel);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 本地直接下发 // 本地直接下发
nioSocketChannel.writeAndFlush(new TextWebSocketFrame(msgJson)); nioSocketChannel.writeAndFlush(new TextWebSocketFrame(msgJson));
......
package com.wecloud.im.ws.strategy; package com.wecloud.im.ws.strategy;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.ws.model.request.ReceiveModel; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.utils.SpringBeanUtils;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
/** /**
* @Description 处理Cmd请求 * @Description 处理Cmd请求
...@@ -11,13 +21,69 @@ import io.netty.channel.ChannelHandlerContext; ...@@ -11,13 +21,69 @@ import io.netty.channel.ChannelHandlerContext;
* @Author hewei hwei1233@163.com * @Author hewei hwei1233@163.com
* @Date 2020-01-02 * @Date 2020-01-02
*/ */
@Slf4j
public abstract class AbstractImCmdStrategy { public abstract class AbstractImCmdStrategy {
private static ImCmdStrategyFactory imCmdStrategyFactory;
private static ImApplicationService imApplicationService;
private static ImClientService imClientService;
public static void process(String appKey, String clientId, ChannelHandlerContext ctx, String data) throws JsonProcessingException {
if(log.isDebugEnabled()) {
log.debug("appWS收到data: {}\n appKey:{}, clientId:{}, channelId:{}", data, appKey, clientId, ctx.channel().id().asLongText());
}
if(imCmdStrategyFactory == null) {
synchronized (AbstractImCmdStrategy.class) {
// 双空判断,懒汉模式下的绝对线程安全
if(imCmdStrategyFactory == null) {
imCmdStrategyFactory = SpringBeanUtils.getBean(ImCmdStrategyFactory.class);
imApplicationService = SpringBeanUtils.getBean(ImApplicationService.class);
imClientService = SpringBeanUtils.getBean(ImClientService.class);
}
}
}
// 解析jsonO
ReceiveVO receiveVO = JsonUtils.decodeJson(data, ReceiveVO.class);
if (null == receiveVO || null == receiveVO.getCmd()) {
throw new BusinessException("null == receiveVO || null == receiveVO.getCmd()");
}
WsRequestCmdEnum wsRequestPathEnum = WsRequestCmdEnum.getByCode(receiveVO.getCmd());
// 使用策略模式, 根据不同类型请求调用不同实现类
AbstractImCmdStrategy cmdStrategy = imCmdStrategyFactory.getStrategy(wsRequestPathEnum);
// 查询imApplication
ImApplication imApplication = imApplicationService.getOneByAppKey(appKey);
if (imApplication == null) {
log.warn("根据appKey: {} 查找不到 imApplication!", appKey);
return;
}
// 查询发送者client
ImClient imClientSender = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientId));
if (imClientSender == null) {
log.warn("根据appKey: {} 查找不到 imClientSender!", imApplication.getAppKey());
return;
}
cmdStrategy.process(imApplication, imClientSender, ctx, receiveVO);
}
/** /**
* 处理业务流程 * 处理业务流程
* *
* @param requestModel * @param imApplication
* @param imSender
* @param ctx
* @param receiveVO
* @throws Exception * @throws Exception
*/ */
public abstract void process(ReceiveModel requestModel, ChannelHandlerContext ctx, String data, String appKey, String clientId) throws JsonProcessingException; public abstract void process(ImApplication imApplication, ImClient imSender, ChannelHandlerContext ctx, ReceiveVO receiveVO);
} }
package com.wecloud.im.ws.strategy; package com.wecloud.im.ws.strategy;
import com.wecloud.im.ws.annotation.ImCmdType;
import com.wecloud.im.ws.enums.WsRequestCmdEnum; import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.utils.ClassScanner;
import com.wecloud.im.ws.utils.SpringBeanUtils; import com.wecloud.im.ws.utils.SpringBeanUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* @Description 策略模式 上下文 * @Description 策略模式 上下文
* 维护指令码与策略实现的对应 * 维护指令码与策略实现的对应
* @Author hewei hwei1233@163.com * @Author hewei hwei1233@163.com
*/ */
@Component
public class ImCmdStrategyFactory { public class ImCmdStrategyFactory {
private final Map<WsRequestCmdEnum, Class> strategyMap; private final Map<WsRequestCmdEnum, AbstractImCmdStrategy> strategyMap = new HashMap<>();
public ImCmdStrategyFactory(Map<WsRequestCmdEnum, Class> strategyMap) {
this.strategyMap = strategyMap;
}
public AbstractImCmdStrategy getStrategy(WsRequestCmdEnum wsRequestPathEnum) { public AbstractImCmdStrategy getStrategy(WsRequestCmdEnum wsRequestPathEnum) {
...@@ -29,12 +35,19 @@ public class ImCmdStrategyFactory { ...@@ -29,12 +35,19 @@ public class ImCmdStrategyFactory {
throw new IllegalArgumentException("strategy map is empty,please check you strategy package path"); throw new IllegalArgumentException("strategy map is empty,please check you strategy package path");
} }
Class aClass = strategyMap.get(wsRequestPathEnum); return strategyMap.get(wsRequestPathEnum);
}
if (aClass == null) { @EventListener(ApplicationStartedEvent.class)
throw new IllegalArgumentException("not fond strategy for type:" + wsRequestPathEnum.getCmdCode()); private void init() {
}
// 扫码ReceiveTypeAnnotation注解的类
Set<Class<?>> classSet = ClassScanner.scan(ImCmdStrategyFactory.class.getPackage().getName(), ImCmdType.class);
return (AbstractImCmdStrategy) SpringBeanUtils.getBean(aClass); classSet.forEach(clazz -> {
// 获取注解中的类型值,与枚举类一一对应
WsRequestCmdEnum type = clazz.getAnnotation(ImCmdType.class).type();
strategyMap.put(type, (AbstractImCmdStrategy)SpringBeanUtils.getBean(clazz));
});
} }
} }
package com.wecloud.im.ws.strategy;
import com.google.common.collect.Maps;
import com.wecloud.im.ws.annotation.ImCmdType;
import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.utils.ClassScanner;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Set;
/**
* @Description 策略 bean注解扫描注册类
* 扫描自定义注解,将指令码与实现类绑定,将对应关系添加到上下文对象中
* <p>
* BeanStrategyProcessor是spring在容器初始化后对外暴露的扩展点,
* spring ioc容器允许beanFactoryPostProcessor在容器加载注册BeanDefinition后读取BeanDefinition,并能修改它。
* @Author hewei hwei1233@163.com
* @Date 2020-01-02
*/
@Component
public class ImCmdStrategyProcessor implements BeanFactoryPostProcessor {
// 扫码注解的包路径
// private static final String STRATEGY_PACK = "com.wecloud.im.ws.strategy.concrete";
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
Map<WsRequestCmdEnum, Class> handlerMap = Maps.newHashMapWithExpectedSize(5);
// 扫码ReceiveTypeAnnotation注解的类
Set<Class<?>> classSet = ClassScanner.scan(ImCmdStrategyProcessor.class.getPackage().getName(), ImCmdType.class);
classSet.forEach(clazz -> {
// 获取注解中的类型值,与枚举类一一对应
WsRequestCmdEnum type = clazz.getAnnotation(ImCmdType.class).type();
handlerMap.put(type, clazz);
});
// 初始化Contenxt, 将其注册到spring容器当中
ImCmdStrategyFactory context = new ImCmdStrategyFactory(handlerMap);
try {
configurableListableBeanFactory.registerResolvableDependency(Class.forName(ImCmdStrategyFactory.class.getName()), context);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
...@@ -2,14 +2,12 @@ package com.wecloud.im.ws.strategy.concrete; ...@@ -2,14 +2,12 @@ package com.wecloud.im.ws.strategy.concrete;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImInbox; import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService; import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
...@@ -19,17 +17,18 @@ import com.wecloud.im.ws.annotation.ImCmdType; ...@@ -19,17 +17,18 @@ import com.wecloud.im.ws.annotation.ImCmdType;
import com.wecloud.im.ws.enums.WsRequestCmdEnum; import com.wecloud.im.ws.enums.WsRequestCmdEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponseModel; import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.model.request.ReceiveModel; import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.sender.AsyncPush; import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.service.WriteDataService; import com.wecloud.im.ws.service.WriteDataService;
import com.wecloud.im.ws.strategy.AbstractImCmdStrategy; import com.wecloud.im.ws.strategy.AbstractImCmdStrategy;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.util.SnowflakeUtil; import io.geekidea.springbootplus.framework.shiro.util.SnowflakeUtil;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -45,10 +44,7 @@ import java.util.List; ...@@ -45,10 +44,7 @@ import java.util.List;
@Slf4j @Slf4j
public class NormalChatStrategy extends AbstractImCmdStrategy { public class NormalChatStrategy extends AbstractImCmdStrategy {
public static final String PUSH_KEY = "push";
public static final String MSG_ID = "msgId"; public static final String MSG_ID = "msgId";
private static final String TO_CONVERSATION_KEY = "toConversation";
private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired @Autowired
private ImClientBlacklistService imClientBlacklistService; private ImClientBlacklistService imClientBlacklistService;
...@@ -63,9 +59,6 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -63,9 +59,6 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
private ImInboxService imInboxService; private ImInboxService imInboxService;
@Autowired @Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImConversationMembersService imConversationMembersService; private ImConversationMembersService imConversationMembersService;
@Autowired @Autowired
...@@ -75,62 +68,32 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -75,62 +68,32 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
private AsyncPush systemPush; private AsyncPush systemPush;
@Override @Override
public void process(ReceiveModel receiveModel, ChannelHandlerContext ctx, String data, String appKey, String clientId) throws JsonProcessingException { public void process(ImApplication imApplication, ImClient imSender, ChannelHandlerContext ctx, ReceiveVO receiveVO) {
NioSocketChannel channel = (NioSocketChannel) ctx.channel(); NioSocketChannel channel = (NioSocketChannel) ctx.channel();
// 查询imApplication
ImApplication imApplication = imApplicationService.getOneByAppKey(appKey);
if (imApplication == null) {
log.info("imApplication为空");
return;
}
// 查询发送者client
ImClient imClientSender = getClientSender(clientId, imApplication);
if (imClientSender == null) {
return;
}
// 获取会话id // 获取会话id
if (receiveModel.getData().get(TO_CONVERSATION_KEY) == null) { if (receiveVO.getData().getToConversation() == null) {
log.warn("会话消息reqId: {} 不合法,缺少会话id!", receiveVO.getReqId());
return; return;
} }
Long toConversationId = Long.valueOf(receiveModel.getData().get(TO_CONVERSATION_KEY).toString()); Long toConversationId = receiveVO.getData().getToConversation();
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, toConversationId) .eq(ImConversationMembers::getFkConversationId, toConversationId)
.notIn(ImConversationMembers::getFkClientId, imClientSender.getId()) .notIn(ImConversationMembers::getFkClientId, imSender.getId())
); );
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + toConversationId); log.info("查询会话所有成员返回空,会话ID: {}", toConversationId);
return; return;
} }
receiveModel.getData().remove(TO_CONVERSATION_KEY);
// 获取自定义推送字段
HashMap<String, String> pushMap = null;
if (receiveModel.getData().get(PUSH_KEY) != null) {
pushMap = (HashMap<String, String>) receiveModel.getData().get(PUSH_KEY);
receiveModel.getData().remove(PUSH_KEY);
}
String content = null;
try {
content = JSON_MAPPER.writeValueAsString(receiveModel.getData());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 判断为单聊 // 判断为单聊
if (membersList.size() == 1) { if (membersList.size() == 1) {
// 判断是否被拉黑逻辑 // 判断是否被拉黑逻辑
if (black(receiveModel, appKey, clientId, imClientSender, membersList, channel)) { if (black(receiveVO, imSender, membersList, channel)) {
return; return;
} }
} }
...@@ -138,15 +101,21 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -138,15 +101,21 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId(); long messageId = SnowflakeUtil.getId();
// 入库 保存消息至消息表 // 入库 保存消息至消息表
ImMessage imMessage = imMessageService.saveImMessage(imApplication, imClientSender, toConversationId, messageId, content); ImMessage imMessage = imMessageService.saveImMessage(imApplication, imSender, toConversationId, messageId, receiveVO.getData());
// 封装响应的实体 // 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
BeanUtils.copyProperties(imMessage, imMessageOnlineSend);
imMessageOnlineSend.setMsgId(imMessage.getId()); imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setSender(clientId); imMessageOnlineSend.setSender(imSender.getClientId());
imMessageOnlineSend.setContent(receiveModel.getData()); HashMap<String, Object> content = JsonUtils.decodeJson2Map(JsonUtils.encodeJson(receiveVO.getData()));
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(toConversationId); imMessageOnlineSend.setConversationId(toConversationId);
imMessageOnlineSend.setCreateTime(imMessage.getCreateTime());
imMessageOnlineSend.setWithdrawTime(imMessage.getWithdrawTime());
imMessageOnlineSend.setWithdraw(imMessage.getWithdraw());
imMessageOnlineSend.setEvent(imMessage.getEvent());
imMessageOnlineSend.setSystem(imMessage.getSystemFlag());
imMessageOnlineSend.setAt(imMessage.getAt());
// 遍历发送 // 遍历发送
for (ImConversationMembers conversationMembers : membersList) { for (ImConversationMembers conversationMembers : membersList) {
...@@ -170,14 +139,14 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -170,14 +139,14 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
responseModel.setMsg(result.getMessage()); responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend); responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null); responseModel.setReqId(null);
writeDataService.write(responseModel, appKey, imClientReceiver.getClientId()); writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
// 异步推送系统通知消息 // 异步推送系统通知消息
systemPush.push(pushMap, imClientReceiver, imApplication); systemPush.push(receiveVO.getData().getPush(), imClientReceiver, imApplication);
} }
// 响应发送方消息id等信息 // 响应发送方消息id等信息
response(receiveModel, messageId, channel); response(receiveVO, messageId, channel);
} }
...@@ -206,10 +175,10 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -206,10 +175,10 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
/** /**
* 响应发送方消息id等信息 * 响应发送方消息id等信息
* *
* @param receiveModel * @param receiveVO
* @param messageId * @param messageId
*/ */
private void response(ReceiveModel receiveModel, long messageId, NioSocketChannel channel) { private void response(ReceiveVO receiveVO, long messageId, NioSocketChannel channel) {
WsResponseModel<HashMap<String, Long>> responseModel = new WsResponseModel<>(); WsResponseModel<HashMap<String, Long>> responseModel = new WsResponseModel<>();
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS); ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode()); responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
...@@ -218,35 +187,21 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -218,35 +187,21 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
HashMap<String, Long> stringHashMap = new HashMap<>(3); HashMap<String, Long> stringHashMap = new HashMap<>(3);
stringHashMap.put(MSG_ID, messageId); stringHashMap.put(MSG_ID, messageId);
responseModel.setData(stringHashMap); responseModel.setData(stringHashMap);
responseModel.setReqId(receiveModel.getReqId()); responseModel.setReqId(receiveVO.getReqId());
// 响应发送方 // 响应发送方
// writeDataService.write(responseModel, appKey, clientId); // writeDataService.write(responseModel, appKey, clientId);
writeDataService.response(responseModel, channel); writeDataService.response(responseModel, channel);
} }
private ImClient getClientSender(String clientUniId, ImApplication imApplication) {
ImClient imClientSender = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientUniId));
if (imClientSender == null) {
log.info("imClientSender为空");
return null;
}
return imClientSender;
}
/** /**
* 判断是否被拉黑 * 判断是否被拉黑
* *
* @param receiveModel * @param receiveVO
* @param appKey
* @param clientUniId
* @param imClientSender * @param imClientSender
* @param membersList * @param membersList
* @return * @return
*/ */
private boolean black(ReceiveModel receiveModel, String appKey, String clientUniId, ImClient imClientSender, List<ImConversationMembers> membersList, NioSocketChannel channel) { private boolean black(ReceiveVO receiveVO, ImClient imClientSender, List<ImConversationMembers> membersList, NioSocketChannel channel) {
// 判断是否被拉黑 // 判断是否被拉黑
boolean beBlack = imClientBlacklistService.isBeBlack(membersList.get(0).getFkClientId(), imClientSender.getId()); boolean beBlack = imClientBlacklistService.isBeBlack(membersList.get(0).getFkClientId(), imClientSender.getId());
if (beBlack) { if (beBlack) {
...@@ -258,7 +213,7 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -258,7 +213,7 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode()); responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(result.getCode()); responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage()); responseModel.setMsg(result.getMessage());
responseModel.setReqId(receiveModel.getReqId()); responseModel.setReqId(receiveVO.getReqId());
// writeDataService.write(responseModel, appKey, clientUniId); // writeDataService.write(responseModel, appKey, clientUniId);
writeDataService.response(responseModel, channel); writeDataService.response(responseModel, channel);
...@@ -276,7 +231,7 @@ public class NormalChatStrategy extends AbstractImCmdStrategy { ...@@ -276,7 +231,7 @@ public class NormalChatStrategy extends AbstractImCmdStrategy {
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode()); responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(result.getCode()); responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage()); responseModel.setMsg(result.getMessage());
responseModel.setReqId(receiveModel.getReqId()); responseModel.setReqId(receiveVO.getReqId());
// writeDataService.write(responseModel, appKey, clientUniId); // writeDataService.write(responseModel, appKey, clientUniId);
writeDataService.response(responseModel, channel); writeDataService.response(responseModel, channel);
......
//package com.wecloud.im.ws.strategy.concrete; //package com.wecloud.im.ws.strategy.concrete;
// //
//import com.fasterxml.jackson.core.JsonProcessingException; //import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.json.JsonMapper;
//import com.wecloud.im.service.ImApplicationService; //import com.wecloud.im.service.ImApplicationService;
//import com.wecloud.im.service.ImClientBlacklistService; //import com.wecloud.im.service.ImClientBlacklistService;
//import com.wecloud.im.service.ImClientService; //import com.wecloud.im.service.ImClientService;
...@@ -10,7 +9,7 @@ ...@@ -10,7 +9,7 @@
//import com.wecloud.im.service.ImMessageService; //import com.wecloud.im.service.ImMessageService;
//import com.wecloud.im.ws.annotation.ImCmdType; //import com.wecloud.im.ws.annotation.ImCmdType;
//import com.wecloud.im.ws.enums.WsRequestCmdEnum; //import com.wecloud.im.ws.enums.WsRequestCmdEnum;
//import com.wecloud.im.ws.model.request.ReceiveModel; //import com.wecloud.im.ws.model.request.ReceiveVO;
//import com.wecloud.im.ws.sender.PushTask; //import com.wecloud.im.ws.sender.PushTask;
//import com.wecloud.im.ws.service.WriteDataService; //import com.wecloud.im.ws.service.WriteDataService;
//import com.wecloud.im.ws.strategy.AbstractImCmdStrategy; //import com.wecloud.im.ws.strategy.AbstractImCmdStrategy;
...@@ -28,9 +27,6 @@ ...@@ -28,9 +27,6 @@
//@Slf4j //@Slf4j
//public class SingleRtcStrategy extends AbstractImCmdStrategy { //public class SingleRtcStrategy extends AbstractImCmdStrategy {
// //
//
// private static final JsonMapper JSON_MAPPER = new JsonMapper();
//
// @Autowired // @Autowired
// private ImClientBlacklistService imClientBlacklistService; // private ImClientBlacklistService imClientBlacklistService;
// //
...@@ -56,7 +52,7 @@ ...@@ -56,7 +52,7 @@
// private PushTask systemPush; // private PushTask systemPush;
// //
// @Override // @Override
// public void process(ReceiveModel receiveModel, ChannelHandlerContext ctx, String data, String appKey, String clientId) throws JsonProcessingException { // public void process(ReceiveVO receiveModel, ChannelHandlerContext ctx, String data, String appKey, String clientId) throws JsonProcessingException {
// //
// // 指令判空 // // 指令判空
// if (receiveModel.getData().get(RtcSubCmd.SUB_CMD) == null) { // if (receiveModel.getData().get(RtcSubCmd.SUB_CMD) == null) {
......
package com.wecloud.rtc.service.impl; package com.wecloud.rtc.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.ws.utils.RedisUtils; import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.rtc.entity.redis.RtcChannelInfo; import com.wecloud.rtc.entity.redis.RtcChannelInfo;
import com.wecloud.rtc.entity.redis.RtcRedisKey; import com.wecloud.rtc.entity.redis.RtcRedisKey;
import com.wecloud.rtc.service.MangerRtcCacheService; import com.wecloud.rtc.service.MangerRtcCacheService;
import com.wecloud.utils.JsonUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -47,8 +47,7 @@ public class MangerRtcCacheServiceImpl implements MangerRtcCacheService { ...@@ -47,8 +47,7 @@ public class MangerRtcCacheServiceImpl implements MangerRtcCacheService {
return null; return null;
} }
JsonMapper jsonMapper = new JsonMapper(); return JsonUtils.decodeJson(value, RtcChannelInfo.class);
return jsonMapper.readValue(value, RtcChannelInfo.class);
} }
...@@ -65,7 +64,7 @@ public class MangerRtcCacheServiceImpl implements MangerRtcCacheService { ...@@ -65,7 +64,7 @@ public class MangerRtcCacheServiceImpl implements MangerRtcCacheService {
//创建时间 //创建时间
rtcChannelInfo.setCreateTimestamp(System.currentTimeMillis()); rtcChannelInfo.setCreateTimestamp(System.currentTimeMillis());
String rtcChannelInfoJson = new JsonMapper().writeValueAsString(rtcChannelInfo); String rtcChannelInfoJson = JsonUtils.encodeJson(rtcChannelInfo);
// --- 保存频道信息 // --- 保存频道信息
String channelKey = String.format(RtcRedisKey.RTC_CHANNEL_INFO, rtcChannelId); String channelKey = String.format(RtcRedisKey.RTC_CHANNEL_INFO, rtcChannelId);
......
...@@ -19,7 +19,6 @@ import org.springframework.stereotype.Service; ...@@ -19,7 +19,6 @@ import org.springframework.stereotype.Service;
@Service @Service
public class WsRtcWriteImpl implements WsRtcWrite { public class WsRtcWriteImpl implements WsRtcWrite {
// private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired @Autowired
private WriteDataService writeDataService; private WriteDataService writeDataService;
......
package com.wecloud.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
* fasterxml 的json工具类
*
* @author lixiaozhong
*/
@Slf4j
public class JsonUtils {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
/**
* Json格式的字符串向JavaBean转换,传入空串将返回null
*
* @param strJsonBody Json格式的字符串
* @param c 目标JavaBean类型
* @return JavaBean对象, 如果解析失败返回 null
*/
public static <T> T decodeJson(String strJsonBody, Class<T> c) {
if (StringUtils.isEmpty(strJsonBody)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(strJsonBody, c);
} catch (IOException e) {
log.warn("解析json字符串失败,原字符串: {}", strJsonBody);
return null;
}
}
/**
* Json格式的字符串向JavaBean转换,传入空串将返回null (显式抛出异常)
*
* @param strJsonBody Json格式的字符串
* @param c 目标JavaBean类型
* @return JavaBean对象
* @throws IOException
*/
public static <T> T json2Object(String strJsonBody, Class<T> c) throws IOException {
if (StringUtils.isEmpty(strJsonBody)) {
return null;
}
return OBJECT_MAPPER.readValue(strJsonBody, c);
}
/**
* Json格式的字符串向HashMap转换,传入空串将返回空map (显式抛出异常)
*
* @param strJsonBody Json格式的字符串
* @return HashMap对象
* @throws IOException
*/
public static HashMap<String, Object> json2Map(String strJsonBody) throws IOException {
if (StringUtils.isEmpty(strJsonBody)) {
return new HashMap<String, Object>();
}
return OBJECT_MAPPER.readValue(strJsonBody, HashMap.class);
}
/**
* Json格式的字符串向HashMap转换,传入空串将返回空map
*
* @param strJsonBody Json格式的字符串
* @return HashMap对象
* @throws IOException
*/
public static HashMap<String, Object> decodeJson2Map(String strJsonBody) {
if (StringUtils.isEmpty(strJsonBody)) {
return new HashMap<String, Object>();
}
try {
return OBJECT_MAPPER.readValue(strJsonBody, HashMap.class);
} catch (IOException e) {
log.warn("解析json字符串失败,原字符串: {}", strJsonBody);
return null;
}
}
/**
*将json转换成Object对象
* @param strJsonBody
* @return
* @throws IOException
*/
public static Object json2Object(String strJsonBody) throws IOException {
if (StringUtils.isEmpty(strJsonBody)) {
return null;
}
// 每个属性的实际类型是string
return OBJECT_MAPPER.readValue(strJsonBody, Object.class);
}
/**
* Json格式的字符串向JavaBean List集合转换,传入空串将返回空list (显式抛出异常)
*
* @param strJsonBody
* @param c
* @return
* @throws IOException
*/
@SuppressWarnings("unchecked")
public static <T> List<T> json2List(String strJsonBody, Class<T> c) throws IOException {
if (StringUtils.isEmpty(strJsonBody)) {
return Collections.emptyList();
}
JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(ArrayList.class, c);
return OBJECT_MAPPER.readValue(strJsonBody, javaType);
}
/**
* Json格式的字符串向JavaBean List集合转换,传入空串将返回空list
*
* @param strJsonBody
* @param c
* @return 对象列表,解析失败返回 null
*/
@SuppressWarnings("unchecked")
public static <T> List<T> decodeJsonToList(String strJsonBody, Class<T> c) {
if (StringUtils.isEmpty(strJsonBody)) {
return Collections.emptyList();
}
JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(ArrayList.class, c);
try {
return OBJECT_MAPPER.readValue(strJsonBody, javaType);
} catch (IOException e) {
log.warn("解析json字符串失败,原字符串: {}", strJsonBody);
return null;
}
}
/**
* Json格式的字符串向List<String>集合转换,传入空串将返回null
*
* @param strJsonBody
* @return
* @throws IOException
*/
public static List<String> json2List(String strJsonBody) throws IOException {
return json2List(strJsonBody, String.class);
}
/**
* Object转为Json格式字符串的方法(显式抛出异常)
*
* @param o
* @return
* @throws JsonProcessingException
*/
public static String object2Json(Object o) throws JsonProcessingException {
return OBJECT_MAPPER.writeValueAsString(o);
}
/**
* Object转为Json格式字符串的方法
*
* @param o
* @return 对象的json字符串,如果处理过程中出错,返回null
*/
public static String encodeJson(Object o) {
try {
return OBJECT_MAPPER.writeValueAsString(o);
} catch (JsonProcessingException e) {
log.warn("对象转换成json失败");
return null;
}
}
}
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