pom.xml
com.alibaba fastjson1.2.68 redis.clients jedis3.3.0 org.slf4j slf4j-log4j121.7.30
log4j.properties
log4j.rootLogger=info,stdout,all
# --- stdout ---
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.encoding=UTF-8
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=[%d{HH:mm:ss,SSS}] [%p] %C{1}.%M --> %m%n
# --- all ---
log4j.appender.all=org.apache.log4j.DailyRollingFileAppender
log4j.appender.all.encoding=UTF-8
log4j.appender.all.append=true
log4j.appender.all.datePattern='.'yyyy-MM-dd
log4j.appender.all.file=log/all.log
log4j.appender.all.layout=org.apache.log4j.PatternLayout
log4j.appender.all.layout.conversionPattern=[%d{HH:mm:ss,SSS}] [%p] %C{1}.%M --> %m%n
RedisManager.java // 负责连接池的创建,获取连接
package org.example.redis;
import redis.clients.jedis.JedisPool;
public class RedisManager {
private static JedisPool pool = new JedisPool("127.0.0.1", 6379);
public static JedisPool getPool() {
return pool;
}
}
RedisConst.java // 消息频道
package org.example.redis;
public class RedisConst {
public static final String MSG1_SUB = "MSG1_SUB";
}
订阅类
IRedisMsgHandler.java
package org.example.redis;
public interface IRedisMsgHandler {
void handle(String channelName, String strMsg);
}
RedisSubService.java
package org.example.redis.sub;
import org.example.redis.IRedisMsgHandler;
import org.example.redis.RedisConst;
import org.example.redis.RedisManager;
import org.example.redis.sub.impl.Msg1SubMsgHandler;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class RedisSubService {
private static Map subHandlerMap = new HashMap<>();
public static void init() {
initHandler();
sub();
System.out.println("redis订阅初始化完毕!!!");
}
// 初始化订阅哪些对象
private static void initHandler() {
subHandlerMap.put(RedisConst.MSG1_SUB, new Msg1SubMsgHandler());
}
private static void sub() {
ExecutorService es = Executors.newSingleThreadExecutor((r) -> {
Thread t = new Thread(r);
t.setName("sub");
return t;
});
es.submit(() -> {
try (Jedis jedis = RedisManager.getPool().getResource()) {
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channelName, String strMsg) {
onMsg(channelName, strMsg);
}
}, subHandlerMap.keySet().toArray(new String[0]));
} catch (Exception e) {
e.printStackTrace();
}
});
}
private static void onMsg(String channelName, String strMsg) {
IRedisMsgHandler handler = subHandlerMap.get(channelName);
if (handler != null) {
handler.handle(channelName, strMsg);
}
}
}
Msg1SubMsgHandler.java
package org.example.redis.sub.impl;
import org.example.redis.IRedisMsgHandler;
public class Msg1SubMsgHandler implements IRedisMsgHandler {
@Override
public void handle(String channelName, String strMsg) {
System.out.println(channelName + ":" + strMsg);
}
}
SubMain.java
package org.example;
import org.example.redis.sub.RedisSubService;
public class SubMain {
public static void main(String[] args) {
RedisSubService.init();
}
}
发布类
RedisPubService.java
package org.example.redis.pub;
import org.example.redis.RedisManager;
import redis.clients.jedis.Jedis;
public class RedisPubService {
public static void publish(String channelName, String strMsg){
try(Jedis jedis = RedisManager.getPool().getResource()){
jedis.publish(channelName, strMsg);
}catch (Exception e){
e.printStackTrace();
}
}
}
PubMain.java // 发布消息
package org.example;
import com.alibaba.fastjson.JSON;
import org.example.msg.UserOnline;
import org.example.redis.RedisConst;
import org.example.redis.pub.RedisPubService;
public class PubMain {
public static void main(String[] args) {
RedisPubService.publish(RedisConst.MSG1_SUB, JSON.toJSonString(new Useronline("jianan", 18)));
}
}



