队列式:一条消息只能被一个消费者消费(发布者、消费者)
主题式:一条消息可以被每一个消费者消费(发布者、订阅者)
一个消费者消费一个队列的消息
两个(或多个)消费者消费一个队列的消息(每条消息只能被消费一次)
1.1 消息发送
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 生产者
*/
public class ComProducer {
public static String QUEUE_NAME = "aque";
public static String EXCHANGE_NAME = "aexc";
public static String ROUTING_KEY = "aaa";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory cf = new ConnectionFactory();
cf.setHost("127.0.0.1");
cf.setPort(5672);
cf.setUsername("guest");
cf.setPassword("guest");
//建立连接
Connection conn = cf.newConnection();
//创建消息通道
Channel channel = conn.createChannel();
//消息内容
String msg = " hello world! ";
//创建 队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//创建路由
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//绑定路由与队列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
//发送消息
for (byte i = 0; i < 10; i++) {
String m = i+msg;
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY , null, m.getBytes());
}
channel.close();
conn.close();
}
}
1.2 消息接收
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;
/**
* 消费者
*/
public class ComConsumer {
public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
ConnectionFactory cf = new ConnectionFactory();
cf.setHost("127.0.0.1");
cf.setPort(5672);
cf.setUsername("guest");
cf.setPassword("guest");
//建立连接
Connection conn = cf.newConnection();
//创建消息通道
Channel channel = conn.createChannel();
//创建消费者,并接受消息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("接收消息:"+msg);
}
};
channel.basicConsume(ComProducer.QUEUE_NAME, true, consumer);
}
}
消息发送到转发器,然后转发到每个消费者的队列(一条消息被每一个订阅者消费)
2.1 发布消息
ROUTING_KEY = "topic_key.aaa"
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.google.common.base.Strings;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 发布者
*/
public class ComPublisher {
public static String EXCHANGE_NAME = "topic_exc";
public static String ROUTING_KEY = "topic_key.aaa";
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接连接到MabbitMQ
ConnectionFactory factory = new ConnectionFactory();
// 设置MabbitMQ所在主机ip或者主机名
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建消息通道
Channel channel = connection.createChannel();
// 指定转发——广播
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
for(int i=0;i<10;i++){
// 发送的消息
String message =i+" Hello World!";
//参数1:exchange name
//参数2:routing key
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
}
// 关闭频道和连接
channel.close();
connection.close();
}
}
2.2 订阅者1
ROUTING_KEY = "topic_key.aaa";
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
* 订阅者
*/
public class ComSubscribe {
public static void main(String[] args) throws IOException, InterruptedException, TimeoutException {
String ROUTING_KEY = "topic_key.aaa";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
// 打开连接和创建频道,与发送端一样
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 声明一个随机队列
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, ComPublisher.EXCHANGE_NAME, ROUTING_KEY);
// 创建队列消费者
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println( envelope.getRoutingKey() + " : " + message );
}
};
channel.basicConsume(queueName, true, consumer);
}
}
2.3 订阅者2
ROUTING_KEY = "topic_key.*";// 或 "topic_key.#"
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
*
* @author lyb
* 2018年7月13日 下午6:29:45
*/
public class ComSubscribe2 {
public static void main(String[] argv) throws IOException, InterruptedException, TimeoutException {
String ROUTING_KEY = "topic_key.*";// 或 "topic_key.#"
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
// 打开连接和创建频道,与发送端一样
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
// // 声明一个随机队列
// String queueName = channel.queueDeclare().getQueue();
// 声明队列
String QUEUE_NAME = "topic_queque";
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, ComPublisher.EXCHANGE_NAME, ROUTING_KEY);
// 创建队列消费者
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println( envelope.getRoutingKey() + " : " + message );
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}