Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。
publish端:
//由exchanges+routingkey匹配才广播消息
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
String[] messages = new String[]{"111 message.","211 message..","311 message...","411 message....","511 message.....","611 message.....","711 message.....","811 message.....","911 message....."};
for(String msg : messages){
//在direct类型中需要指定路由routingkey
channel.basicPublish(EXCHANGE_NAME, "routingkey", null, msg.getBytes());
System.out.println(" [x] Sent '" + msg + "'");
}
subscrbe:
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//服务器创建队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到exchange,且指定一个路由key
channel.queueBind(queueName, EXCHANGE_NAME, "routingkey");
Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
publish:
//创建exchange
//fanout将消息广播到全部绑定的队列中
//channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String[] messages = new String[]{"111 message.","211 message..","311 message...","411 message....","511 message.....","611 message.....","711 message.....","811 message.....","911 message....."};
for(String msg : messages){
channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
System.out.println(" [x] Sent '" + msg + "'");
}
subscribe:
//创建exchange
//fanout将消息广播到队列中
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//服务器创建队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到exchange
channel.queueBind(queueName, EXCHANGE_NAME, "");
Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。
publish:
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String[] messages = new String[]{"111 message.","211 message..","311 message...","411 message....","511 message.....","611 message.....","711 message.....","811 message.....","911 message....."};
for(String msg : messages){
channel.basicPublish(EXCHANGE_NAME, "routingkey.yzr", null, msg.getBytes());
System.out.println(" [x] Sent '" + msg + "'");
}
subscribe:
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//服务器创建队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到exchange
channel.queueBind(queueName, EXCHANGE_NAME, "routingkey.*");
headers :一个map集合属性的key来匹配.
publish:
//创建exchange
//fanout将消息广播到队列中
//channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//由exchanges+routingkey匹配才有广播消息
//channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.exchangeDeclare(EXCHANGE_NAME, "headers");
String[] messages = new String[]{"111 message.","211 message..","311 message...","411 message....","511 message.....","611 message.....","711 message.....","811 message.....","911 message....."};
for(String msg : messages){
//在direct类型中需要指定队列名,即路由routingkey
//channel.basicPublish(EXCHANGE_NAME, "routingkey", null, msg.getBytes());
//channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
//channel.basicPublish(EXCHANGE_NAME, "routingkey.yzr", null, msg.getBytes());
BasicProperties properties=new BasicProperties();
Map<String,Object> headers=new HashMap<String,Object>();
headers.put("key1", "12345");
properties.builder().headers(headers);
channel.basicPublish(EXCHANGE_NAME, "routingkey.yzr", properties, msg.getBytes());
System.out.println(" [x] Sent '" + msg + "'");
}
subscribe:
//创建exchange
//fanout将消息广播到队列中
//channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.exchangeDeclare(EXCHANGE_NAME, "headers");
//服务器创建队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到exchange
//channel.queueBind(queueName, EXCHANGE_NAME, "routingkey");
//channel.queueBind(queueName, EXCHANGE_NAME, "");
//channel.queueBind(queueName, EXCHANGE_NAME, "routingkey.*");
Map<String,Object> spec=new HashMap<String,Object>();
spec.put("key1", "12345");
channel.queueBind(queueName, EXCHANGE_NAME, "",spec);
使用fanout简单演示的完整代码:
package yzr.main;
import java.util.HashMap;
import java.util.Map;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class EmitLog {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] argv)
throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//创建exchange
//fanout将消息广播到队列中
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//由exchanges+routingkey匹配才有广播消息
//channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//channel.exchangeDeclare(EXCHANGE_NAME, "headers");
String[] messages = new String[]{"111 message.","211 message..","311 message...","411 message....","511 message.....","611 message.....","711 message.....","811 message.....","911 message....."};
for(String msg : messages){
//在direct类型中需要指定队列名,即路由routingkey
//channel.basicPublish(EXCHANGE_NAME, "routingkey", null, msg.getBytes());
channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
//channel.basicPublish(EXCHANGE_NAME, "routingkey.yzr", null, msg.getBytes());
//BasicProperties properties=new BasicProperties();
//Map<String,Object> headers=new HashMap<String,Object>();
//headers.put("key1", "12345");
//properties.builder().headers(headers);
//channel.basicPublish(EXCHANGE_NAME, "routingkey.yzr", properties, msg.getBytes());
System.out.println(" [x] Sent '" + msg + "'");
}
channel.close();
connection.close();
}
}
package yzr.main;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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 ReceiveLogs {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//创建exchange
//fanout将消息广播到队列中
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//channel.exchangeDeclare(EXCHANGE_NAME, "headers");
//服务器创建队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到exchange
//channel.queueBind(queueName, EXCHANGE_NAME, "routingkey");
channel.queueBind(queueName, EXCHANGE_NAME, "");
//channel.queueBind(queueName, EXCHANGE_NAME, "routingkey.*");
//Map<String,Object> spec=new HashMap<String,Object>();
//spec.put("key1", "12345");
//channel.queueBind(queueName, EXCHANGE_NAME, "",spec);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
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(" [x] Received '" + message + "'");
}
};
channel.basicConsume(queueName, true, consumer);
}
}