乐趣区

关于node.js:简单使用rabbitmq-和一些改进

炒鸡辣鸡说 RabbitMQ

不求甚解

收取音讯

@Service
@Slf4j
public 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
@Configuration
public 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 都是同一个局域网的(虚构局域网也是局域网),所以咱们在定义哪些队列绑定哪些交换器的时候,也须要思考业务音讯的相关性,不能一股脑的全副放在同一个交换器下。

@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)); // 将两者绑定起来
}

这段代码,在我的项目启动的时候,@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 中。

发送音讯局部也一样

@Bean
public 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 即可。

就像这样:

@Configuration
public 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.java
public 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";
}

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

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

退出移动版