1、普通消息生产
普通消息生产包括3种,可靠的同步传输、可靠的异步传输、单项传输。
1)、可靠的同步传输
说明:可靠的同步传输广泛应用于重要的通知消息、短信通知、短信营销系统等。
示例代码:
DefaultMQProducer synProducer = new DefaultMQProducer("synProducerGroup");
synProducer.setNamesrvAddr("ip1:port;ip2:port");
synProducer.start();//启动服务
SendResult sendResult = synProducer.send(msg);//发送消息
synProducer.shutdown();//关闭资源
2)、可靠的异步传输
说明:可靠的异步传输通常应用于响应时间敏感的业务场景。
示例代码:
DefaultMQProducer asynProducer = new DefaultMQProducer("asynProducerGroup");
asynProducer.setNamesrvAddr("ip1:port;ip2:port");
asynProducer.start();
asynProducer.send(msg, new CallSendback(){
@Override
public void onSuccess(SendResult sendResult){
//消息发送成功
}
@Override
public void onException(Trowable e){
//消息发送异常
}
});
asynProducer.shutdown();
说明:单项传输应用于中等可靠的情况下(即:对于数据可靠性要求不高),比如:日志收集。
示例代码:
DefaultMQProducer onewayProducer = new DefaultMQProducer("onewayProducerGroup");
onewayProducer.setNamesrvAddr("ip1:port;ip2:port");
onewayProducer.start();
onewayProducer.sendOneway(msg);
onewayProducer.shutdown();
说明:顺序消息通常应用于支付订单等对于消息顺序有严格要求的交易。
示例代码:
生产者:
int orderId = 1000;//订单号
DefaultMQProducer orderProducer = new DefaultMQProducer("orderProducerGroup");
orderProducer.setNamesrvAddr("ip1:port;ip2:port");
orderProducer.start();
for(int i = 0; i < 10; i ++){
Message msg = new Message("topic", "tags", "keys" + i, "body".getBytes(RemotingHelper.DEFAULT_CHARSET));
orderProducer.send(msg, new MessageQueueSelector(){
@Override
public MessageQueue select(List mqs, Message msg, Object arg){
Integer id = (Integer)arg;
int index = id%mqs.size();
return mqs.get(index);
}
}, orderId);
}
orderProducer.shutdown();
消费者:
DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer("pushConsumerGroup");
pushConsumer.setNamesrvAddr("ip1:port;ip2:port");
pushConsumer.subscribe("topic", "*");//订阅主题
pushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
pushCosumer.setMessageModel(MessageModel.CLUSTERING);//集群消费、默认也是“集群消费”
pushConsumer.registerMessageListener(new MessageListenerOrderly(){
@Override
public ConsumeOrderStatus consumeMessage(List msgs, ConsumeOrderlyContext context){
for(int i = 0; i < msgs.size(); i ++){
Message msg = msgs.get(i);
System.err.println("topic:" + msg.getTopic() + ",keys:" + msg.getKeys());
}
return ConsumeOrderStatus.SUCCESS;
}
});
pushConsumer.start();
3、批量消息
示例代码:
DefaultMQProducer batchProducer = new DefaultMQProducer("bathProducerGroup");
batchProducer.setNamesrvAddr("ip1:port;ip2:port");
batchProducer.start();
List msgs = new ArrayList();
msgs.add(msg1);
msgs.add(msg2);
..........
batchProducer.send(msgs);
batchProducer.shutdown();
4、延迟或定时消息
说明:rocketMq目前只支持固定精度的定时消息,
官方说法如下:
如果要支持任意的时间精度,在 Broker 层面,必须要做消息排序,如果再涉及到持久化,那么消息排序要不可避免的产生巨大性能开销。
延迟级别:
示例代码:
5、过滤消息延迟级别:
延迟级别 | 时间 |
1 | 1s |
2 | 5s |
3 | 10s |
4 | 30s |
5 | 1m |
6 | 2m |
7 | 3m |
8 | 4m |
9 | 5m |
10 | 6m |
11 | 7m |
12 | 8m |
13 | 9m |
14 | 10m |
15 | 20m |
16 | 30m |
17 | 1h |
18 | 2h |
示例代码:
生产者:
DefaultMQProducer delayProducer = new DefaultMQProducer("delayProducerGroup");
delayProducer.setNamesrvAddr("ip1:port;ip2:port");
delayProducer.start();
Message delayMsg = new Message("topic", "tags" , "keys", "binary content");
delayMsg.setDelayTimeLevel(3);//延迟10s被消费
delayProducer.send(delayMsg);
delayProducer.shutdown();
消费者:
DefaultMQConsumer consume = new DefaultMQConsumer("consumeGroup");
consume.setNamesrvAddr("ip1:port;ip2:port");
consume.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consume.registerMessageListener(new MessageListenerConcurrently(){
@Override
public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context){
for(int i = 0; i < msgs.size(); i ++){
Message msg = msgs.get(i);
System.out.println("topic:" + msg.getTopic() + "keys:" + msg.getKeys());
}
return ConsumeConcurrentlyContext.CONSUME_SUCCESS;
}
});
Grammars
RocketMQ only defines some basic grammars to support this feature. You could also extend it easily.
- Numeric comparison, like
>
,>=
,<
,<=
,BETWEEN
,=
; - Character comparison, like
=
,<>
,IN
; IS NULL
orIS NOT NULL
;- Logical
AND
,OR
,NOT
;
Constant types are:
- Numeric, like 123, 3.1415;
- Character, like ‘abc’, must be made with single quotes;
NULL
, special constant;- Boolean,
TRUE
orFALSE
;
示例代码:
生产者:
DefaultMQProducer producer = new DefaultMQProducer("filterGroup");
producer.setNamesrvAddr("ip1:port;ip2:port");
producer.start();
for(int i = 0; i < 10; i ++){
Message msg = new Message("topic", "tags", "keys", "".getBytes());
msg.putUserProperty("a", String.valueOf(i));
producer.send(msg);
}
producer.shutdown();
消费者:
DefaultMQConsumer consumer = new DefaultMQConsumer("consumerFilterGroup");
consumer.setNamesrvAddr("ip1:port;ip2:port");
// only subsribe messages have property a, also a >=0 and a <= 3
consumer.subscribe("topic", MessageSelector.bySql("a between 1 and 5"));
consumer.registerMessageListener(new MessageListenerConcurrently(){
@Override
public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context){
for(int i = 0; i < msgs.size(); i ++){
//消费
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});