activeMQ-15常见activemq问题

  • 关于异步发送消息:
    ActiveMQ官方说异步发送是很多模式下默认的传输方式,但是在发送非事物持久化消息的时候默认使用的是同步发送模式。
    同步发送时,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者,这个确认消息暗示生产者 broker 已经成功地将它发送的消息路由到目标目的并把消息保存到二级存储中。

同步发送持久消息能够提供更好的可靠性,但这潜在地影响了程序的相应速度,因为在接受到 broker 的确认消息之前应用程序或线程会被阻塞。如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到 broker 的确认之前一直阻塞 Producer.send 方法。
解决办法:
1)添加事务
2)设置异步参数
[1].设置ConnectionFactory时指定使用异步

cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true");

[2].不在构造函数中指定,而是修改ConnectionFactory的配置

((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);

[3].在实例化后的ActiveMQConnection对象中设置异步发送

((ActiveMQConnection)connection).setUseAsyncSend(true)

异步发送的弊端
1)异步发送丢失消息的场景是:生产者设置UseAsyncSend=true,使用producer.send(msg)持续发送消息。由于消息不阻塞,生产者会认为所有send的消息均被成功发送至MQ。如果服务端突然宕机,此时生产者端内存中尚未被发送至MQ的消息都会丢失。
此时,需要在发送时设置回调函数,从而知道消息是否发送成功:

public void sendMessage(ActiveMQMessage msg, final String msgid) throws JMSException {
     producer.send(msg, new AsyncCallback() {
          @Override
          public void onSuccess() {
              // 使用msgid标识来进行消息发送成功的处理
              System.out.println(msgid+" has been successfully sent.");
          }
          @Override
          public void onException(JMSException exception) {
              // 使用msgid表示进行消息发送失败的处理
              System.out.println(msgid+" fail to send to mq.");
              exception.printStackTrace();
          }
      });
}
  • 延迟投递/定时投递
    1)activemq开启延迟和定时机制:修改activemq.xml中的配置项,在标签中添加属性schedulerSupport=true;
    2)关于延迟和定时的消息属性如下:


    time.png

    具体设置如下:

Message message = session.createTextMessage("sss");
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,3000);
//设置延迟3s发送
  • 消息重试机制:


    try.png

    默认:消息被重复发送到消费者6次后,会将该消息放置死信队列中(DLQ);

  • DLQ死信队列:主要是用来处理失败的消息,多数为人工干预处理;
  • 避免消息重复消费:
    解决方法:增加消息状态表。
    通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。
  • 消息丢失处理方式:
    解决方案:用持久化消息【可以使用对数据进行持久化JDBC,AMQ(日志文件),KahaDB和LevelDB】,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

你可能感兴趣的:(activeMQ-15常见activemq问题)