精华内容
下载资源
问答
  • 交换器怎样安装
    千次阅读
    2018-04-08 19:38:28

    首先,邮件交换器记录(MX)肯定是和邮件服务有关的,但并不是所有的邮件服务都需要用到它。下面举例说明:

    假设一、

    用户安装花生壳的计算机就是一台邮件服务器。
    那么这种情况下,用户不需要为他的邮件服务添加邮件交换器记录(MX)。当用户在线时用户就能自由的收发信件。收发邮件时所用的POP3和SMTP服务器都指向自己的域名即可。
    注意:当用户离线时所有当时发往该域的邮件都会丢失!
    假设二、

    用户花生壳软件的计算机不是邮件服务器,邮件服务由另一台计算机提供。
    例如,用户拥有自己的域名(顶级或免费的二级域名),这里假设为username.com,同时用户在某一邮件服务商那里购买了邮件空间,服务商提供的邮件服务器是mail.mailserver.com,在这种情况下,用户需要添加邮件交换器记录(MX)。
    1.如果用户需要的邮件后缀是 username.com(与自己的顶级域名同名,邮件地址为username@username.com),那么添加MX记录如下:
    主机或域名:@ (at符号)
    邮件服务器:mail.mailserver.com (由相关的邮件服务商提供给用户)
    优先级:(如无特殊需求,默认即可)
    生存时间(TTL):建议设置较大的数值
    注意:收发邮件时所用的POP3和SMTP服务器由相关的邮件服务商提供给用户。
    2.如果用户需要的邮件后缀是mail.username.com(即<自定义>.username.com,邮件地址为 username@<自定>.username.com),那么添加MX记录如下:
    主机或域名:mail
    邮件服务器:mail.mailserver.com(由相关的邮件服务商提供给用户)
    优先级:(如无特殊需求,默认即可)
    生存时间(TTL):建议设置较大的数值
    注意:在这种情况下,用户应该通知相关邮件服务商将购买的邮件服务的后缀也改为mail.username.com
    注意:收发邮件时所用的POP3和SMTP服务器由相关的邮件服务商提供给用户。
    注意:在假设二中,当用户离线时所有当时发往该域的邮件不会丢失!用户仍然可以正常收发信件。

    更多相关内容
  • 大金HRV全热交换器
  • 6.4.9、热水蒸汽锅炉、热交换器及其系统安装工程资料册封面
  • 3525热交换器系统设备安装检验批质量验收记录
  • 参考资料-3525热交换器系统设备安装检验批质量验收记录.zip
  • 节点交换器

    2021-03-03 10:54:11
    节点交换器 这是一个在Windows下更改节点版本的命令行工具,基于环境变量实现。 安装 在管理员权限下运行: npm i @minar-kotonoha/node-swapper -g 安装节点版本 在管理员权限下运行: node - swapper install ...
  • 文章目录1 交换器1.1 Direct 交换器1.1.1 使用需求1.1.2 Consumer消费者1.1.2.1 properties配置文件1.1.2.2 消费者实体类1.1.3 Provider提供者1.1.3.1 properties配置文件1.1.3.2 生产消息实体1.1.3.3 测试类1.2 ...

    1 交换器

    用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
    三种常用的交换器类型:

    • direct(发布与订阅 完全匹配)
    • topic(主题, 规则匹配)
    • fanout(广播)
      :这三个交换器都用这个坐标
    <!-- RabbitMQ的maven坐标 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-amqp</artifactId>
    		</dependency>
    

    1.1 Direct 交换器

    Direct交换器发布与订阅 完全匹配

    1.1.1 使用需求

    系统日志处理场景

    • 微服务产生的日志,交给日志处理器处理
    • 日志处理服务器有2个服务,分别为info,error
    • 服务的直接通信采用direct(发布订阅)
      在这里插入图片描述

    1.1.2 Consumer消费者

    1.1.2.1 properties配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    ####这些都是自定义的属性名#######
    # 设置交换器名称
    mq.config.exchange=log.direct
    #设置info队列名称
    mq.config.queue.info=log.info
    #设置info路由名称
    mq.config.queue.info.routing.key=log.info.routing.key
    #设置error队列名称
    mq.config.queue.error=log.error
    #设置error路由名称
    mq.config.queue.error.routing.key=log.error.routing.key
    

    1.1.2.2 消费者实体类

    @RabbitListener

    • 属性:bindings:绑定队列
      • 注解@QueueBinding
        • 属性:value:绑定队列的名称 (注解@Queuevalue:配置队列名称,autoDelete:是否是一个可删除的临时队列)
        • 属性:exchange:配置交换器(@Exchange :value·:为交换器起个名称,type:指定具体的交换器类型)
        • 属性:key:路由键
    @Component
    @RabbitListener(
    		bindings = 
    			@QueueBinding(value = @Queue(value = "${mq.config.queue.error}", autoDelete = "true"), 
    			exchange = @Exchange(value = "${mq.config.exchange}", type = ExchangeTypes.DIRECT), 
    			key = "${mq.config.queue.error.routing.key}")
    		)
    public class ErrorReceiver {
    
    	/**
    	 * 接收消息的方法 采用消息队列监听机制
    	 */
    	@RabbitHandler
    	public void process(String msg) {
    		System.out.println("error........." + msg);
    	}
    }
    

    1.1.3 Provider提供者

    1.1.3.1 properties配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    ##########此处的名字是自己随意定义的############
    # 设置交换器名称
    mq.config.exchange=log.direct
    #设置info队列名称
    mq.config.queue.info=log.info
    #设置info路由名称
    mq.config.queue.info.routing.key=log.info.routing.key
    #设置error队列名称
    mq.config.queue.error=log.error
    #设置error路由名称
    mq.config.queue.error.routing.key=log.error.routing.key
    ### 此处名字是rabbitmq的,不是自定义的,下面两个属性是为了怕连不上,而设置的重试
    # 是否打开重试次数
    spring.rabbitmq.listener.simple.retry.enabled=true
    # 设置rabbitmq最大重试次数
    spring.rabbitmq.listener.simple.retry.max-attempts=5
    

    1.1.3.2 生产消息实体

    @Component
    public class SenderDemo {
    
    	@Autowired
    	private AmqpTemplate template;
    	
    	//交换器名称
    	@Value("${mq.config.exchange}")
    	private String exchange;
    	
    	//路由键
    	@Value("${mq.config.queue.info.routing.key}")
    	private String routingKey;
    	
    	/**
    	 *   发送消息
    	 */
    	public void  send (String msg) {
    		//参数一:交换器名称
    		//参数二:路由键名称
    		//参数三:消息
    		this.template.convertAndSend(this.exchange,this.routingKey,msg);
    	}
    }
    

    1.1.3.3 测试类

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes=AppAction.class)
    public class TestSenderDemo {
    	@Autowired
    	private SenderDemo sender;
    	
    	@Test
    	public void testSend() throws InterruptedException {
    		int flag=0;
    		while(true) {
    			flag++;
    			Thread.sleep(2000);
    			System.out.println(flag);
    			this.sender.send("Hello RabbitMQ============="+flag);
    		}
    	}
    }
    

    1.2 Topic 交换器

    Topic 交换器,主题, 规则匹配,即模糊匹配

    1.2.1 使用需求

    在这里插入图片描述

    1.2.2 Consumer消费者

    1.2.2.1 properties配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    
    # 设置交换器名称
    mq.config.exchange=log.topic
    #设置info队列名称
    mq.config.queue.info=log.info
    #设置error队列名称
    mq.config.queue.error=log.error
    #log 队列名称
    mq.config.queue.logs=log.all
    

    1.2.2.2 消费者实体类

    @RabbitListener

    • 属性:bindings:绑定队列
      • 注解@QueueBinding
        • 属性:value:绑定队列的名称 (注解@Queuevalue:配置队列名称,autoDelete:是否是一个可删除的临时队列)
        • 属性:exchange:配置交换器(@Exchange :value·:为交换器起个名称,type:指定具体的交换器类型)
        • 属性:key:路由键
          InfoReceiver.java
    @Component
    @RabbitListener(
    bindings=@QueueBinding(
    value=@Queue(value="${mq.config.queue.info}",autoDelete="true"),
    exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
    key="*.log.info"
    )
    )
    public class InfoReceiver {
    /**
    * 接收消息的方法。 采用消息队列监听机制
    * @param msg
    */
    @RabbitHandler
    public void process(String msg){
    System.out.println("......Info........receiver:"+msg);
    }
    

    ErrorReceiver.java

    @Component
    @RabbitListener(
    bindings=@QueueBinding(
    value=@Queue(value="${mq.config.queue.error}",autoDelete="true"),
    exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
    key="*.log.error"
    )
    )
    public class ErrorReceiver {
    
    @RabbitHandler
    public void process(String msg){
    System.out.println("......Error........receiver:"+msg);
    }
    }
    

    LogsReceiver.java

    @Component
    @RabbitListener(
    bindings=@QueueBinding(
    value=@Queue(value="${mq.config.queue.logs}",autoDelete="true"),
    exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
    key="*.log.*"
    )
    )
    public class LogsReceiver {
    @RabbitHandler
    public void process(String msg){
    System.out.println("......All........receiver:"+msg);
    }
    }
    

    1.2.3 Provider提供者

    1.2.3.1 properties配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    
    #设置交换器的名称
    mq.config.exchange=log.topic
    

    1.2.3.2 生产消息类实体

    UserSender.java

    @Component
    public class UserSender {
    @Autowired
    private AmqpTemplate rabbitAmqpTemplate;
    //exchange 交换器名称
    @Value("${mq.config.exchange}")
    private String exchange;
    /*
    * 发送消息的方法
    */
    public void send(String msg){
    //向消息队列发送消息
    //参数一: 交换器名称。
    //参数二: 路由键
    //参数三: 消息
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.log.debug", "user.log.debug....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.log.info", "user.log.info....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.log.warn","user.log.warn....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"user.log.error", "user.log.error....."+msg);
    }
    }
    

    ProductSender

    @Component
    public class ProductSender {
    @Autowired
    private AmqpTemplate rabbitAmqpTemplate;
    //exchange 交换器名称
    @Value("${mq.config.exchange}")
    private String exchange;
    /*
    * 发送消息的方法
    */
    public void send(String msg){
    //向消息队列发送消息
    //参数一: 交换器名称。
    //参数二: 路由键
    //参数三: 消息
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"product.log.debug", "product.log.debug....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"product.log.info","product.log.info....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"product.log.warn","product.log.warn....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"product.log.error", "product.log.error....."+msg);
    }
    }
    

    OrderSender

    @Component
    public class OrderSender {
    @Autowired
    private AmqpTemplate rabbitAmqpTemplate;
    //exchange 交换器名称
    @Value("${mq.config.exchange}")
    private String exchange;
    /*
    * 发送消息的方法
    */
    public void send(String msg){
    //向消息队列发送消息
    //参数一: 交换器名称。
    //参数二: 路由键
    //参数三: 消息
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order.log.debug", "order.log.debug....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order.log.info", "order.log.info....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order.log.warn","order.log.warn....."+msg);
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"order.log.error", "order.log.error....."+msg);
    }
    }
    

    测试方法同1.1.3.3测试类,故不再赘述

    1.3 Fanout 交换器

    Fanout 交换器就是同步变异步,所有的队列都要发送,因此不需要路由键了

    1.3.1 需求

    在这里插入图片描述
    在这里插入图片描述

    1.3.2 Consumer消费者

    1.3.2.1 配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    
    #设置交换器的名称
    mq.config.exchange=order.fanout
    #短信服务队列名称
    mq.config.queue.sms=order.sms
    #push 服务队列名称
    mq.config.queue.push=order.push
    

    1.3.2.2 消费者实体类

    @RabbitListener

    • 属性:bindings:绑定队列
      • 注解@QueueBinding
        • 属性:value:绑定队列的名称 (注解@Queuevalue:配置队列名称,autoDelete:是否是一个可删除的临时队列)
        • 属性:exchange:配置交换器(@Exchange :value·:为交换器起个名称,type:指定具体的交换器类型)
        • 属性:key:路由键,因为是广播模式,所以不需要路由键
          SmsReceiver.java
    @Component
    @RabbitListener(
    bindings=@QueueBinding(
    value=@Queue(value="${mq.config.queue.sms}",autoDelete="true"),
    exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)
    )
    )
    public class SmsReceiver {
    
    @RabbitHandler
    public void process(String msg){
    System.out.println("Sms........receiver: "+msg);
    }
    }
    

    PushReceiver.java

    @Component
    @RabbitListener(
    bindings=@QueueBinding(
    value=@Queue(value="${mq.config.queue.push}",autoDelete="true"),
    exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)
    )
    )
    public class PushReceiver {
    @RabbitHandler
    public void process(String msg){
    System.out.println("Push..........receiver: "+msg);
    }
    }
    

    1.3.3 provider生产者

    1.3.3.1 配置文件

    # RabbitMQ的安装地址
    spring.rabbitmq.host=192.168.126.140
    # RabbitMQ的访问端口,和页面的15672端口不一样
    spring.rabbitmq.port=5672
    # RabbitMQ的用户名
    spring.rabbitmq.username=rabbitmq
    # RabbitMQ的密码
    spring.rabbitmq.password=123456
    #设置交换器的名称
    mq.config.exchange=order.fanout
    

    1.3.3.2 生产者实体类

    因为是广播模式,所以路由键是空字符串

    @Component
    public class Sender {
    @Autowired
    private AmqpTemplate rabbitAmqpTemplate;
    //exchange 交换器名称
    @Value("${mq.config.exchange}")
    private String exchange;
    /*
    * 发送消息的方法
    */
    public void send(String msg){
    //向消息队列发送消息
    //参数一: 交换器名称。
    //参数二: 路由键 因为广播模式,所以路由键是空字符串
    //参数三: 消息
    this.rabbitAmqpTemplate.convertAndSend(this.exchange,"",msg);
    }
    }
    

    1.4 RabbitMQ的消息持久化处理

    消息的可靠性是 RabbitMQ 的一大特色, 那么 RabbitMQ 是如何保证消息可靠性的呢——消息持久化,主要通过在消息接收者上的注解@RabbitListener修改内部属性。

    1. @Queue属性中的autoDelete: 当所有消费客户端连接断开后, 是否自动删除队列 true: 删除 false: 不删除,默认为空字符串
    2. @Exchange属性中的autoDelete: 当所有绑定队列都不在使用时, 是否自动删除交换器true: 删除 false: 不删除,默认为false

    如下为@RabbitListener 的内部属性:

    • 属性:bindings:绑定队列
      • 注解@QueueBinding
        • 属性:value:绑定队列的名称 (注解@Queuevalue:配置队列名称,autoDelete:是否是一个可删除的临时队列)
        • 属性:exchange:配置交换器(@Exchange :value·:为交换器起个名称,type:指定具体的交换器类型)
        • 属性:key:路由键
    展开全文
  • 取而代之的是,可以将热交换器安装在可以由小型挖掘机甚至人工作业挖出的浅沟槽中。 本文介绍了两种不同的热交换器的比较,即毛细管垫和广泛使用的硬管。 两个热交换器都连接到一个热泵上,在该热泵中,每种配置都...
  • 环境:两台server 2016 ...新建邮件交换器 新建指针 打开客户端并测试(客户端DNS指向服务端ip) set type #查找的类型 set type=mx #查找邮件服务器记录 set type=rt #查看指针记录 ...

    环境:两台server 2016 虚拟机

    更改服务端主机名

    安装DNS服务并创建正反向区域(见我之前发布的“域名解析”)

    新建邮件交换器

    新建指针

     打开客户端并测试(客户端DNS指向服务端ip)

    set type          #查找的类型

    set type=mx  #查找邮件服务器记录

    set type=rt     #查看指针记录

     

     

    展开全文
  • 该代码可以控制Vasco T350和T500通风系统(热交换器或荷兰语:WTW)。 Vasco的其他系统也可以使用,但我仅在T500上进行过测试。 您可以将串行命令发送到ESP,然后使用cc1101芯片将其转换为Vasco命令。 发送键1将通风...
  • RabbitMQ中真的只有四种交换器吗?

    千次阅读 2020-05-08 02:32:32
    如果大家看了我之前的文章,应该都知道,rabbitmq中常用的交换器有4中,分别是:direct、fanout、topic、headers。 那么rabbitmq中,真的只有4中交换器吗? 今天和大家一起研究下。 一个简单的方式,通过启动...

    微信公众号:跟着老万学java
    欢迎关注,了解更多编程技巧,一起交流,一起成长。

    如果大家看了我之前的文章,应该都知道,rabbitmq中常用的交换器有4中,分别是:direct、fanout、topic、headers

    那么rabbitmq中,真的只有4中交换器吗?

    今天和大家一起研究下。

    一个简单的方式,通过启动rabbitmq_management插件,在管理控制台去尝试创建exchange。
    这里说明下,我使用的3.8.3版本的rabbitmq。不同版本的rabbitmq可能存在一些查询,有些类型的exchange可能需要安装对应的插件后才能创建。

    在这里插入图片描述
    可以发现多了2种类型的exchange,分别是:x-consistent-hash和x-modulus-hash以及一个参数Alternate exchange.

    常规的四种交换器类型,这里就不再赘述,有兴趣的小伙伴可以看看我整理的RabbitMQ入门知识整理

    x-consistent-hash和x-modulus-hash类型的exchange,是在从 RabbitMQ 3.6.0 版本开始,整合到 RabbitMQ 发布包中的。
    之前的版本中,需要自己手动下载插件去安装,具体操作这里就不展开了。

    x-consistent-hash

    git地址:https://github.com/rabbitmq/rabbitmq-consistent-hash-exchange
    说明:
    一致性hash交换器,主要是使用一致性hash算法将消息分发到绑定在交换器上的队列上。

    工作原理:
    当使用“一致性哈希”作为交换类型的情况下,会根据消息属性(最常见的是路由密钥 routing key)计算一个hash值,然后根据这个hash值,将消息分发到绑定在该交换器下的队列中。
    因此,如果没有发生绑定更改,具有相同路由关键字的消息将具有相同哈希值将被路由到同一队列。

    下面是工作原理图:
    在这里插入图片描述
    权重

    当队列绑定到Consistent Hash交换时,绑定密钥 binding key会使用一个数字字符串,表示绑定权重:这个桶的数量将与目标队列关联(范围的部分)。
    简单的说,就是绑定键的数字越大,那么绑定的队列的权重就越大,分发消息的时候接受到的消息就越多。

    请注意,绑定中的routing_keys是数字字符串。 这是因为AMQP 0-9-1指定routing_key字段必须为字符串。

    另外,发布消息的时候,路由键routing_key一定要是随机的。

    绑定键binding key决定队列的权重
    路由键routing_key决定消息的分发

    x-modulus-hash

    git地址:https://github.com/rabbitmq/rabbitmq-sharding
    x-modulus-hash路由器对应之前的rabbitmq sharding插件,主要是实现自动对队列进行分区。
    也就是说,一旦将一个exchange 定义为x-modulus-hash,就可以在每个集群节点上自动创建支持队列,并在它们之间共享消息。rabbitmq sharding向使用者显示了一个队列,但可能在后台运行了它对应的多个队列。rabbitmq sharding插件为您提供了一个集中的位置,通过向集群中的其他节点添加队列,您可以将消息以及跨多个节点的负载平衡发送到该位置。

    工作原理图:
    在这里插入图片描述

    主要特征:新加节点后,新加自动分片
    该插件的主要特性之一是,当将新节点添加到RabbitMQ集群时,该插件将在新节点上自动创建更多分片。假设节点a上有一个带有4个队列的分片,而节点b刚加入集群。该插件将在节点b上自动创建4个队列,并将它们“加入”分片分区。已经传递的消息将不会重新平衡,但是新到达的消息将被划分到新队列中。

    两种路由器的选用:
    如果只需要消息分区,而不需要自动调整分片数量的话,可以使用Consistent Hash Exchange;反之,如果需要根据策略或节点数量,动态调整分片数量的话,则选择x-modulus-hash。

    备份交换器Alternate Exchange

    生产者在发送消息时不设置mandatory 参数,那么消息达到路由器后匹配不到相应的队列后消息将会丢失。
    设置了mandatory 参数,那么需要添加ReturnListener的编程逻辑。
    如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器。

    顾名思义 备份交换器就是当第一个交换器未能有效匹配到队列时,路由到备份交换器,再由备份交换器区匹配队列

    模型图
    从模型图中可以看到消息发送到名字为TestAE的路由器中,但是因为没有跟队列匹配,这个时候消息就会被发送到名字为exchange-unroute的备份交换器,这个交换器一般会为fanout型,随后就会被路由到AE-queue队列
    在这里插入图片描述

    核心代码:

    //存储备份交换器的参数map
    Map<String, Object> spare = new HashMap<String , Object>(2);
    spare.put("alternate-exchange" , MY_SPARE);
    //声明了一个direct 类型的交换器,并且添加存储备份交换器的map参数
    channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,spare);
    

    完成示例代码:

    public class SendSpare {
    
        private final static String QUEUE_NAME = "wsd_test";
        private final static String QUEUE_NAME_2 = "wsd_test2";
        private final static String EXCHANGE_NAME = "wsd_exchange";
        private final static String ROUTING_KEY = "wsd_exchange";
        private final static String EXCHANGE_KEY = "wsd_exchange";
        private final static String MY_SPARE = "mySpare";
        private static Connection connection =null;
        private static Channel channel = null;
        public static void main(String[] args) {
            Map<String, Object> spare = new HashMap<String , Object>(2);
            spare.put("alternate-exchange" , MY_SPARE);
            try{
                // 获取到连接以及mq通道
                connection = ConnectionUtil.getConnection();
                // 从连接中创建通道
               channel = connection.createChannel();
               //声明了一个direct 类型的交换器
               channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,spare);
               //声明一个备胎路由器
                channel.exchangeDeclare(MY_SPARE,"fanout",true,false,null);
                // 声明(创建)队列
                channel.queueDeclare(QUEUE_NAME, false, false, false, null);
                //将路由与队列绑定,再为绑定的路径赋值一个绑定键
                channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY);
    
                // 声明(创建)队列
                channel.queueDeclare(QUEUE_NAME_2, false, false, false, null);
                //绑定备胎路由器
                channel.queueBind(QUEUE_NAME_2,MY_SPARE,"");
                //发送数据
                for (int i=0;i<10;i++){
                    // 消息内容
                    String message = "Hello World!"+i;
                    //指定发送消息到哪个路由,以及他的路由键,消息等
                    if (i%2==0){
                        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY,null, message.getBytes());
                    }else {
                        //匹配不到队列
                        channel.basicPublish(EXCHANGE_NAME, "kkkk",null, message.getBytes());
                    }
                    System.out.println(" [x] Sent '" + message + "'");
                    Thread.sleep(200);
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                //关闭通道和连接
                try {
                    channel.close();
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    联邦交换器 Federation

    Federation插件的高级目标是在代理之间传输消息而无需集群。

    该插件可以让交换器和队列组成同盟。 一个联邦的交换或队列可以从一个或多个上游(远程交换和其他代理上的队列)接收消息,可以将上游发布的消息路由到本地队列。 一个联邦队列可以让一个本地消费者从上游队列接收消息。

    rabbitmq-plugins  enable  rabbitmq_federation
    rabbitmq-plugins enable rabbitmq_federation_management
    

    在这里插入图片描述

    工作原理:
    在这里插入图片描述

    其他

    通过执行rabbitmq-plugins list命令,查看支持的默认带有哪些插件
    在这里插入图片描述
    rabbitmq_event_exchange
    rabbitmq_jms_topic_exchange
    rabbitmq_random_exchange
    rabbitmq_recent_history_exchange

    依次通过命令安装对应插件后:

    rabbitmq-plugins  enable  rabbitmq_event_exchange
    

    在这里插入图片描述

    进一步研究,还会不会有其他一些插件呢?
    去官网的插件网址:
    https://www.rabbitmq.com/community-plugins.html
    在这里插入图片描述
    rabbitmq_lvc_exchange
    rabbitmq_rtopic_exchange
    rabbitmq_delayed_message_exchange 延迟消息插件
    rabbitmq_management_exchange
    pgsql_listen_exchange

    总结

    3.8.3版本的rabbitmq,默认有6种类型的交换器类型,分别是:
    direct、fanout、topic、headers,x-consistent-hash和x-modulus-hash,一个参数Alternate exchange来实现备份交换器。
    通过插件扩展,还可以声明如下交换器:
    rabbitmq_event_exchange
    rabbitmq_jms_topic_exchange
    rabbitmq_random_exchange
    rabbitmq_recent_history_exchange
    rabbitmq_lvc_exchange
    rabbitmq_rtopic_exchange
    rabbitmq_delayed_message_exchange 延迟消息插件
    rabbitmq_management_exchange
    pgsql_listen_exchange

    那么,你还知道哪些其他的交换器器吗?欢迎留言交流。

    参考:
    https://blog.csdn.net/wsdfym/article/details/101800624
    https://www.rabbitmq.com/distributed.html

    欢迎关注交流
    图注:跟着老万学java

    展开全文
  • 轻巧而通用的电子数据交换(EDI / EDIFACT)解析 格式 是基于标准文本的数据交换格式,特定于每个行业,例如银行业或能源业。 它严重依赖于代码列表,这使得人类难以阅读。 该解析充当EDI / EDIFACT文件与节点...
  • 目录-GB/T 151-2014 热交换器

    千次阅读 2018-09-05 11:08:39
    6.1 管壳式热交换器的主要零部件及名称 6.2 管壳式热交换器型号 6.3 管程 6.4 换热管 6.5 管板 6.6 换热管与管板的连接 6.7 管板与管箱,壳体的焊接连接 6.8 壳程 6.9 钩圈式浮头 6.10 壳体 ...
  • ESK数据交换平台的下载地址,安装等. 目录介绍: Db:存放ESK使用的数据库文件 Esk:esk的应用程序 Jre:Java Jdk Tomcat:Web服务器 Start.bat:以命令行的方式启动ESK数据交换平台 Shutdown.bat:与start.bat对应,关...
  • SpringBoot整合RabbitMQ,多交换器多队列配置、手动ACK确认、死信队列
  • 数据交换格式的文档生成,主要是json格式,用于浏览器和后端服务之间的通信。 安装及使用 使用Node.js在全球范围内安装ProtoDoc: npm install -g protodoc 在您的项目目录中创建一个文件名ProtoConf.js ,并将...
  • 例如:安装redhat的时候,你可以默认划分硬盘空间,交换区的大小事系统默认配置,当你安装完系统后需要安装一个oracle数据库,突然发出警告,交换空间不够。此刻该怎么办? 当我们系统上的物理内存或RAM已满时,我们...
  • 在 DNS 服务器上创建邮件交换器 (MX) DNS 记录。 有关在这段代码中使用的 CreateInstanceFromPropertyData 方法的更多信息,请单击此处。 支持平台 Windows Server 2003 是 Windows XP 否(然而,...
  • 交换器是由于温度差而使热量从一种流体传递到另一种流体的装置。 当前论文中提出的热交换...本科学论文基于以下事实:从针对实验室条件制作的实验模型得出的结论可用于在某些机器上安装这种热交换器,以预测其性能。
  • 解析 该库旨在作为原始标记之上的薄层,以帮助访问 XLIFF(XML 本地化交换文件格式)文件的内容。 其主要目的是: 从 XLIFF 文件中读取值更改 XLIFF 文件中的值将翻译数据导出到 C# 资源文件 (resx) 从 C# 资源...
  • 这是Binance交换REST和WebSocket API的非官方Ruby包装。 注意 我们现在是1.0,并且有一些重大更改,主要是一些方法名称和键的大小写。 当我编写更好的文档时,请确保签出代码。 安装 将此行添加到您的应用程序的...
  • 建立了密实移动床离子交换实验装置,并采用喷射输送离子交换树脂颗粒。实验研究了喷射的相对喉嘴距、喉管与喷嘴面积比及输送水流量对喷射输送性能的影响,确定了较佳的喷射结构和适宜的输送水流量。结果表明...
  • 自述文件FixViz是用于显示/编辑FIX消息的开源Java工具。如何设置? 签出源mvn全新安装程序集:单个运行最后一步中生成的可执行jar。接触
  • 用于API包装-开源加密货币交换引擎。 也可以与。 安装 这个API非常简单。 安装只是从github下载的资源 git clone https://github.com/testnet-exchange/python-viabtc-api cd python-viabtc-api pip3 install -r ...
  • bitfinex-api 用于 Node.js 的 Bitfinex 加密货币交换 API 包装器安装 yarn add bitfinex-api用法包括 v1 和 v1客户端。 API 文档中指出的私有端点需要使用 API 密钥和秘密密钥进行身份验证。用法示例: import ...
  • 交换,以使用解析和实体来计算数据。 安装 $ npm i urql-computed-exchange 用法 首先,创建您的实体及其解析: // entities.js import { createEntity , mergeEntities } from 'urql-computed-exchange' ; ...
  • 数据交换标准构建(请参阅 参考资料) 概述 这个 JSON 解析将接受一个输入,然后根据官方 JSON 规范检查这个输入是否是一个有效的 JSON 对象。 它由两个文件组成,其中包含识别令牌 (Scanner.jflex) 和检查这些...
  • 该脚本基于 MATLAB Highlighter,允许用户在文件交换部分查看语法突出显示的 .m 文件。 当然,您可以下载 .m 文件,然后在 MATLAB 编辑中打开它们,但是如果您想快速浏览一下,此语法高亮提供了一种方便的方法...
  • 本文包含elang安装,RabbitMQ安装配置,RabbitMQ两台服务器集群
  • 如何安装Linux Mint 20 “Ulyana”

    千次阅读 2021-05-26 08:33:53
    Linux Mint 20(代号为“Ulyana”)是一个长期支持(LTS)版本,将一直支持到2025年。它具有三个桌面版本:...在本文中,您将学习如何安装Linux Mint 20 Cinnamon桌面版,但相同的说明也适用于MATE和Xfce版本。系...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 152,722
精华内容 61,088
热门标签
关键字:

交换器怎样安装