http://blog.csdn.net/lmj623565791/article/details/37607165

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37607165

本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考。

“Hello world” of RabbitMQ

1、Windows下RabbitMQ的安装

下载Erlang,地址:http://www.erlang.org/download/otp_win32_R15B.exe ,双击安装即可(首先装)

下载RabbitMQ,地址:http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.4/rabbitmq-server-3.3.4.exe ,双击安装即可

下载rabbit-client.jar ,Java代码时需要导入。地址:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.3.4/rabbitmq-java-client-bin-3.3.4.zip

安装完成后,在RabbitMQ的安装目录的sbin先会有:rabbitmq-server.bat

例如:

在cmd下:进入sbin目录,运行rabbitmq-server start

2、介绍

RabbitMQ 是信息传输的中间者。本质上,他从生产者(producers)接收消息,转发这些消息给消费者(consumers).换句话说,他能够按根据你指定的规则进行消息转发、缓冲、和持久化。

RabbitMQ 的一些常见的术语:
Producing意味着无非是发送。一个发送消息的程序是一个producer(生产者)。一般用下图表示Producer:

Queue(队列)类似邮箱。依存于RabbitMQ内部。虽然消息通过RabbitMQ在你的应用中传递,但是它们只能存储在queue中。队列不受任何限制,可以存储任何数量的消息—本质上是一个无限制的缓存。很多producers可以通过同一个队列发送消息,相同的很多consumers可以从同一个队列上接收消息。一般用下图表示队列:

Consuming(消费)类似于接收。consumer是基本属于等待接收消息的程序。一般使用下图表示Consumer:

注意:producer(生产者),consumer(消费者),broker(RabbitMQ服务)并不需要部署在同一台机器上,实际上在大多数实际的应用中,也不会部署在同一台机器上。

2、Java入门实例
 一个producer发送消息,一个接收者接收消息,并在控制台打印出来。如下图:

注:需要在官网下载rabbitmq-java-client-bin-*.zip将jar放入项目的classpath.

发送端:Send.java 连接到RabbitMQ(此时服务需要启动),发送一条数据,然后退出。

  1. package com.zhy.rabbit._01;
  2. import com.rabbitmq.client.Channel;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.ConnectionFactory;
  5. public class Send
  6. {
  7. //队列名称
  8. private final static String QUEUE_NAME = "hello";
  9. public static void main(String[] argv) throws java.io.IOException
  10. {
  11. /**
  12. * 创建连接连接到MabbitMQ
  13. */
  14. ConnectionFactory factory = new ConnectionFactory();
  15. //设置MabbitMQ所在主机ip或者主机名
  16. factory.setHost("localhost");
  17. //创建一个连接
  18. Connection connection = factory.newConnection();
  19. //创建一个频道
  20. Channel channel = connection.createChannel();
  21. //指定一个队列
  22. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  23. //发送的消息
  24. String message = "hello world!";
  25. //往队列中发出一条消息
  26. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  27. System.out.println(" [x] Sent '" + message + "'");
  28. //关闭频道和连接
  29. channel.close();
  30. connection.close();
  31. }
  32. }

值得注意的是队列只会在它不存在的时候创建,多次声明并不会重复创建。信息的内容是字节数组,也就意味着你可以传递任何数据。

接收端:Recv.java 不断等待服务器推送消息,然后在控制台输出。

  1. package com.zhy.rabbit._01;
  2. import com.rabbitmq.client.Channel;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.ConnectionFactory;
  5. import com.rabbitmq.client.QueueingConsumer;
  6. public class Recv
  7. {
  8. //队列名称
  9. private final static String QUEUE_NAME = "hello";
  10. public static void main(String[] argv) throws java.io.IOException,
  11. java.lang.InterruptedException
  12. {
  13. //打开连接和创建频道,与发送端一样
  14. ConnectionFactory factory = new ConnectionFactory();
  15. factory.setHost("localhost");
  16. Connection connection = factory.newConnection();
  17. Channel channel = connection.createChannel();
  18. //声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。
  19. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  20. System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
  21. //创建队列消费者
  22. QueueingConsumer consumer = new QueueingConsumer(channel);
  23. //指定消费队列
  24. channel.basicConsume(QUEUE_NAME, true, consumer);
  25. while (true)
  26. {
  27. //nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)
  28. QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  29. String message = new String(delivery.getBody());
  30. System.out.println(" [x] Received '" + message + "'");
  31. }
  32. }
  33. }

分别运行Send.java和Recv.java 顺序无所谓。前提RabbitMQ服务开启。

运行结果:

[x]Sent 'hello world!'

----------------------------------------

[*] Waiting for messages. To exitpress CTRL+C

[x] Received 'hello world!'

RabbitMQ ddemo 费元星的更多相关文章

  1. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  2. 【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星

    #!/bin/bash#@author:feiyuanxing [既然笨到家,就要努力到家]#@date:2017-12-05#@E-Mail:feiyuanxing@gmail.com#@TARGE ...

  3. 【Linux搭建创建FTP服务器】---完美解决 - 费元星

    配置大红字文件置顶:   vsftp d.conf 4.5KB     useradd -d /home/bai_du -s /sbin/nologin bai_du 修改访问权限: usermod ...

  4. 【原创】linux命令-Axel命令 - linux多线程下载 - 费元星 - 未来星开发团队

    [费元星版权Q:9715234] Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续[费元星版权Q:9715234]传,且可以从多个地址或者从一个地址的多个连接 ...

  5. 【vps搬家】--总结--费元星

    20150310  费元星 稍微玩VPS/服务器比较久的站长手中应该不止一台VPS,我们会有多台机器之间的相互使用.比如可能会遇到的是数据传输,我们传统的做法是先用FTP下载数据A到本地,然后再到本地 ...

  6. 虚拟机安装win7 64位-完美解决-费元星

    安装虚拟机是为了安装一个oracle ,在本机安装 ,本机会卡死,不是每次启动电脑都用oralce,而且有时候服务是关不干净的,所以安装在虚拟机里,需要的时候在开启,特做此记录! 费元星版权Q[971 ...

  7. 【原创】java 获取十个工作日之前或之后的日期(算当天)-完美解决-费元星

    [原创]java 获取十个工作日之后的日期(算当天)-完美解决-费元星(仅考虑星期六星期天) /** * * 根据开始日期 ,需要的工作日天数 ,计算工作截止日期,并返回截止日期 * @param s ...

  8. MyEclipse10安装checkStyle与findBugs插件--详细完美结局-费元星

    本人QQ:971751392(屌丝一枚) Myeclipse10安装checkStyle与findBugs插件详细完美结局方案: 资源一: http://download.csdn.net/detai ...

  9. nohup 重定向的问题-- 费元星 站长

    费元星 大牛 以前只知道使用nohup可以让一个程序后台执行,但是生成的日志文件都放到nohup.out中了,不能自己指定,尤其是在同一个目录下我需要让两个甚至多个程序都要后台执行时,这样看日志就比较 ...

随机推荐

  1. groupdel

    功能说明:用于删除指定的用户组,此命令不能删除用户归属的主用户组.

  2. Linux下Kafka单机安装配置

    安装jdkJDK版本大于1.8 安装kafkatar -zxvf kafka_2.11-0.10.2.1.tgz mv kafka_2.11-0.10.2.1 /usr/local/kafka 配置k ...

  3. Android(java)学习笔记24:自定义异常类

    1. 自定义异常: 考试成绩必须在0-100之间 很明显java没有对应的异常,需要我们自己来做一个异常 自定义异常 继承自Exception 继承自RuntimeException 下面是一个代码示 ...

  4. BAT的云

    近期,关于用国内那家云非常纠结! 我也来说道说道各家云. 首先,说说我想要的云服务(按优先级): 0.最好能提供二级域名.移动互联网时代,顶级域名必需要吗?在手机浏览器上输入长长的域名非常蛋痛(即不要 ...

  5. 【[NOI2006]最大获利】

    题目 并不知到为什么这道题讲了这么久 我们发现这道题就是最小割的板子啊,完全可以套上文理分科的板子 把每个机器和\(T\)连边,容量为\(p_i\),这些\(p_i\)并不计入总贡献 对于每一个要求我 ...

  6. U3

    一个项目里面可以有多个Activity AndroidManifest.xml<intent-filter> <action android:name="android.i ...

  7. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  8. 如何写一个FMDB帮助类?看看runtime吧

    FMDB是一个封装很好的sqllite类库.项目中调用的时候只需要写SQL语句,就能实现数据的CURD.我试过即使手写SQL语句也很麻烦,需要一个字段一个字段的拼上去,而且容易出错.有没有动态获取字段 ...

  9. MVC学习五:Razor布局页面 _ViewStart.cshtml

    如图: _ViewStart.cshtml就是MVC中的布局页面/模板页面. 用户访问流程图: 原理:先去执行Views文件夹下[_ViewStart.cshtml]页面,然后同级目录文件夹(上图中的 ...

  10. 【洛谷P1272】 重建道路

    重建道路 题目链接 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此, ...