当前位置:   article > 正文

Java实现Redis的发布和订阅_java redis订阅和发布 消息推送

java redis订阅和发布 消息推送

Redis上的操作:

打开两个窗口,打开redis客户端:
一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1
另一个客户端:发布(客户端向channel1频道发送消息hello):127.0.0.1:6379> publish channel1 hello

Java代码实现

1: 先创建一个订阅消息处理类

  1. /**
  2. * 订阅消息处理类
  3. *
  4. * @version 1.0
  5. * @date 2022/05/26 15:51:11
  6. */
  7. public class Subscriber extends JedisPubSub {
  8. public Subscriber(){
  9. }
  10. //收到消息会调用
  11. @Override
  12. public void onMessage(String channel, String message) {
  13. System.out.println("接收 redis 发布的消息, 频道为:" + channel + ", 消息内容是:" + message);
  14. }
  15. //订阅了频道会调用
  16. @Override
  17. public void onSubscribe(String channel, int subscribedChannels) {
  18. System.out.println("订阅 redis 频道成功, 频道是:" + channel + ", 订阅频道数量是:" + subscribedChannels);
  19. }
  20. //取消订阅 会调用
  21. @Override
  22. public void onUnsubscribe(String channel, int subscribedChannels) {
  23. System.out.println("取消订阅 redis 频道,频道:" + channel + ", 订阅频道:" + subscribedChannels);
  24. }
  25. }

2: 创建消息的发布者

  1. /**
  2. * 消息的发布者
  3. *
  4. * @version 1.0
  5. * @date 2022/05/26 15:43:06
  6. */
  7. public class SmsPublisher extends Thread {
  8. private final JedisPool jedisPool;
  9. public SmsPublisher(JedisPool jedisPool) {
  10. this.jedisPool = jedisPool;
  11. }
  12. @Override
  13. public void run() {
  14. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  15. //连接池中取出一个连接
  16. Jedis jedis = jedisPool.getResource();
  17. while (true) {
  18. try {
  19. //向 xyzChannel 的频道上推送消息
  20. Long smsNumber = jedis.publish("xyzChannel", reader.readLine());
  21. System.out.println("消息的发布者:发布成功,当前向xyzChannel频道发送的消息数量为:" + smsNumber);
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
  27. }

3: 创建消息订阅者

  1. /**
  2. * 消息订阅者
  3. *
  4. * @version 1.0
  5. * @date 2022/05/26 15:49:47
  6. */
  7. public class SmsSubscriber extends Thread{
  8. private final JedisPool jedisPool;
  9. private final Subscriber subscriber = new Subscriber();
  10. //频道
  11. private final String channel = "xyzChannel";
  12. public SmsSubscriber(JedisPool jedisPool) {
  13. super("SmsSubscriber");
  14. this.jedisPool = jedisPool;
  15. }
  16. @Override
  17. public void run() {
  18. System.out.println("订阅Redis频道,频道为:" + channel + ", 等待消息发送者发送消息(请在控制台输入消息内容)...");
  19. Jedis jedis = null;
  20. try {
  21. //取出一个连接
  22. jedis = jedisPool.getResource();
  23. //通过subscribe的api去订阅频道,入参是订阅者和频道名
  24. jedis.subscribe(subscriber, channel);
  25. } catch (Exception e) {
  26. System.out.println("消息订阅者订阅消息出现异常: " + e.getMessage());
  27. } finally {
  28. if (jedis != null) {
  29. jedis.close();
  30. }
  31. }
  32. }
  33. }

4: Redis消息的发布和订阅测试类

  1. /**
  2. * Redis消息的发布和订阅测试类
  3. *
  4. * @version 1.0
  5. * @date 2022/05/26 16:01:56
  6. */
  7. public class SmsTest {
  8. public static void main(String[] args) {
  9. // 连接本地redis服务端
  10. JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
  11. //消息的发布者
  12. SmsPublisher publisher = new SmsPublisher(jedisPool);
  13. publisher.start();
  14. //消息的订阅者
  15. SmsSubscriber subscriber = new SmsSubscriber(jedisPool);
  16. subscriber.start();
  17. }
  18. }

运行结果

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/472442
推荐阅读
相关标签
  

闽ICP备14008679号