RocketMQ官网:http://rocketmq.apache.org,官网示例对应查看http://rocketmq.apache.org/docs/simple-example/,
生产者有三种模式,同步,异步(提供重试机制),单向。消费者提供错误重试机制。
1.生产者可靠同步
/**
* @author Administrator
* 可靠同步发送
* 主要运用业务重要性较高,需要确认的场景:
*/
public class SyncProducer {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer = new
DefaultMQProducer("test");
producer.start();
for (int i = 0; i < 100; i++) {
Message msg = new Message("TOPICTEST" /* 主题 */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* 消息体 */
);
//调用消息发送.将消息投递到broker
//send有多个多态,
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
}
//关闭生产者.
producer.shutdown();
}
}
2.可靠异步发送
/**
* @author Administrator
* 可靠异步发送
* 通常用于对发送消息响应时间要求更高、更快的场景:
*/
public class AsyncProducer {
public static void main(
String[] args) throws MQClientException, InterruptedException, UnsupportedEncodingException {
DefaultMQProducer producer = new DefaultMQProducer("JODIE_DAILY_TEST");
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0);
for (int i = 0; i < 10000000; i++) {
try {
final int index = i;
Message msg = new Message("Jodie_topic_1023",
"TagA",
"OrderID188",
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
//重点在这里 异步发送回调
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.printf("%-10d OK %s %n", index, sendResult.getMsgId());
}
@Override
public void onException(Throwable e) {
System.out.printf("%-10d Exception %s %n", index, e);
e.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
producer.shutdown();
}
}
3.单向投递
/**
* @author Administrator
*单向发送
*适用于耗时非常短,可靠性要求并不高的场景,例如日志收集。
*只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别(RocketMQ说的毫秒级响应就是这个了)。
*/
public class OnewayProducer {
public static void main(String[] args) throws Exception{
DefaultMQProducer producer = new DefaultMQProducer("Test");
producer.start();
for (int i = 0; i < 100; i++) {
//创建消息.
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
//调用单向投递函数发送消息到broker.
producer.sendOneway(msg);
}
//关闭生产者
producer.shutdown();
}
}
4.消费者接受消息
/**
* @author Administrator
*消息消费的状态,有2种,一个是成功(CONSUME_SUCCESS),一个是失败&稍后重试(RECONSUME_LATER)
*/
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("GROUP_NAME");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TOPICTEST", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
try {
MessageExt msg = msgs.get(0);
String msgbody = new String(msg.getBody(), "utf-8");
System.out.println(msgbody + " Receive New Messages: " + msgs);
if (msgbody.equals("HelloWorld - RocketMQ4")) {
System.out.println("======错误=======");
int a = 1 / 0;
}
} catch (Exception e) {
e.printStackTrace();
if (msgs.get(0).getReconsumeTimes() == 3) {
// 该条消息可以存储到DB或者LOG日志中,或其他处理方式
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功
} else {
return ConsumeConcurrentlyStatus.RECONSUME_LATER;// 重试
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.println("Consumer Started.");
}
}