炒鸡辣鸡说RabbitMQ

不求甚解

收取音讯

@Service@Slf4jpublic class RabbitMqMessage {    private static final String EXCHANGE = "html";    private static final String CHECK_QUEUE = "check-queue";    @Autowired    private DoCheckTask doCheckTask;        @Bean    private Declarables declarables() {        Queue queue = new Queue(CHECK_QUEUE);        FanoutExchange exchange = new FanoutExchange(EXCHANGE);        return new Declarables(queue, exchange, BindingBuilder.bind(queue).to(exchange));    }    @RabbitListener(queues = CHECK_QUEUE)    public void receiverHtml(String urlContent) {        UrlContent urlContent1 = Json.toObject(urlContent, UrlContent.class);        doCheckTask.urlContentPriorityBlockingQueue.add(urlContent1);    }}

发送音讯

@Service@Slf4j@Configurationpublic class RabbitMqMessage {    @Autowired    private RabbitTemplate rabbitTemplate;    /**     * 页面内容播送交换机     */    private static final String HTML_EXCHANGE = "html";        @Bean    public Declarables declarables() {        FanoutExchange exchange = new FanoutExchange(HTML_EXCHANGE);        return new Declarables(exchange);    }    public void sendHtmlToMessageQueue(String urlContent) {        rabbitTemplate.convertAndSend(HTML_EXCHANGE, "", urlContent);    }}

简略来说,咱们只须要定义好消息队列的交换器和队列即可。交换器须要首先在你的治理页面中定义好。必不可少的是,咱们在配置文件中定义好连贯设置

spring.rabbitmq.host=spring.rabbitmq.port=spring.rabbitmq.username=spring.rabbitmq.password=

当然,既然咱们应用了音讯队列的注解,必不可少的,须要在依赖中装置相干的包,这里应用maven来治理包,所以相干的依赖为

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-amqp</artifactId>    <version>2.1.4.RELEASE</version></dependency>

是不是很简略?如果你比较忙,只有能用就行,那么抄下面的代码略微再批改一下,就能满足你的应用条件了。

还要干嘛?

再来看看这段代码,首先应用@Service注解,让springboot在启动的时候,spring容器会加载这个类,注册为一个服务,而后@Bean来绑定咱们的队列和交换机。你能够临时将音讯队列设想成带有存储性能的三层路由器。三层路由器具备交换机的性能,通过计算机网络的常识咱们晓得,交换机的性能是限定在局域网中,那么应用同一个exchange都是同一个局域网的(虚构局域网也是局域网),所以咱们在定义哪些队列绑定哪些交换器的时候,也须要思考业务音讯的相关性,不能一股脑的全副放在同一个交换器下。

@Beanprivate Declarables declarables() {    Queue queue = new Queue(CHECK_QUEUE); // 定义队列对象:从哪个队列中获取信息    FanoutExchange exchange = new FanoutExchange(EXCHANGE); // 定义交换器对象    return new Declarables(queue, exchange, BindingBuilder.bind(queue).to(exchange)); // 将两者绑定起来}

这段代码,在我的项目启动的时候,@Bean会通知spring容器去执行这段代码,并生成这样的Declarables,也就是绑定胜利了。而后咱们只须要定义监听这个队列的函数即可。

@RabbitListener(queues = CHECK_QUEUE)public void receiverHtml(String urlContent) {    UrlContent urlContent1 = Json.toObject(urlContent, UrlContent.class);    doCheckTask.urlContentPriorityBlockingQueue.add(urlContent1);}

这段代码就是绑定了监听队列CHECK_QUEUE,当监听到该队列中有数据时,receiverHtml办法就会被调用,而后数据被放到urlContent中。

发送音讯局部也一样

@Beanpublic Declarables declarables() {    FanoutExchange exchange = new FanoutExchange(HTML_EXCHANGE);    return new Declarables(exchange);}

这里也是注册了一个交换器,为啥要在注册一次?如果你是在一个我的项目中,那么不须要再次申明该exchange。

public void sendHtmlToMessageQueue(String urlContent) {    rabbitTemplate.convertAndSend(HTML_EXCHANGE, "", urlContent);}

发送音讯到交换器,间接应用rabbitTemplate实现即可。

求甚解

理解交换器和队列

队列

AnonymousQueue:代表一个匿名的,非长久的,排他的,主动删除队列

Queue:默认的队列

交换器

DirectExchange:它会把音讯路由到那些 BindingKey RoutingKey 齐全匹配的队列中。

FanoutExchange:播送交换器:它会把所有发送到该交换器的音讯路由到所有与该交换器绑定的队列中。

TopicExchange:主题交换器

HeadersExchange:不依赖于路由键的匹配规定来路由音讯,而是依据发送的音讯内容中 headers 属性进行匹配。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。

CustomExchange:含糊匹配

AbstractExchange:形象交换器,作为根底存在

如果队列特地多怎么办

集中控制,在官网的demo中,有一种计划是将全副队列和交换器注册在一起

一共四个文件,一个注册bean的文件叫RabbitMqConfig.java用于注册所有的Bean。而后一个ConstNames用于寄存所有的名字。一个sender和一个receiver即可。

就像这样:

@Configurationpublic class RabbitMqConfig {    @Bean    public Receiver receiver() {        return new Receiver();    }    @Bean    public DirectExchange exchange(){        return new DirectExchange(ConstNames.EXCHANGE);    }    @Bean    public Queue queue(){        return new Queue(ConstNames.QUEUE);    }    @Bean    public Binding bindingEvent(DirectExchange exchange,Queue queue){        return BindingBuilder.bind(queue).to(exchange).withQueueName();    }        @Bean    public xxxx xxxx(){        // 这里再定义一个Sender即可    }}// Receiver.javapublic class Receiver {    @RabbitListener(queues = ConstNames.QUEUE)    public void receiveEvent(String in) {        System.out.println(in);    }}// 治理名字public class ConstNames{    public static final String EXCHANGE = "exchange";    public static final String QUEUE = "queue";}

这样就防止写大量反复的代码了,同时下面的内容也能够写个货色主动生成代码。

炒鸡辣鸡原创文章,转载请注明起源