1、默认生产者消息是持久的:会存数据库
--消费者的持久:createDurableSubscriber是指消费者能收到所有它订阅时间点之后的消息,即使消
费者注册后关闭,当它重启就能收到注册时间点之后所有的消息;即当此消费用户ID(AAA)在producer发
送之前就已经注册,那么此id能收到producer发送的所有消息,如果是在producer之后注册的那么只能
收到此时间点后的消息;
--注意:topic和queue消费者收到消息后有两种情况,设置为Session.CLIENT_ACKNOWLEDGE,必须代码显示调用
acknowledge()方法,那么重启后不会收到消息,否则客户端不确认则每次重启都会收到
--消费者的非持久。createConsumer只能接受到启动时间点之后,生产者producer发送的消息
--另外topic的生产者还有个特别的参数retain:true,设置为true时,无论何时订阅者启动,都能收到
对应主题destination的最后一条信息;但是如果broker重启了,则者最后一条又是丢弃的,估计能使用
的场景很少。
2、topics和queues的区别。
--topics时广播给所有已经订阅消费者,queues仅被一个消费者获取一次。但是queues如果broker未能
证实已经有订阅者消费,那么下一个订阅者继续消费-----这句话包含好几层意义:多个消息获取端不
会获得重复的信息;但是如果消息可能被消费,但是每到服务器确认,就会被2次消费,极端情况如收到
信息还没发回执到服务器就断网了;如果多个消费者同时在线消费100条信息,他们消费到的信息都是随
机的,总数不会超过100;如果没有消费者消费这条消息,这条消息一直在服务器中显示为未消费状态,除非手工删除。
--topics在broker系统里面找不到消费者就会丢弃消息。就是说只会发送给已经订阅的消费者,反之从
消费者来讲,它只消费它订阅后的生产者发送的消息吃就丢弃不代表不持久。
--queues有可靠性消息,请区别topics的持久性消息,可靠消息并不保证有订阅者接受到消息,可靠性
消息保证一定有订阅者接受消息
3、可靠性消息
--queues中producer使用receipt参数来发送消息,这个参数是id标志,当broker收到订阅者消费完毕
信息后发个回执消息给producer,包含参数receipt-id,值对应producer发送的参数receipt
SEND
destination:/queue/a
receipt:001
hello queue a
^@
接受方:
RECEIPT
receipt-id:001
^@