Commit e997ccd7 by giaogiao

获取用户在线状态;

连接超时管理 (判断通道是否有数据写入);
parent 06882a0f
package io.geekidea.springbootplus;
import com.wecloud.im.tillo.netty.core.NettyStart;
import com.wecloud.im.netty.core.NettyStart;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
......
package io.geekidea.springbootplus.test;
import cn.hutool.core.lang.Snowflake;
import com.wecloud.im.app_ws.utils.RSAGenerator;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.tillo.app_ws.utils.RSAGenerator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -3,7 +3,7 @@ package io.geekidea.springbootplus.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
public class JsonTest {
......
......@@ -3,11 +3,11 @@ package io.geekidea.springbootplus.test;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.app_ws.utils.RedisUtils;
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.tillo.app_ws.utils.RedisUtils;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -86,7 +86,7 @@ public class LoginTest {
}
// 生成token
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(100));
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999));
// 保存redis
redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken);
......@@ -96,10 +96,10 @@ public class LoginTest {
@Test
public void test() throws Exception {
// 时间戳
String timestamp = "1620456403794";
String clientId = "hahah_30";
String appKey = "elLwpel1gWCHDqZy";
String sign = "9db5c1383829d346adba48182fd8f503";
String timestamp = "1626665156369";
String clientId = "aaaaa1";
String appKey = "QNtP3EjtLw26ekt0";
String sign = "a0b128928849c44bb0b7ae82944770b5";
String token = getToken(timestamp, clientId, appKey, sign);
System.out.println("token:" + token);
}
......
......@@ -4,7 +4,7 @@ import cn.hutool.crypto.digest.MD5;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import java.util.Date;
......
package com.wecloud.im.tillo.app_ws.annotation;
package com.wecloud.im.app_ws.annotation;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.app_ws.enums.WsRequestCmdEnum;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
......
package com.wecloud.im.tillo.app_ws.cache;
package com.wecloud.im.app_ws.cache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......
package com.wecloud.im.tillo.app_ws.enums;
package com.wecloud.im.app_ws.enums;
/**
* @Description ws请求类型
......
package com.wecloud.im.tillo.app_ws.enums;
package com.wecloud.im.app_ws.enums;
/**
* @Description ws响应类型
......
package com.wecloud.im.tillo.app_ws.model;
package com.wecloud.im.app_ws.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.wecloud.im.tillo.app_ws.model;
package com.wecloud.im.app_ws.model;
import lombok.Data;
import lombok.experimental.Accessors;
......
package com.wecloud.im.tillo.app_ws.model;
package com.wecloud.im.app_ws.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
......@@ -22,17 +22,17 @@ public enum ResultStatus {
/**
* 返回码
*/
private int code;
private final int code;
/**
* 默认返回英文结果描述 en
*/
private String message;
private final String message;
/**
* 返回中文结果描述 zh_simple
*/
private String zhMessage;
private final String zhMessage;
}
......
package com.wecloud.im.tillo.app_ws.model;
package com.wecloud.im.app_ws.model;
import lombok.extern.slf4j.Slf4j;
......
package com.wecloud.im.tillo.app_ws.model.request;
package com.wecloud.im.app_ws.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package com.wecloud.im.tillo.app_ws.receive;
package com.wecloud.im.app_ws.receive;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.service.WriteDataService;
import com.wecloud.im.tillo.app_ws.strategy.AbstractReceiveStrategy;
import com.wecloud.im.tillo.app_ws.strategy.ReceiveStrategyContext;
import com.wecloud.im.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.service.WriteDataService;
import com.wecloud.im.app_ws.strategy.AbstractReceiveStrategy;
import com.wecloud.im.app_ws.strategy.ReceiveStrategyContext;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.wecloud.im.tillo.app_ws.sender;
package com.wecloud.im.app_ws.sender;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
......
package com.wecloud.im.tillo.app_ws.sender;
package com.wecloud.im.app_ws.sender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
......
package com.wecloud.im.tillo.app_ws.service;
package com.wecloud.im.app_ws.service;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.nio.NioSocketChannel;
......@@ -22,10 +22,13 @@ public interface MangerChannelService {
Map<String, NioSocketChannel> CHANNEL_MAP = new ConcurrentHashMap<>();
/**
* CLIENT_ID
* CLIENT_ID,是客户端的字符串id
*/
AttributeKey<String> CLIENT_ID = AttributeKey.valueOf("CLIENTID");
/**
* 是app的字符串id
*/
AttributeKey<String> APP_KEY = AttributeKey.valueOf("APPKEY");
/**
......@@ -80,12 +83,21 @@ public interface MangerChannelService {
/**
* 获取用户在线状态
*
* @param toAppKey
* @param toClientId
* @return true:在线, false 不在线
*/
boolean getOnlineStatus(String toAppKey, String toClientId);
/**
* 下发数据
*
* @param msg
* @return
*/
boolean writeData(String msg, String toAppKey,String toClientId);
boolean writeData(String msg, String toAppKey, String toClientId);
// /**
// * rpc异步下发数据
......
package com.wecloud.im.tillo.app_ws.service;
package com.wecloud.im.app_ws.service;
import com.wecloud.im.tillo.app_ws.model.ResponseModel;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.model.ResponseModel;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
/**
......
package com.wecloud.im.tillo.app_ws.service.impl;
package com.wecloud.im.app_ws.service.impl;
import com.wecloud.im.tillo.app_ws.cache.UserCache;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.cache.UserCache;
import com.wecloud.im.app_ws.service.MangerChannelService;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
......@@ -271,6 +271,34 @@ public class MangerChannelServiceImpl implements MangerChannelService {
//
// }
/**
* 获取用户在线状态
*
* @param toAppKey
* @param toClientId
* @return true:在线, false 不在线
*/
@Override
public boolean getOnlineStatus(String toAppKey, String toClientId) {
NioSocketChannel nioSocketChannel = get(toAppKey, toClientId);
if (null == nioSocketChannel) {
// userCache.offline(toAppKey + toClientId);
if (log.isDebugEnabled()) {
log.debug("writeData 不存在 连接为空:" + toAppKey + toClientId);
}
return false;
}
// 判断连接是否断开
if (nioSocketChannel.isShutdown()) {
if (log.isDebugEnabled()) {
log.debug("writeData连接断开:" + toAppKey + toClientId + "channelId:" + nioSocketChannel.id().asLongText());
}
return false;
}
return true;
}
@Override
public boolean writeData(String msg, String toAppKey, String toClientId) {
......
package com.wecloud.im.tillo.app_ws.service.impl;
package com.wecloud.im.app_ws.service.impl;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.tillo.app_ws.model.ResponseModel;
import com.wecloud.im.tillo.app_ws.model.WsConstants;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.service.WriteDataService;
import com.wecloud.im.app_ws.model.ResponseModel;
import com.wecloud.im.app_ws.model.WsConstants;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.service.WriteDataService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
......
package com.wecloud.im.tillo.app_ws.strategy;
package com.wecloud.im.app_ws.strategy;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import io.netty.channel.ChannelHandlerContext;
/**
......
package com.wecloud.im.tillo.app_ws.strategy;
package com.wecloud.im.app_ws.strategy;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.utils.SpringBeanUtils;
import com.wecloud.im.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.app_ws.utils.SpringBeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.Map;
......@@ -13,7 +13,7 @@ import java.util.Map;
*/
public class ReceiveStrategyContext {
private Map<WsRequestCmdEnum, Class> strategyMap;
private final Map<WsRequestCmdEnum, Class> strategyMap;
public ReceiveStrategyContext(Map<WsRequestCmdEnum, Class> strategyMap) {
this.strategyMap = strategyMap;
......
package com.wecloud.im.tillo.app_ws.strategy;
package com.wecloud.im.app_ws.strategy;
import com.google.common.collect.Maps;
import com.wecloud.im.tillo.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.utils.ClassScanner;
import com.wecloud.im.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.app_ws.utils.ClassScanner;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
......
package com.wecloud.im.tillo.app_ws.strategy.concrete;
package com.wecloud.im.app_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.wecloud.im.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.app_ws.model.ResponseModel;
import com.wecloud.im.app_ws.model.request.ReceiveModel;
import com.wecloud.im.app_ws.sender.PushTask;
import com.wecloud.im.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.service.WriteDataService;
import com.wecloud.im.app_ws.strategy.AbstractReceiveStrategy;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
......@@ -15,14 +23,6 @@ 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.tillo.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.model.ResponseModel;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.tillo.app_ws.sender.PushTask;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.service.WriteDataService;
import com.wecloud.im.tillo.app_ws.strategy.AbstractReceiveStrategy;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.util.SnowflakeUtil;
......
package com.wecloud.im.tillo.app_ws.utils;
package com.wecloud.im.app_ws.utils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.BeanDefinitionStoreException;
......
package com.wecloud.im.tillo.app_ws.utils;
package com.wecloud.im.app_ws.utils;
import javax.crypto.Cipher;
import java.security.Key;
......@@ -6,7 +6,7 @@ import java.security.Key;
public class EncrypDES {
// 字符串默认键值
private static String strDefaultKey = "inventec2020@#$%^&";
private static final String strDefaultKey = "inventec2020@#$%^&";
//加密工具
......
package com.wecloud.im.tillo.app_ws.utils;
package com.wecloud.im.app_ws.utils;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFutureListener;
......@@ -29,7 +29,7 @@ import static io.netty.buffer.Unpooled.copiedBuffer;
* @Date 2019-07-19
*/
public class FullHttpRequestUtils {
private static Logger logger = LoggerFactory.getLogger(RequestHandler.class);
private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class);
/**
* 参数解析
......
package com.wecloud.im.tillo.app_ws.utils;
package com.wecloud.im.app_ws.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
......
package com.wecloud.im.tillo.app_ws.utils;
package com.wecloud.im.app_ws.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
......
package com.wecloud.im.controller;
import com.wecloud.im.app_ws.utils.RSAGenerator;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.param.ImApplicationPageParam;
import com.wecloud.im.param.ImApplicationQueryVo;
import com.wecloud.im.param.add.ImApplicationAdd;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.tillo.app_ws.utils.RSAGenerator;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......
......@@ -39,7 +39,6 @@ public class ImClientBlacklistController extends BaseController {
* 添加黑名单
*/
@PostMapping("/add")
@OperationLog(name = "拉入黑名单", type = OperationLogType.ADD)
@ApiOperation(value = "拉入黑名单")
public ApiResult<Boolean> addImClientBlacklist(@Validated(Add.class) @RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
return imClientBlacklistService.addImClientBlacklist(imClientBlacklistUpdate);
......@@ -50,7 +49,6 @@ public class ImClientBlacklistController extends BaseController {
* 删除黑名单
*/
@PostMapping("/delete")
@OperationLog(name = "移出黑名单", type = OperationLogType.DELETE)
@ApiOperation(value = "移出黑名单")
public ApiResult<Boolean> deleteImClientBlacklist(@RequestBody ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
return imClientBlacklistService.removeImClientBlacklist(imClientBlacklistUpdate);
......
package com.wecloud.im.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.app_ws.service.MangerChannelService;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ImOnlineStatusVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.validator.groups.Add;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -32,6 +39,12 @@ public class ImClientController extends BaseController {
@Autowired
private ImClientService imClientService;
@Autowired
private MangerChannelService mangerChannelService;
@Autowired
private ImApplicationService imApplicationService;
/**
* 添加或修改推送设备信息
*/
......@@ -43,6 +56,32 @@ public class ImClientController extends BaseController {
return ApiResult.result(flag);
}
/**
* 获取用户在线状态
*
* @return true:在线, false 不在线
*/
@PostMapping("/getOnlineStatus")
@OperationLog(name = "获取用户在线状态", type = OperationLogType.ADD)
@ApiOperation(value = "获取用户在线状态")
ApiResult<ImOnlineStatusVo> getOnlineStatus(String clientId) {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getOne(
new QueryWrapper<ImApplication>().lambda()
.select(ImApplication::getId, ImApplication::getAppKey)
.eq(ImApplication::getAppKey, curentJwtToken.getAppKey())
);
boolean onlineStatus = mangerChannelService.getOnlineStatus(imApplication.getAppKey(), clientId);
ImOnlineStatusVo imOnlineStatusVo = new ImOnlineStatusVo();
imOnlineStatusVo.setStatus(onlineStatus);
return ApiResult.ok(imOnlineStatusVo);
}
// /**
// * 添加终端表
// */
......
package com.wecloud.im.tillo.netty.core;
package com.wecloud.im.netty.core;
import com.wecloud.im.tillo.netty.handler.NettyApiRequest;
import com.wecloud.im.netty.handler.NettyApiRequest;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
......
package com.wecloud.im.tillo.netty.core;
package com.wecloud.im.netty.core;
import com.wecloud.im.tillo.app_ws.model.WsConstants;
import com.wecloud.im.app_ws.model.WsConstants;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
......@@ -8,6 +8,7 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
......@@ -27,6 +28,10 @@ public class NettyChannelInitializer extends ChannelInitializer<SocketChannel> {
// 服务端api接口
pipeline.addLast("SingleHttpRequestHandler", channelInboundHandler);
// 连接超时管理 (判断通道是否有数据写入)
pipeline.addLast("readTimeoutHandler", new ReadTimeoutHandler(60));
// "/appws"路径 升级长连接
pipeline.addLast("appWebSocketServerotocolHandler", new WebSocketServerProtocolHandler(WsConstants.WS_URL));
}
......
package com.wecloud.im.tillo.netty.core;
package com.wecloud.im.netty.core;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
......@@ -14,9 +14,9 @@ import org.springframework.stereotype.Component;
@Slf4j
public class NettyStart {
private final NettyChannelInitializer nettyChannelInitializer;
private static EventLoopGroup boss = new NioEventLoopGroup(1);
private static EventLoopGroup work = new NioEventLoopGroup();
private static ServerBootstrap serverBootstrap = new ServerBootstrap();
private static final EventLoopGroup boss = new NioEventLoopGroup(1);
private static final EventLoopGroup work = new NioEventLoopGroup();
private static final ServerBootstrap serverBootstrap = new ServerBootstrap();
static {
serverBootstrap.group(boss, work);
......
package com.wecloud.im.tillo.app_ws;
package com.wecloud.im.netty.core;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.wecloud.im.tillo.app_ws.model.WsConstants;
import com.wecloud.im.tillo.app_ws.receive.ReadWsData;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.model.WsConstants;
import com.wecloud.im.app_ws.receive.ReadWsData;
import com.wecloud.im.app_ws.service.MangerChannelService;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
......@@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit;
@Component
@ChannelHandler.Sharable
@Slf4j
public class WsHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@Resource
private ReadWsData readWsData;
......@@ -97,8 +97,9 @@ public class WsHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
String userIdByChannel = mangerChannelService.getUserIdByChannel(ctx);
log.debug("uid:" + userIdByChannel + ",app端连接WS成功" + ",channelId:" + ctx.channel().id().asLongText());
log.debug("uid:" + userIdByChannel + "," + ",channelId:" + ctx.channel().id().asLongText());
log.debug("连接WS成功handlerAdded");
}
......
package com.wecloud.im.tillo.netty.handler;
package com.wecloud.im.netty.handler;
import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.tillo.app_ws.WsHandler;
import com.wecloud.im.tillo.app_ws.model.WsConstants;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.utils.FullHttpRequestUtils;
import com.wecloud.im.app_ws.model.WsConstants;
import com.wecloud.im.app_ws.service.MangerChannelService;
import com.wecloud.im.app_ws.utils.FullHttpRequestUtils;
import com.wecloud.im.netty.core.WsReadHandler;
import io.geekidea.springbootplus.config.constant.CommonConstant;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -44,7 +44,7 @@ public class NettyApiRequest {
private MangerChannelService appUserChannelsService;
@Resource
private WsHandler appImHandler;
private WsReadHandler appImReadHandler;
/**
* http请求接收
......@@ -130,7 +130,7 @@ public class NettyApiRequest {
ctx.channel().attr(MangerChannelService.APP_KEY).set(appKey);
// 添加长连接handler
ctx.pipeline().addLast("appImHandler", appImHandler);
ctx.pipeline().addLast("appImHandler", appImReadHandler);
// 保存用户上下文对象
appUserChannelsService.put(appKey, clientId, (NioSocketChannel) ctx.channel());
......
......@@ -50,6 +50,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
ImClient client = imClientService.getClient();
......@@ -70,6 +71,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
// 操作者
ImClient client = imClientService.getClient();
......
......@@ -20,6 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Duration;
@Service
@Slf4j
public class ImClientLoginServiceImpl implements ImClientLoginService {
......@@ -94,7 +96,7 @@ public class ImClientLoginServiceImpl implements ImClientLoginService {
}
// 生成token
String generateToken = JwtUtil.generateToken(imTokenVerify.getClientId(), imTokenVerify.getAppKey(), secret, null);
String generateToken = JwtUtil.generateToken(imTokenVerify.getClientId(), imTokenVerify.getAppKey(), secret, Duration.ofDays(99999));
// 保存redis
// redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + imTokenVerify.getClientId(), generateToken);
......
package com.wecloud.im.vo;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 在线状态
*
* @author wei
* @since 2021-05-07
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "ImOnlineStatusVo")
public class ImOnlineStatusVo extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("true:在线, false 不在线")
private Boolean status;
}
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