Java实现Redis消息队列
这里我使用Redis的发布、订阅功能实现简单的消息队列,基本的命令有publish、subscribe等。
在Jedis中,有对应的java方法,但是只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处理。
使用Redis实现消息队列
封装一个消息对象
- public class Message implements Serializable{
- private static final long serialVersionUID = 1L;
- private String titile;
- private String info;
- public Message(String titile,String info){
- this.titile=titile;
- this.info=info;
- }
- public String getTitile() {
- return titile;
- }
- public void setTitile(String titile) {
- this.titile = titile;
- }
- public String getInfo() {
- return info;
- }
- public void setInfo(String info) {
- this.info = info;
- }
- }
为这个消息对象提供序列化方法
- public class MessageUtil {
- //convert To String
- public static String convertToString(Object obj,String charset) throws IOException{
- ByteArrayOutputStream bo = new ByteArrayOutputStream();
- ObjectOutputStream oo = new ObjectOutputStream(bo);
- oo.writeObject(obj);
- String str = bo.toString(charset);
- bo.close();
- oo.close();
- return str;
- }
- //convert To Message
- public static Object convertToMessage(byte[] bytes) throws Exception{
- ByteArrayInputStream in = new ByteArrayInputStream(bytes);
- ObjectInputStream sIn = new ObjectInputStream(in);
- return sIn.readObject();
- }
- }
从Jedis连接池中获取连接
- public class RedisUtil {
- /**
- * Jedis connection pool
- * @Title: config
- */
- public static JedisPool getJedisPool(){
- ResourceBundle bundle=ResourceBundle.getBundle("redis");
- String host=bundle.getString("host");
- int port=Integer.valueOf(bundle.getString("port"));
- int timeout=Integer.valueOf(bundle.getString("timeout"));
- // String password=bundle.getString("password");
- JedisPoolConfig config=new JedisPoolConfig();
- config.setMaxActive(Integer.valueOf(bundle.getString("maxActive")));
- config.setMaxWait(Integer.valueOf(bundle.getString("maxWait")));
- config.setTestOnBorrow(Boolean.valueOf(bundle.getString("testOnBorrow")));
- config.setTestOnReturn(Boolean.valueOf(bundle.getString("testOnReturn")));
- JedisPool pool=new JedisPool(config, host, port, timeout);
- return pool;
- }
- }
创建Provider类
- public class Producer {
- private Jedis jedis;
- private JedisPool pool;
- public Producer(){
- pool=RedisUtil.getJedisPool();
- jedis = pool.getResource();
- }
- public void provide(String channel,Message message) throws IOException{
- String str1=MessageUtil.convertToString(channel,"UTF-8");
- String str2=MessageUtil.convertToString(message,"UTF-8");
- jedis.publish(str1, str2);
- }
- //close the connection
- public void close() throws IOException {
- //将Jedis对象归还给连接池,关闭连接
- pool.returnResource(jedis);
- }
- }
创建Consumer类
- public class Consumer {
- private Jedis jedis;
- private JedisPool pool;
- public Consumer(){
- pool=RedisUtil.getJedisPool();
- jedis = pool.getResource();
- }
- public void consum(String channel) throws IOException{
- JedisPubSub jedisPubSub = new JedisPubSub() {
- // 取得订阅的消息后的处理
- public void onMessage(String channel, String message) {
- System.out.println("Channel:"+channel);
- System.out.println("Message:"+message.toString());
- }
- // 初始化订阅时候的处理
- public void onSubscribe(String channel, int subscribedChannels) {
- System.out.println("onSubscribe:"+channel);
- }
- // 取消订阅时候的处理
- public void onUnsubscribe(String channel, int subscribedChannels) {
- System.out.println("onUnsubscribe:"+channel);
- }
- // 初始化按表达式的方式订阅时候的处理
- public void onPSubscribe(String pattern, int subscribedChannels) {
- // System.out.println(pattern + "=" + subscribedChannels);
- }
- // 取消按表达式的方式订阅时候的处理
- public void onPUnsubscribe(String pattern, int subscribedChannels) {
- // System.out.println(pattern + "=" + subscribedChannels);
- }
- // 取得按表达式的方式订阅的消息后的处理
- public void onPMessage(String pattern, String channel, String message) {
- System.out.println(pattern + "=" + channel + "=" + message);
- }
- };
- jedis.subscribe(jedisPubSub, channel);
- }
- //close the connection
- public void close() throws IOException {
- //将Jedis对象归还给连接池
- pool.returnResource(jedis);
- }
- }
测试方法
- public static void main(String[] args){
- Message msg=new Message("hello!", "this is the first message!");
- Producer producer=new Producer();
- Consumer consumer=new Consumer();
- try {
- producer.provide("chn1",msg);
- consumer.consum("chn1");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
Java实现Redis消息队列的更多相关文章
- Redis笔记(七)Java实现Redis消息队列
这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...
- 预热一下吧《实现Redis消息队列》
应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...
- Java分布式:消息队列(Message Queue)
Java分布式:消息队列(Message Queue) 引入消息队列 消息,是服务间通信的一种数据单位,消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.队列,是一种常见的数据结 ...
- java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购
此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...
- redis消息队列简单应用
消息队列出现的原因 随着互联网的高速发展,门户网站.视频直播.电商领域等web应用中,高并发.大数据已经成为基本的标识.淘宝双11.京东618.各种抢购.秒杀活动.以及12306的春运抢票等,他们这些 ...
- logstash解耦之redis消息队列
logstash解耦之redis消息队列 架构图如下: 说明:通过input收集日志消息放入消息队列服务中(redis,MSMQ.Resque.ActiveMQ,RabbitMQ),再通过output ...
- Java高并发--消息队列
Java高并发--消息队列 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知.有一种做法时在下单逻辑执行后调 ...
- Redis 消息队列的实现
概述 Redis实现消息队列有两种形式: 广播订阅模式:基于Redis的 Pub/Sub 机制,一旦有客户端往某个key里面 publish一个消息,所有subscribe的客户端都会触发事件 集群订 ...
- 【MQ】java 从零开始实现消息队列 mq-02-如何实现生产者调用消费者?
前景回顾 上一节我们学习了如何实现基于 netty 客服端和服务端的启动. [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]java 从零开始实现消息队列 mq-02-如何实现生产者调用 ...
随机推荐
- C# string.join
String.Join 方法 平常工作中经常用到string.join()方法,在vs 2017用的运行时(System.Runtime, Version=4.2.0.0)中,共有九个(重载)方法. ...
- AIX系统下sed的用法与实例——查询/打印/替换字符串并生成文件/删除
sed是AIX中非常重要的文本流编辑器,它对输入的文本进行查询/打印/替换/删除等操作,并将结果写到标准输出.sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改. 首先,使用sed命令 ...
- python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client
windows安装python操作mysql数据库的MySQLdb模块mysql-client 正常情况下应该是cmd下直接运行 pip install mysql-client 命令即可,试了很多台 ...
- 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
- 从MySQL中导入数据到MongoDB中
从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields ter ...
- Linux内存使用调整
前段时间在做播放器的时候,遇到个问题,花了很长时间,做个记录,希望对有需要的人有所帮助: 播放器的播视频的时候,无论是手动切换视频还是到视频播放完成,自动切换视频,一定次数后均出现黑屏现象,偶尔有声音 ...
- hadoop客户端如何配置
Hadoop集群主要是由三部分组成的:主节点.从节点和客户端,即master.slave和client.我们在搭建hadoop集群的时候通常只考虑了主节点和从节点的搭建,却忽略了客户端.当我们搭建完成 ...
- Metrics介绍和Spring的集成
参考: http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/ https://www.cnblogs.com/yangecnu/p/ ...
- iOS UIDatePicker设置为中文的方法
UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 20, 200, 30)]; datePick ...
- Oracle 口令文件:即 oracle密码文件
一:文件路径位置 [oracle@localhost db_1]$ cd $ORACLE_HOME/dbs [oracle@localhost dbs]$ ls dbsorapwPROD1 hc_or ...