List实现
MessageProvider
package com.sdkj; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * @Author wangshuo * @Date 2022/4/24, 17:34 * 消息生产者 */ public class MessageProvider extends Thread { public static final String MESSAGE_KEY = "message:queue"; private volatile int count; public void putMessage(String message) { JedisClientConfig jedisClientConfig = new JedisClientConfig(); JedisPool jedisPool = jedisClientConfig.getJedisPool(); Jedis jedis = jedisClientConfig.getJedis(jedisPool); Long size = jedis.lpush(MESSAGE_KEY, message); System.out.println(Thread.currentThread().getName() + " put message, size = " + size + ", count = " + count); count++; //close jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis); } @Override public synchronized void run() { for (int i = 0; i < 5; i++) { putMessage("message" + count); } } public static void main(String[] args) { MessageProvider messageProvider = new MessageProvider(); Thread thread1 = new Thread(messageProvider, "Thread1"); Thread thread2 = new Thread(messageProvider, "Thread2"); Thread thread3 = new Thread(messageProvider, "Thread3"); Thread thread4 = new Thread(messageProvider, "Thread4"); Thread thread5 = new Thread(messageProvider, "Thread5"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); } }
MessageConsumer
package com.sdkj; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.List; /** * @Author wangshuo * @Date 2022/4/24, 17:59 * 消息生产者 */ public class MessageConsumer implements Runnable { public static final String MESSAGE_KEY = "message:queue"; private volatile int count; public void consumerMessage() { JedisClientConfig jedisClientConfig = new JedisClientConfig(); JedisPool jedisPool = jedisClientConfig.getJedisPool(); Jedis jedis = jedisClientConfig.getJedis(jedisPool); List<String> rpop = jedis.brpop(0, MESSAGE_KEY); System.out.println(rpop); System.out.println(Thread.currentThread().getName() + " consumer message, message = " + rpop.get(1) + ", count = " + count); count++; jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis); } @Override public void run() { while (true) { consumerMessage(); } } public static void main(String[] args) { MessageConsumer messageConsumer = new MessageConsumer(); Thread thread6 = new Thread(messageConsumer, "thread6"); Thread thread7 = new Thread(messageConsumer, "thread7"); thread6.start(); thread7.start(); } }
订阅者模式
MessageProvider
package com.sdkj.ding_yue_zhe; import com.sdkj.JedisClientConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * @Author wangshuo * @Date 2022/4/24, 19:26 * 订阅者模式 / 生产者 */ public class MessageProvider extends Thread { public static final String CHANNEL_KEY = "channel:ws"; private volatile int count; private static JedisClientConfig jedisClientConfig = new JedisClientConfig(); public void putMessage(String message) { JedisPool jedisPool = jedisClientConfig.getJedisPool(); Jedis jedis = jedisClientConfig.getJedis(jedisPool); //返回订阅者数量 Long publish = jedis.publish(CHANNEL_KEY, message); System.out.println(Thread.currentThread().getName() + " put message , count = " + count + " , subscriberNum = " + publish); count++; jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis); } @Override public synchronized void run() { for (int i = 0; i < 5; i++) { putMessage("message" + count); } } public static void main(String[] args) { MessageProvider messageProvider = new MessageProvider(); Thread thread1 = new Thread(messageProvider, "thread1"); Thread thread2 = new Thread(messageProvider, "thread2"); Thread thread3 = new Thread(messageProvider, "thread3"); Thread thread4 = new Thread(messageProvider, "thread4"); Thread thread5 = new Thread(messageProvider, "thread5"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); } }
MessageConsumer.java
package com.sdkj.ding_yue_zhe; import com.sdkj.JedisClientConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPubSub; /** * @Author wangshuo * @Date 2022/4/24, 19:35 * 订阅者模式 / 消费者 */ public class MessageConsumer implements Runnable { public static final String CHANNEL_KEY = "channel:ws"; public static final String EXIT_COMMAND = "exit"; private static JedisClientConfig jedisClientConfig = new JedisClientConfig(); //Subscribe模式 private MyJedisPubSubscribe myJedisPubSub = new MyJedisPubSubscribe(); //PSubscribe模式 private MyJedisPubPSubscribe myJedisPubSubscribe = new MyJedisPubPSubscribe(); @Override public void run() { while (true) { consumerMessage(); } } private void consumerMessage() { JedisPool jedisPool = jedisClientConfig.getJedisPool(); Jedis jedis = jedisClientConfig.getJedis(jedisPool); //jedis.subscribe(myJedisPubSub, CHANNEL_KEY); jedis.psubscribe(myJedisPubSubscribe, CHANNEL_KEY); jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis); } public static void main(String[] args) { MessageConsumer messageConsumer = new MessageConsumer(); Thread thread6 = new Thread(messageConsumer, "thread6"); Thread thread7 = new Thread(messageConsumer, "thread7"); thread6.start(); thread7.start(); } } //重写JedisPubSub class MyJedisPubSubscribe extends JedisPubSub { @Override public void onMessage(String channel, String message) { System.out.println(Thread.currentThread().getName() + "-接收到消息 :channel = " + channel + " message = " + message); //接收到exit消息后退出 if (MessageConsumer.EXIT_COMMAND.equals(message)) System.exit(0); } } //重写JedisPubSub class MyJedisPubPSubscribe extends JedisPubSub { @Override public void onPMessage(String pattern, String channel, String message) { System.out.println(Thread.currentThread().getName() + "-接收到消息 :pattern = " + pattern + " channel = " + channel + " message = " + message); //接收到exit消息后退订并退出 if (MessageConsumer.EXIT_COMMAND.equals(message)) { unsubscribe(MessageConsumer.CHANNEL_KEY); System.exit(0); } } @Override public void unsubscribe(String... channels) { super.unsubscribe(channels); } }
本文来自博客园,作者:荣慕平,转载请注明原文链接:https://www.cnblogs.com/rongmuping/articles/16187635.html
浙公网安备 33010602011771号