PTP
持久化(生产者)
默认开启持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//关闭持久化
事务(生产者/消费者)
session.commit();
session.rollback();
签收模式(消费者)
int AUTO_ACKNOWLEDGE = 1;//自动签收
int CLIENT_ACKNOWLEDGE = 2;//手动签收,mess.acknowledge();
int DUPS_OK_ACKNOWLEDGE = 3;//不必确保客户端签收,容易造成重复投递
int SESSION_TRANSACTED = 0;//客户端session开启事务后,覆盖后续参数为SESSION_TRANSACTED,需要ack后,进行commite()
优先级(生产者)
producer.setPriority
<policyEntry queue="queue1" prioritizedMessages="true" />
消息类型(生产者/消费者)
常用消息类型
MapMessage
BytesMessage
TextMessage
添加序列化信任(生产者)
factory.setTrustedPackages(list);
字节流消息(生产者/消费者)
注意发送消息与接受消息顺序要一致
死信队列(生产者)
producer.setTimeToLive(1000);//设置超时时间,超过时间进入死信队列,死信队列不会自动清除,有消息堆积的风险
ActiveMQ.DLQ
设置不进行持久化,producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT),不会进入DB,也不会进入死信队列
processNonPersistent="true",不进行持久化也会进入死信队列。进入死信队列后,进入DB存储
processExpired="false" 过期消息不进入死信队列。非持久化在过期后直接的dequeued,持久化首先进入DB,在过期后直接dequeued。
consumer监控死信队列,消息重投,保证不丢失消息
独占消费者(消费者)
保证强一致性,但有可能造成消息堆积
Queue queue = session.createQueue("des?consumer.exclusive=true");//独占
Queue queue = session.createQueue("des?consumer.exclusive=true&consumer.priority=10");//优先级
分组(生产者/消费者)
消息消费负载均衡
//消息生产者
message.setDoubleProperty("num",i);
//消息消费者
MessageConsumer consumer = session.createConsumer(destination,"num>1");
异步发送消息(生产者)
异步发送消息提升性能,持久化,关闭事务的情况是同步的
//设置异步
connectionFactory.setUseAsyncSend(true);
延迟投递(生产者)
//broker
schedulerSupport="true"
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10*1000);
//支持CRON表达式进行定时执行
//时间间隔重复投递,MQ的重复投递
long delay = 10 * 1000;
long period = 2 * 1000;
int repeat = 9;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
createProducer.send(message);
消息过滤(生产者/消费者)
String selector1 = "age > 17";
String selector2 = "name = 'lucy'";
MessageConsumer consumer = session.createConsumer(queue,selector2);
注意事项
默认为100gb,但实际取决于启动时的磁盘大小,如果低于100,如50g。则最大为50g
独占消费者和过滤器有可能会造成broker消息堆积,消息推拉到消费者无法处理,消息堆积在broker中,造成生产者无法推送消息。
改进策略,将较老的消息清除掉等等,避免消息堆积。