需求:使用简单模式完成消息传递

    步骤:

    ① 创建工程(生成者、消费者)
    ② 分别添加依赖
    ③ 编写生产者发送消息
    ④ 编写消费者接收消息

    1)创建工程
    image.png
    2)添加依赖

    1. <dependencies>
    2. <!--rabbitmq java 客户端-->
    3. <dependency>
    4. <groupId>com.rabbitmq</groupId>
    5. <artifactId>amqp-client</artifactId>
    6. <version>5.6.0</version>
    7. </dependency>
    8. </dependencies>
    9. <build>
    10. <plugins>
    11. <plugin>
    12. <groupId>org.apache.maven.plugins</groupId>
    13. <artifactId>maven-compiler-plugin</artifactId>
    14. <version>3.8.0</version>
    15. <configuration>
    16. <source>1.8</source>
    17. <target>1.8</target>
    18. </configuration>
    19. </plugin>
    20. </plugins>
    21. </build>

    3) 编写生产者发送消息

    1. /**
    2. * 发送消息
    3. */
    4. public class Producer_HelloWorld {
    5. public static void main(String[] args) throws IOException, TimeoutException {
    6. //1.创建连接工厂
    7. ConnectionFactory factory = new ConnectionFactory();
    8. //2. 设置参数
    9. factory.setHost("172.16.98.133");//ip 默认值 localhost
    10. factory.setPort(5672); //端口 默认值 5672
    11. factory.setVirtualHost("/itcast");//虚拟机 默认值/
    12. factory.setUsername("heima");//用户名 默认 guest
    13. factory.setPassword("heima");//密码 默认值 guest
    14. //3. 创建连接 Connection
    15. Connection connection = factory.newConnection();
    16. //4. 创建Channel
    17. Channel channel = connection.createChannel();
    18. //5. 创建队列Queue
    19. /*
    20. queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
    21. 参数:
    22. 1. queue:队列名称
    23. 2. durable:是否持久化,当mq重启之后,还在
    24. 3. exclusive:
    25. * 是否独占。只能有一个消费者监听这队列
    26. * 当Connection关闭时,是否删除队列
    27. *
    28. 4. autoDelete:是否自动删除。当没有Consumer时,自动删除掉
    29. 5. arguments:参数。
    30. */
    31. //如果没有一个名字叫hello_world的队列,则会创建该队列,如果有则不会创建
    32. channel.queueDeclare("hello_world",true,false,false,null);
    33. /*
    34. basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
    35. 参数:
    36. 1. exchange:交换机名称。简单模式下交换机会使用默认的 ""
    37. 2. routingKey:路由名称
    38. 3. props:配置信息
    39. 4. body:发送消息数据
    40. */
    41. String body = "hello rabbitmq~~~";
    42. //6. 发送消息
    43. channel.basicPublish("","hello_world",null,body.getBytes());
    44. //7.释放资源
    45. channel.close();
    46. connection.close();
    47. }
    48. }

    4) 编写消费者接收消息

    1. public class Consumer_HelloWorld {
    2. public static void main(String[] args) throws IOException, TimeoutException {
    3. //1.创建连接工厂
    4. ConnectionFactory factory = new ConnectionFactory();
    5. //2. 设置参数
    6. factory.setHost("172.16.98.133");//ip 默认值 localhost
    7. factory.setPort(5672); //端口 默认值 5672
    8. factory.setVirtualHost("/itcast");//虚拟机 默认值/
    9. factory.setUsername("heima");//用户名 默认 guest
    10. factory.setPassword("heima");//密码 默认值 guest
    11. //3. 创建连接 Connection
    12. Connection connection = factory.newConnection();
    13. //4. 创建Channel
    14. Channel channel = connection.createChannel();
    15. /*
    16. basicConsume(String queue, boolean autoAck, Consumer callback)
    17. 参数:
    18. 1. queue:队列名称
    19. 2. autoAck:是否自动确认
    20. 3. callback:回调对象
    21. */
    22. // 接收消息
    23. Consumer consumer = new DefaultConsumer(channel){
    24. /*
    25. 回调方法,当收到消息后,会自动执行该方法
    26. 1. consumerTag:标识
    27. 2. envelope:获取一些信息,交换机,路由key...
    28. 3. properties:配置信息
    29. 4. body:数据
    30. */
    31. @Override
    32. public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    33. System.out.println("consumerTag:"+consumerTag);
    34. System.out.println("Exchange:"+envelope.getExchange());
    35. System.out.println("RoutingKey:"+envelope.getRoutingKey());
    36. System.out.println("properties:"+properties);
    37. System.out.println("body:"+new String(body));
    38. }
    39. };
    40. channel.basicConsume("hello_world",true,consumer);
    41. //关闭资源?不要
    42. }
    43. }

    小结 :

    上述的入门案例中其实使用的是如下的简单模式:
    image.png
    在上图的模型中,有以下概念:

    • P:生产者: 也就是要发送消息的程序
    • C:消费者:消息的接收者,会一直等待消息到来
    • queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息