这里我使用Redis的发布、订阅功能实现简单的消息队列,基本的命令有publish、subscribe等。

在Jedis中,有对应的java方法,但是只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处理。

使用Redis实现消息队列


封装一个消息对象

  1. public class Message implements Serializable{
  2.  
  3. private static final long serialVersionUID = 1L;
  4.  
  5. private String titile;
  6. private String info;
  7.  
  8. public Message(String titile,String info){
  9. this.titile=titile;
  10. this.info=info;
  11. }
  12.  
  13. public String getTitile() {
  14. return titile;
  15. }
  16. public void setTitile(String titile) {
  17. this.titile = titile;
  18. }
  19. public String getInfo() {
  20. return info;
  21. }
  22. public void setInfo(String info) {
  23. this.info = info;
  24. }
  25. }

  

为这个消息对象提供序列化方法

  1. public class MessageUtil {
  2.  
  3. //convert To String
  4. public static String convertToString(Object obj,String charset) throws IOException{
  5.  
  6. ByteArrayOutputStream bo = new ByteArrayOutputStream();
  7. ObjectOutputStream oo = new ObjectOutputStream(bo);
  8. oo.writeObject(obj);
  9. String str = bo.toString(charset);
  10. bo.close();
  11. oo.close();
  12. return str;
  13. }
  14.  
  15. //convert To Message
  16. public static Object convertToMessage(byte[] bytes) throws Exception{
  17. ByteArrayInputStream in = new ByteArrayInputStream(bytes);
  18. ObjectInputStream sIn = new ObjectInputStream(in);
  19. return sIn.readObject();
  20.  
  21. }
  22. }

  

从Jedis连接池中获取连接

  1. public class RedisUtil {
  2.  
  3. /**
  4. * Jedis connection pool
  5. * @Title: config
  6. */
  7. public static JedisPool getJedisPool(){
  8. ResourceBundle bundle=ResourceBundle.getBundle("redis");
  9. String host=bundle.getString("host");
  10. int port=Integer.valueOf(bundle.getString("port"));
  11. int timeout=Integer.valueOf(bundle.getString("timeout"));
  12. // String password=bundle.getString("password");
  13.  
  14. JedisPoolConfig config=new JedisPoolConfig();
  15. config.setMaxActive(Integer.valueOf(bundle.getString("maxActive")));
  16. config.setMaxWait(Integer.valueOf(bundle.getString("maxWait")));
  17. config.setTestOnBorrow(Boolean.valueOf(bundle.getString("testOnBorrow")));
  18. config.setTestOnReturn(Boolean.valueOf(bundle.getString("testOnReturn")));
  19.  
  20. JedisPool pool=new JedisPool(config, host, port, timeout);
  21.  
  22. return pool;
  23. }
  24. }

  

创建Provider类

  1. public class Producer {
  2.  
  3. private Jedis jedis;
  4. private JedisPool pool;
  5.  
  6. public Producer(){
  7. pool=RedisUtil.getJedisPool();
  8. jedis = pool.getResource();
  9. }
  10.  
  11. public void provide(String channel,Message message) throws IOException{
  12. String str1=MessageUtil.convertToString(channel,"UTF-8");
  13. String str2=MessageUtil.convertToString(message,"UTF-8");
  14. jedis.publish(str1, str2);
  15. }
  16.  
  17. //close the connection
  18. public void close() throws IOException {
  19. //将Jedis对象归还给连接池,关闭连接
  20. pool.returnResource(jedis);
  21. }
  22. }

  

创建Consumer类

  1. public class Consumer {
  2.  
  3. private Jedis jedis;
  4. private JedisPool pool;
  5.  
  6. public Consumer(){
  7. pool=RedisUtil.getJedisPool();
  8. jedis = pool.getResource();
  9. }
  10.  
  11. public void consum(String channel) throws IOException{
  12. JedisPubSub jedisPubSub = new JedisPubSub() {
  13. // 取得订阅的消息后的处理
  14. public void onMessage(String channel, String message) {
  15. System.out.println("Channel:"+channel);
  16. System.out.println("Message:"+message.toString());
  17. }
  18.  
  19. // 初始化订阅时候的处理
  20. public void onSubscribe(String channel, int subscribedChannels) {
  21. System.out.println("onSubscribe:"+channel);
  22. }
  23.  
  24. // 取消订阅时候的处理
  25. public void onUnsubscribe(String channel, int subscribedChannels) {
  26. System.out.println("onUnsubscribe:"+channel);
  27. }
  28.  
  29. // 初始化按表达式的方式订阅时候的处理
  30. public void onPSubscribe(String pattern, int subscribedChannels) {
  31. // System.out.println(pattern + "=" + subscribedChannels);
  32. }
  33.  
  34. // 取消按表达式的方式订阅时候的处理
  35. public void onPUnsubscribe(String pattern, int subscribedChannels) {
  36. // System.out.println(pattern + "=" + subscribedChannels);
  37. }
  38.  
  39. // 取得按表达式的方式订阅的消息后的处理
  40. public void onPMessage(String pattern, String channel, String message) {
  41. System.out.println(pattern + "=" + channel + "=" + message);
  42. }
  43. };
  44.  
  45. jedis.subscribe(jedisPubSub, channel);
  46. }
  47.  
  48. //close the connection
  49. public void close() throws IOException {
  50. //将Jedis对象归还给连接池
  51. pool.returnResource(jedis);
  52. }
  53. }

  

测试方法

  1. public static void main(String[] args){
  2.  
  3. Message msg=new Message("hello!", "this is the first message!");
  4.  
  5. Producer producer=new Producer();
  6. Consumer consumer=new Consumer();
  7. try {
  8. producer.provide("chn1",msg);
  9. consumer.consum("chn1");
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }

  

Java实现Redis消息队列的更多相关文章

  1. Redis笔记(七)Java实现Redis消息队列

    这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...

  2. 预热一下吧《实现Redis消息队列》

    应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...

  3. Java分布式:消息队列(Message Queue)

    Java分布式:消息队列(Message Queue) 引入消息队列 消息,是服务间通信的一种数据单位,消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.队列,是一种常见的数据结 ...

  4. java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购

    此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...

  5. redis消息队列简单应用

    消息队列出现的原因 随着互联网的高速发展,门户网站.视频直播.电商领域等web应用中,高并发.大数据已经成为基本的标识.淘宝双11.京东618.各种抢购.秒杀活动.以及12306的春运抢票等,他们这些 ...

  6. logstash解耦之redis消息队列

    logstash解耦之redis消息队列 架构图如下: 说明:通过input收集日志消息放入消息队列服务中(redis,MSMQ.Resque.ActiveMQ,RabbitMQ),再通过output ...

  7. Java高并发--消息队列

    Java高并发--消息队列 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知.有一种做法时在下单逻辑执行后调 ...

  8. Redis 消息队列的实现

    概述 Redis实现消息队列有两种形式: 广播订阅模式:基于Redis的 Pub/Sub 机制,一旦有客户端往某个key里面 publish一个消息,所有subscribe的客户端都会触发事件 集群订 ...

  9. 【MQ】java 从零开始实现消息队列 mq-02-如何实现生产者调用消费者?

    前景回顾 上一节我们学习了如何实现基于 netty 客服端和服务端的启动. [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]java 从零开始实现消息队列 mq-02-如何实现生产者调用 ...

随机推荐

  1. C# string.join

    String.Join 方法 平常工作中经常用到string.join()方法,在vs 2017用的运行时(System.Runtime, Version=4.2.0.0)中,共有九个(重载)方法. ...

  2. AIX系统下sed的用法与实例——查询/打印/替换字符串并生成文件/删除

    sed是AIX中非常重要的文本流编辑器,它对输入的文本进行查询/打印/替换/删除等操作,并将结果写到标准输出.sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改. 首先,使用sed命令 ...

  3. python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client

    windows安装python操作mysql数据库的MySQLdb模块mysql-client 正常情况下应该是cmd下直接运行 pip install mysql-client 命令即可,试了很多台 ...

  4. 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  5. 从MySQL中导入数据到MongoDB中

    从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields ter ...

  6. Linux内存使用调整

    前段时间在做播放器的时候,遇到个问题,花了很长时间,做个记录,希望对有需要的人有所帮助: 播放器的播视频的时候,无论是手动切换视频还是到视频播放完成,自动切换视频,一定次数后均出现黑屏现象,偶尔有声音 ...

  7. hadoop客户端如何配置

    Hadoop集群主要是由三部分组成的:主节点.从节点和客户端,即master.slave和client.我们在搭建hadoop集群的时候通常只考虑了主节点和从节点的搭建,却忽略了客户端.当我们搭建完成 ...

  8. Metrics介绍和Spring的集成

    参考: http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/ https://www.cnblogs.com/yangecnu/p/ ...

  9. iOS UIDatePicker设置为中文的方法

    UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 20, 200, 30)]; datePick ...

  10. Oracle 口令文件:即 oracle密码文件

    一:文件路径位置 [oracle@localhost db_1]$ cd $ORACLE_HOME/dbs [oracle@localhost dbs]$ ls dbsorapwPROD1 hc_or ...