交换器、队列、绑定的声明
SpringAMQP项目对RabbitMQ做了很好的封装,可以很方便的手动声明队列,交换器,绑定。如下:
/** * 队列 * @return */ @Bean @Qualifier(RabbitMQConstant.PROGRAMMATICALLY_QUEUE) Queue queue() { return new Queue(RabbitMQConstant.PROGRAMMATICALLY_QUEUE, false, false, true); } /** * 交换器 * @return */ @Bean @Qualifier(RabbitMQConstant.PROGRAMMATICALLY_EXCHANGE) TopicExchange exchange() { return new TopicExchange(RabbitMQConstant.PROGRAMMATICALLY_EXCHANGE, false, true); } /** * 声明绑定关系 * @return */ @Bean Binding binding(@Qualifier(RabbitMQConstant.PROGRAMMATICALLY_EXCHANGE) TopicExchange exchange, @Qualifier(RabbitMQConstant.PROGRAMMATICALLY_QUEUE) Queue queue) { return BindingBuilder.bind(queue).to(exchange).with(RabbitMQConstant.PROGRAMMATICALLY_KEY); } /** * 声明简单的消费者,接收到的都是原始的{@link Message} * * @param connectionFactory * * @return */ @Bean SimpleMessageListenerContainer simpleContainer(ConnectionFactory connectionFactory) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setMessageListener(message -> log.info("simple receiver,message:{}", message)); container.setQueueNames(RabbitMQConstant.PROGRAMMATICALLY_QUEUE); return container; }
消费者和生产者都可以声明,交换器这种一般经常创建,可以手动创建。需要注意对于没有路由到队列的消息会被丢弃。
推荐观看
大厂面试真题集结地:阿里三面+腾讯二面+支付宝三面+拼多多二面+字节四面+淘宝五面_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
厉害了!B站最全网络底层汇总:TCP、Sockt、三次握手、四次挥手、NIO、Epoll、多路复用(附赠源码、脑图)www.bilibili.com
阿里资深架构师讲解最“细”的spring源码(附赠讲课资料和源码)www.bilibili.com
Java架构师必会六大核心知识点:多线程、JVM、设计模式、MySQL、Redis、ZooKeeperwww.bilibili.com
你从未听过的全新版本!Tomcat、TCP/IP、IO、分布式微服务架构全解www.bilibili.com
如果是Spring的话还需要声明连接:
@Bean ConnectionFactory connectionFactory(@Value("${spring.rabbitmq.port}") int port, @Value("${spring.rabbitmq.host}") String host, @Value("${spring.rabbitmq.username}") String userName, @Value("${spring.rabbitmq.password}") String password, @Value("${spring.rabbitmq.publisher-confirms}") boolean isConfirm, @Value("${spring.rabbitmq.virtual-host}") String vhost) { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(host); connectionFactory.setVirtualHost(vhost); connectionFactory.setPort(port); connectionFactory.setUsername(userName); connectionFactory.setPassword(password); connectionFactory.setPublisherConfirms(isConfirm); }
在配置类使用@EnableRabbit的情况下,也可以基于注解进行声明,在Bean的方法上加上@RabbitListener,如下:
/** * 可以直接通过注解声明交换器、绑定、队列。但是如果声明的和rabbitMq中已经存在的不一致的话 * 会报错便于测试,我这里都是不使用持久化,没有消费者之后自动删除 * {@link RabbitListener}是可以重复的。并且声明队列绑定的key也可以有多个. * * @param headers * @param msg */ @RabbitListener( bindings = @QueueBinding( exchange = @Exchange(value = RabbitMQConstant.DEFAULT_EXCHANGE, type = ExchangeTypes.TOPIC, durable = RabbitMQConstant.FALSE_CONSTANT, autoDelete = RabbitMQConstant.true_CONSTANT), value = @Queue(value = RabbitMQConstant.DEFAULT_QUEUE, durable = RabbitMQConstant.FALSE_CONSTANT, autoDelete = RabbitMQConstant.true_CONSTANT), key = DKEY ), //手动指明消费者的监听容器,默认Spring为自动生成一个SimpleMessageListenerContainer containerFactory = "container", //指定消费者的线程数量,一个线程会打开一个Channel,一个队列上的消息只会被消费一次(不考虑消息重新入队列的情况),下面的表示至少开启5个线程,最多10个。线程的数目需要根据你的任务来决定,如果是计算密集型,线程的数目就应该少一些 concurrency = "5-10" ) publ