redis通道java_【java】netty4,服务端向客户端主动发消息怎
么把chann。。。
怎么把netty的链接通道存储到redis中这样后续可以通过key取出channel给客户端发消息
回答
放内存⾥⾯了,之前是要做集想存redis所有机器都能取出来⽤后来发现不是这么回事
我们项⽬中⼤致是这么做的:
⽆论是⾃⼰写数据结构还是使⽤Jedis,⼤概都是有⼀个类似Map的结构。
建⽴⼀个Bean⽤于表⽰会话,此处暂且称之为Session。
在Session⾥引⽤netty的Channel。
在channelActive时将其放⼊redis。
有必要的话,可以将channel.id().asLongText()或channel.id().asShortText()作为Session的唯⼀标识
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//可以将channel.id().asLongText()或channel.id().asShortText()作为Session的ID
Session session = Session.buildSession(ctx.channel());
//Session存⼊Redis
pushSession2Redis(session);
logger.info("终端连接:{}", session);
}
Session.java
import java.SocketAddress;
import ioty.channel.Channel;
public class Session {
//Session的唯⼀标识
private String id;
//和Session相关的channel,通过它向客户端回送数据
private Channel channel = null;
session怎么记忆//上次通信时间
private long lastCommunicateTimeStamp = 0l;
//快速构建⼀个新的Session
public static Session buildSession(Channel channel) {
Session session = new Session();
session.setChannel(channel);
/
/此处暂且使⽤netty⽣成的类似UUID的字符串,来标识⼀个session
session.setId(channel.id().asLongText());
session.setLastCommunicateTimeStamp(System.currentTimeMillis());
return session;
}
// getter,setter
}
public class SessionManager{
//将Session放⼊redis
public void pushSession2Redis(Session session){
//这⾥就不⽤我说了吧
/
/不知道你⾃⼰⽤的redis客户端是什么
//调⽤客户端(⽐如Jedis)的API把session放到你⾃⼰的数据结构不就⾏了
}
//从redis获取指定session
public Session findById(String sessionId){
return null;
}
}
你确定你这个能序列化保存到redis⾥⾯?
或许这⾥要注意⼀下?
我也遇到这个问题了?请问⼀下你解决了吗?
我按照@诸葛流云的⽅式试了,但是向redis中保存的时候,还是报不能序列化的异常,暂时没到合适的⽅案2018年3⽉22⽇09:18:19
您好 请问现在有解决⽅案了么

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。