Browse Source

fix: 在线状态异常的bug

master
xsx 2 years ago
parent
commit
3ffd84498b
  1. 2
      README.md
  2. 39
      im-platform/src/main/java/com/bx/implatform/config/RedissonConfig.java
  3. 35
      im-server/src/main/java/com/bx/imserver/config/RedisConfig.java
  4. 2
      im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java

2
README.md

@ -57,7 +57,7 @@
- redis记录了每个用户的websocket连接的是哪个im-server,当用户发送消息时,im-platform将根据所连接的im-server的id,决定将消息推向哪个queue
#### 本地快速部署
#### 本地启动
1.安装运行环境
- 安装node:v18.19.0
- 安装jdk:17

39
im-platform/src/main/java/com/bx/implatform/config/RedissonConfig.java

@ -1,39 +0,0 @@
package com.bx.implatform.config;
import cn.hutool.core.util.StrUtil;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
/**
* @author: Blue
* @date: 2024-06-09
* @version: 1.0
*/
//@Configuration
//@ConditionalOnClass(Config.class)
//@EnableConfigurationProperties(RedisProperties.class)
public class RedissonConfig {
@Bean
RedissonClient redissonClient(RedisProperties redisProperties) {
Config config = new Config();
config.setCodec(new StringCodec());
String address = "redis://" + redisProperties.getHost()+":"+redisProperties.getPort();
SingleServerConfig serverConfig = config.useSingleServer()
.setAddress(address)
.setDatabase(redisProperties.getDatabase());
if(StrUtil.isNotEmpty(redisProperties.getPassword())) {
serverConfig.setPassword(redisProperties.getPassword());
}
return Redisson.create(config);
}
}

35
im-server/src/main/java/com/bx/imserver/config/RedisConfig.java

@ -0,0 +1,35 @@
package com.bx.imserver.config;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Primary
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置值(value)的序列化采用FastJsonRedisSerializer
redisTemplate.setValueSerializer(fastJsonRedisSerializer());
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer());
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
public FastJsonRedisSerializer fastJsonRedisSerializer() {
return new FastJsonRedisSerializer<>(Object.class);
}
}

2
im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java

@ -71,7 +71,7 @@ public class IMChannelHandler extends SimpleChannelInboundHandler<IMSendInfo> {
// 移除channel
UserChannelCtxMap.removeChannelCtx(userId, terminal);
// 用户下线
RedisTemplate<String, Object> redisTemplate = SpringContextHolder.getBean("redisTemplate");
RedisTemplate<String, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), terminal.toString());
redisTemplate.delete(key);
log.info("断开连接,userId:{},终端类型:{},{}", userId, terminal, ctx.channel().id().asLongText());

Loading…
Cancel
Save