1.创建线程任务保证项目启动就开始执行监听redis订阅任务,创建类RedisPubTaskService:
代码如下:
public class RedisPubTaskService { public static ThreadPoolExecutor threadPool = null; public static ScheduledExecutorService service = Executors.newScheduledThreadPool(3); static { threadPool = new ThreadPoolExecutor(8, 40, 20, TimeUnit.SECONDS, new LinkedBlockingQueue()); threadPool.allowCoreThreadTimeOut(true); } }
2.创建类RedisSubService集成类JedisPubSub;
代码如下:
@Service public class RedisSubService extends JedisPubSub { public static MdbDataImpl commonmdb = CommonmdbBeanUtil.getCommonmdb(); @Autowired private WechatPublicNumService wechatPublicNumService; @Override public void onMessage(String s, String s1) { System.out.println("收到了发布消息:" + s + ";内容:" + s1); } /** * 监听订阅频道收到的消息 * * @param pattern * @param channel 频道 * @param message 消息体 */ @Override public void onPMessage(String pattern, String channel, String message) { System.out.println("收到来自公众号端的订阅消息,channel=" + channel + ";消息内容:message=" + message); System.out.println("putTimeaa-" + DateUtils.formatDate("yyy-MM-dd HH:mm:ss", new Date()) + " messageaa-" + message); System.out.println("onPMessage pattern " + pattern + " " + channel + " " + message); if (!StringUtil.isEmpty(message)) { System.out.println("收到了订阅消息:" + message); //同步公众号评论消息到小程序 wechatPublicNumService.subRedisComment(message); } } @Override public void onSubscribe(String pattern, int subscribedChannels) { System.out.println("*******putTime-" + DateUtils.formatDate("yyy-MM-dd HH:mm:ss", new Date()) + " messageaa-" + subscribedChannels); System.out.println("onPSubscribe " + pattern + " " + subscribedChannels); } @Override public void onUnsubscribe(String s, int i) { } @Override public void onPUnsubscribe(String s, int i) { } @Override public void onPSubscribe(String s, int i) { System.out.println("====================" + s); } }
3.创建一个类负责启动订阅任务
代码如下:
@Service public class RedisCommentSubListener { static String redisHost = PropertiesUtil.getProperties("config.properties", "redis.sub.host"); static int redisPort = Integer.parseInt(PropertiesUtil.getProperties("config.properties", "redis.sub.port")); static String redisPassword = PropertiesUtil.getProperties("config.properties", "redis.sub.password"); @Autowired private RedisSubService redisSubService; /** * 执行redis订阅,频道为(channel):miniprogram_msg_list */ public RedisCommentSubListener() { System.out.println("****StartRedisExpireListenerService 构造开始"); RedisPubTaskService.service.schedule(new Runnable() { @Override public void run() { System.out.println("p-" + DateUtils.formatDate("yyy-MM-dd HH:mm:ss", new Date())); try { System.out.println("*******开始构造 pid-" + Thread.currentThread().getId()); JedisPool pool = null; if (StringUtil.isEmpty(redisPassword)) { pool = new JedisPool(new JedisPoolConfig(), redisHost, redisPort, 2000); } else { pool = new JedisPool(new JedisPoolConfig(), redisHost, redisPort, 2000, redisPassword); } Jedis jedis = pool.getResource(); //开始订阅公众号端的评论消息 jedis.psubscribe(redisSubService, "miniprogram_msg_list"); } catch (Exception e) { System.out.println("****redis key 过期监听线程启动失败"); e.printStackTrace(); } } }, 20, TimeUnit.SECONDS); System.out.println("****StartRedisExpireListenerService 构造结束"); } }