当前位置:   article > 正文

RabbitMq安装与使用(mac)高效总结(亲测)_rabbitmq mac 5672 reconnect

rabbitmq mac 5672 reconnect

1.安装

先更新brew在,然后安装rabbitmq

  1. #更新brew
  2. brew update
  3. #安装rabbitmq
  4. brew install rabbitmq

2.设置配置文件

打开配置文件

vi /usr/local/etc/rabbitmq/rabbitmq-env.conf

修改所以程序都可访问 = 后面为空格

NODE_IP_ADDRESS=

3.启动rabbitmq

  1. #方法一:直接brew启动
  2. # 启动
  3. brew services start rabbitmq
  4. # 当前窗口启动
  5. rabbitmq-server
  6. #方法二:进入程序目录启动
  7. #程序目录
  8. cd /usr/local/sbin/
  9. #启动
  10. sudo ./rabbitmq-server

4.浏览器控制台访问端口

启动浏览器控制台之前需要先开启插件(执行一次以后不用再次执行

待RabbitMQ 的启动完毕之后,另起终端进入

  1. cd /usr/local/Cellar/rabbitmq/3.7.7_1/sbin
  2. sudo ./rabbitmq-plugins enable rabbitmq_management

进入控制台: http://localhost:15672/

用户名和密码:guest,guest

浏览器访问端口:15672

程序访问端口:5672

启动成功

 

5.测试(比较繁琐)

1. 添加账号

首先是得启动mq

  1. # 进入目录
  2. cd /usr/local/Cellar/rabbitmq/3.7.7_1/sbin
  3. ## 添加账号
  4. ./rabbitmqctl add_user admin admin
  5. ## 添加访问权限
  6. ./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
  7. ## 设置超级权限
  8. ./rabbitmqctl set_user_tags admin administrator

2. 编码实测

pom引入依赖

  1. <dependency>
  2. <groupId>com.rabbitmq</groupId>
  3. <artifactId>amqp-client</artifactId>
  4. </dependency>

 开始写代码

  1. public class RabbitMqTest {
  2. //消息队列名称
  3. private final static String QUEUE_NAME = "hello";
  4. @Test
  5. public void send() throws java.io.IOException, TimeoutException {
  6. //创建连接工程
  7. ConnectionFactory factory = new ConnectionFactory();
  8. factory.setHost("127.0.0.1");
  9. factory.setPort(5672);
  10. factory.setUsername("admin");
  11. factory.setPassword("admin");
  12. //创建连接
  13. Connection connection = factory.newConnection();
  14. //创建消息通道
  15. Channel channel = connection.createChannel();
  16. //生成一个消息队列
  17. channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  18. for (int i = 0; i < 10; i++) {
  19. String message = "Hello World RabbitMQ count: " + i;
  20. //发布消息,第一个参数表示路由(Exchange名称),未""则表示使用默认消息路由
  21. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  22. System.out.println(" [x] Sent '" + message + "'");
  23. }
  24. //关闭消息通道和连接
  25. channel.close();
  26. connection.close();
  27. }
  28. @Test
  29. public void consumer() throws java.io.IOException, java.lang.InterruptedException, TimeoutException {
  30. //创建连接工厂
  31. ConnectionFactory factory = new ConnectionFactory();
  32. factory.setHost("127.0.0.1");
  33. factory.setPort(5672);
  34. factory.setUsername("admin");
  35. factory.setPassword("admin");
  36. //创建连接
  37. Connection connection = factory.newConnection();
  38. //创建消息信道
  39. Channel channel = connection.createChannel();
  40. //消息队列
  41. channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  42. System.out.println("[*] Waiting for message. To exist press CTRL+C");
  43. AtomicInteger count = new AtomicInteger(0);
  44. //消费者用于获取消息信道绑定的消息队列中的信息
  45. Consumer consumer = new DefaultConsumer(channel) {
  46. @Override
  47. public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
  48. byte[] body) throws IOException {
  49. String message = new String(body, "UTF-8");
  50. try {
  51. System.out.println(" [x] Received '" + message);
  52. } finally {
  53. System.out.println(" [x] Done");
  54. channel.basicAck(envelope.getDeliveryTag(), false);
  55. }
  56. }
  57. };
  58. channel.basicConsume(QUEUE_NAME, false, consumer);
  59. Thread.sleep(1000 * 60);
  60. }
  61. }

需要注意的一点是:

  • 生产消息: channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  • 消费消息: channel.queueDeclare(QUEUE_NAME, true, false, false, null);
  • 生产和消费都声明channel,要求两者的配置参数一致,否则无法消费数据

3. 输出说明

首先执行塞入数据,执行完毕之后,可以到控制台进行查看:

out

可以看到多出了一个Queue,对列名为hello,总共有10条数据


接下来就是消费数据了,执行consumer方法,输出日志

  1. [*] Waiting for message. To exist press CTRL+C
  2. [x] Received 'Hello World RabbitMQ count: 0
  3. [x] Done
  4. [x] Received 'Hello World RabbitMQ count: 1
  5. [x] Done
  6. [x] Received 'Hello World RabbitMQ count: 2
  7. [x] Done
  8. [x] Received 'Hello World RabbitMQ count: 3
  9. [x] Done
  10. [x] Received 'Hello World RabbitMQ count: 4
  11. [x] Done
  12. [x] Received 'Hello World RabbitMQ count: 5
  13. [x] Done
  14. [x] Received 'Hello World RabbitMQ count: 6
  15. [x] Done
  16. [x] Received 'Hello World RabbitMQ count: 7
  17. [x] Done
  18. [x] Received 'Hello World RabbitMQ count: 8
  19. [x] Done
  20. [x] Received 'Hello World RabbitMQ count: 9
  21. [x] Done

回头去查看queue,发现总得数据量为0了

4. ACK问题

对于ack的问题,如果在消费数据的时候,出现异常,而我不希望数据丢失,这个时候就需要考虑手动ack的机制来保证了

首先需要设置手动ack

  1. // 设置autoAck为false
  2. channel.basicConsume(QUEUE_NAME, false, consumer);

其次在消费数据完毕之后,主动ack/nack

  1. if (success) {
  2. channel.basicAck(envelope.getDeliveryTag(), false);
  3. } else {
  4. channel.basicNack(envelope.getDeliveryTag(), false, false);
  5. }

转载:https://www.cnblogs.com/yihuihui/p/9095130.html

          https://blog.csdn.net/lettyisme/article/details/82149614

          https://www.jianshu.com/p/4900521606fb

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

闽ICP备14008679号