1.三种发送消息方式
分别是发送同步消息、发送异步消息、发送单向消息
//发送同步消息
Message message = new Message("mytop111", "你好".getBytes());
SendResult send = producer.send(message);
//异步可靠消息,不会阻塞
//采用事件监听方式接收broker返回的确认
Message message4 = new Message("mytop111", "你好4".getBytes());
producer.send(message4, new SendCallback() {
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功");
System.out.println("sendResult = " + sendResult);
}
public void onException(Throwable throwable) {
System.out.println("发送失败");
System.out.println(throwable.getMessage());
//准备重投
}
});
//单向消息,不需要broker返回确认,直接发
producer.sendOneway(message);
2.设置消息的组名和消息的key
//给消息设置一个组名,以及一个key
Message message5 = new Message("mytop111","tag-A","key-1", "你好4".getBytes());
消费方可以根据组名来过滤消息进行消费
//consumer根据设置的tag组名进行过滤
consumer.subscribe("mytop111","tag-A");
3.给消息设置属性,消费方可以通过sql来过滤消息
//给消息设置一个组名,以及一个key
Message message5 = new Message("mytop111","tag-A","key-1", "你好4".getBytes());
//给消息增加个属性,让consumer支持sql过滤
message5.putUserProperty("age","18");
//消息选择器
//需要在broker.conf里添加enablePropertyFilter=true
MessageSelector messageSelector = MessageSelector.bySql("age >= 18 and age <=28");
consumer.subscribe("mytop111",messageSelector);
4.消费端设置消费模式
//设置消费模式
//MessageModel.CLUSTERING 默认集群模式,只能消费一次
//MessageModel.BROADCASTING 广播模式,可以重复消费
consumer.setMessageModel(MessageModel.CLUSTERING);
consumer.setMessageModel(MessageModel.BROADCASTING);
5.设置消息发送者消息重投和消息消费者延迟消费
Message message = new Message("mytop111", "你好".getBytes());
//如果broker超过时间还没返回确认消息,可以设置重投
producer.setRetryTimesWhenSendFailed(2);
SendResult send = producer.send(message);
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
for (MessageExt msg : msgs) {
byte[] body = msg.getBody();
System.out.println(new String(body));
}
//如果不确认能否消费消息
if("1".equals("2")){
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
//默认情况下,这条消息只会被一个consumer消费 点对点
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//默认能卡消费线程15分钟
consumer.setConsumeTimeout(15);