// 创建连接和频道
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.40.132");
factory.setPort(5672);
factory.setUsername("lscl");
factory.setPassword("admin");
factory.setVirtualHost("/lscl");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
/\*
定义一个交换机为header类型
true:代表持久化
true:代自动删除(没有consumer时自动销毁)
false:代表不是内部使用的交换机
null:传递的参数为null
*/
String exchangeName = “test_header”;
// 声明交换机和类型headers
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.HEADERS, true, false, false, null);
String queue = "test\_header\_queue";
// 定义队列
channel.queueDeclare(queue, true, false, false, null);
// 声明header
Map<String, Object> bindingHeaders = new HashMap<>();
/\*
all:代表发送消息时必须匹配header中的所有key/val对
any:代表发送消息时只需要匹配header中的任意一个key/val对
*/
bindingHeaders.put(“x-match”, “all”);
bindingHeaders.put(“key1”, “147”);
bindingHeaders.put(“key2”, “258”);
bindingHeaders.put(“key3”, “369”);
// 将交换机绑定到队列,并指定header信息
channel.queueBind(queue, exchangeName, "", bindingHeaders);
String body = "header....";
// 发送信息携带的header
Map<String, Object> requestHeader = new HashMap<>();
requestHeader.put("key1", "147");
// requestHeader.put(“key2”, “258”);
// requestHeader.put(“key3”, “369”);
// 消息配置对象
Builder properties = new AMQP.BasicProperties.Builder();
properties.headers(requestHeader);
// 将消息直接发送给交换机(携带指定的参数header),让交换机自己根据header条件去转发到指定queue
channel.basicPublish(exchangeName, "", properties.build(), body.getBytes());
channel.close();
connection.close();
}
}
#### 4.8.3 消费者
package com.lscl.rabbitmq;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import com.rabbitmq.client.*;
public class Consumer11_Header {
public static void main(String[] args) throws Exception {
// 创建连接和频道
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(“192.168.40.132”);
factory.setPort(5672);
factory.setUsername(“lscl”);
factory.setPassword(“admin”);
factory.setVirtualHost(“/lscl”);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.basicConsume("test\_header\_queue", true, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body:" + new String(body));
}
});
}
}
#### 4.8.4 header类型交换机小结
在`header`类型交换机中,放弃了`routing key`,取而代之的是`key/value`键值对,在Producer绑定队列时指定`key/value`键值对,当Producer发送消息时也会指定一个`key/value`键值对,如果此时的`key/value`键值对符合当初绑定队列的键值对,那么消息就可以路由到此队列,反之消息则丢失;
* `header`类型交换机工作原理图:
### 给大家的福利
**零基础入门**
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)
同时每个成长路线对应的板块都有配套的视频提供:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)
因篇幅有限,仅展示部分资料
网络安全面试题
![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)
绿盟护网行动
![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)
还有大家最喜欢的黑客技术
![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)
**网络安全源码合集+工具包**
![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)
![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)
**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**