rabbitMq的相关概念

1.Exchange

direct:根据routingKey匹配 既路由模式

fanout:不指定名称进行广播消息,既发布订阅模式

topic:根据routingKey进行正则匹配,即topic模式

headers:

SendLogTopic.java

package com.caicongyang.mq.topic;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.util.UUID;

/**
 * @author caicongyang1
 * @version id: SendLogTopic, v 0.1 16/9/30 下午2:20 caicongyang1 Exp $$
 */
public class SendLogTopic {
    private final static String EXCHANGE_NAME = "topic-logger";

    public static void main(String[] args) throws Exception {
        // 创建连接和频道    
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.236.103");
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setPort(AMQP.PROTOCOL.PORT);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        // 声明转发器  
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        //定义绑定键     
        String[] routing_keys = new String[] { "login.fail.user", "", "login.success.user" };
        for (String routing_key : routing_keys) {
            //发送4条不同绑定键的消息  
            String msg = UUID.randomUUID().toString();
            channel.basicPublish(EXCHANGE_NAME, routing_key, null, msg.getBytes());
            System.out.println(" [x] Sent routingKey = " + routing_key + " ,msg = " + msg + ".");
        }

        channel.close();
        connection.close();
    }

}


ReceiveLogsFromTopic.java

package com.caicongyang.mq.topic;
import com.rabbitmq.client.*;

/**
 * @author caicongyang1
 * @version id: ReceiveLogsFromTopic, v 0.1 16/9/30 下午2:24 caicongyang1 Exp $$
 */
public class ReceiveLogsFromTopic {
    private final static String EXCHANGE_NAME = "topic-logger";
    public static void main(String[] args) throws Exception {
        // 创建连接和频道    
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.236.103");
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setPort(AMQP.PROTOCOL.PORT);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        // 声明转发器  
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");
        // 随机生成一个队列    
        String queueName = channel.queueDeclare().getQueue();
        //接收所有与kernel相关的消息    
        channel.queueBind(queueName, EXCHANGE_NAME, "login.fail.user");
        System.out.println(" [*] Waiting for messages about login.fail.user");
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(queueName, true, consumer);
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            String routingKey = delivery.getEnvelope().getRoutingKey();
            System.out.println(" [x] Received routingKey = " + routingKey + ",msg = " + message + ".");
        }
    }
}


2.消息类型:

MINIMAL_BASIC
MINIMAL_PERSISTENT_BASIC
BASIC
PERSISTENT_BASIC
TEXT_PLAIN 
PERSISTENT_TEXT_PLAIN  //持久化文本消息

设置消息持久化:

//往队列中发出一条消息
//MessageProperties.PERSISTENT_TEXT_PLAIN 标识我们的信息为持久化的
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN , message.getBytes());

3.自动应答:

//打开手动应答机制,默认为true,自动应答
boolean ack = false; 
// 指定消费队列
channel.basicConsume(QUEUE_NAME, ack, consumer);
//公平转发  设置最大服务转发消息数量    只有在消费者空闲的时候会发送下一条信息。
int prefetchCount = 1;
channel.basicQos(prefetchCount);
while (true) {
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());
      System.out.println(" Received Message:'" + message + "'");
      //发送应答
      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}



更多精彩内容请继续关注我的博客http://blog.csdn.NET/caicongyang

记录与分享,你我共成长 -from  caicongyang



你可能感兴趣的:(mq)