RocketMq用法
引入jar包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.7.0</version>
</dependency>
//生产值代码块
public class RocketMqProducer {
public static void main(String[] args) {
try {
DefaultMQProducer producer = new DefaultMQProducer("order_Producer");
producer.setNamesrvAddr("ip");
producer.start();
for (int i = 1; i <= 5; i++) {
//主题、标签、值、内容
Message msg = new Message("TopicOrderTest", "order_1", "KEY" + i, ("消息内容: " + i).getBytes());
SendResult sendResult = producer.send(msg, (List<MessageQueue> mqs, Message message, Object arg)-> {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}, 0);
System.out.println(sendResult);
}
producer.shutdown();
} catch (MQClientException e) {
e.printStackTrace();
} catch (RemotingException e) {
e.printStackTrace();
} catch (MQBrokerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 同步发送消息返回消息结果
* @throws Exception
*/
private void sendResultMessage() 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 */
);
//Call send message to deliver message to one of brokers.
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
}
//Shut down once the producer instance is not longer in use.
producer.shutdown();
}
/**
* 异步发送消息
* @throws MQClientException
* @throws InterruptedException
* @throws UnsupportedEncodingException
*/
private void sendMessage()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();
}
/**
* 单向发送日志消息
*/
private void sendOnewayMessage() throws Exception {
DefaultMQProducer producer = new DefaultMQProducer("Test");
producer.start();
for (int i = 0; i < 100; i++) {
//Create a message instance, specifying topic, tag and message body.
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " +
i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
//Call send message to deliver message to one of brokers.
producer.sendOneway(msg);
}
//Shut down once the producer instance is not longer in use.
producer.shutdown();
}
}
//消费者代码块
public class RocketMqConsumer{
//分组名
String producerGroup = "";
//ip地址
String nameServerAddress = "";
// 实例消息的生产者,然后通过构造方法制定其组
DefaultMQPushConsumer defaultMqPushConsumer = new DefaultMQPushConsumer();
defaultMqPushConsumer.setConsumerGroup(producerGroup);
//设置nameServer的地址
defaultMqPushConsumer.setNamesrvAddr(nameServerAddress);
/**
* 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
* 如果非第一次启动,那么按照上次消费的位置继续消费
*/
defaultMqPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//当分组为指定一个分组时 全组tag为一个值,这样才能正常接收到消息defaultMqPushConsumer.subscribe("toipc","*");
//当分组和订阅为一一对应时,可以订阅不同的tag,但是当方法重启时,会创建一个新的消费者,那么所有的任务又会重新消费一次
defaultMqPushConsumer.subscribe("toipc","tag");
System.out.println("开始接受消息==========================");
defaultMqPushConsumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
// 设置自动提交
context.setAutoCommit(true);
for (MessageExt msg : msgs) {
Thread t0 = new Thread(() -> {
//自己的业务处理代码
System.out.println("receive msg:" + new String(msg.getBody()));
});
t0.start();
System.out.println(new String(msg.getBody()));
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
defaultMqPushConsumer.start();
return defaultMqPushConsumer;
}
}
linux 安装rocketmq (5.6不执行也可)
(1)apt install unzip
(2)unzip rocketmq-all-5.2.0-source-release.zip
(3)cd rocketmq-all-5.2.0-source-release/
(4)mvn -Prelease-all -DskipTests -Dspotbugs.skip=true clean install -U
(5)配置环境变量
vim /ect/profile
export ROCKETMQ_HOME=/root/data/rocketmq-all-5.2.0/distribution/target/rocketmq-5.2.0/rocketmq-5.2.0
export PATH=$JAVA_HOME/bin:
R
O
C
K
E
T
M
Q
H
O
M
E
/
b
i
n
:
ROCKETMQ_HOME/bin:
ROCKETMQHOME/bin:PATH
(6)配置生效
source /etc/profile
(7)修改服务器内存
vim distribution/target/rocketmq-5.2.0/rocketmq-5.2.0/bin/tools.sh
vim distribution/target/rocketmq-5.2.0/rocketmq-5.2.0/bin/runbroker.sh
vim distribution/target/rocketmq-5.2.0/rocketmq-5.2.0/bin/runserver.sh
将JAVA_OPT中的内存改成256m
(8)启动NameServer
cd distribution/target/rocketmq-5.2.0/rocketmq-5.2.0
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
(9)启动Broker
nohup sh bin/mqbroker –n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
(10)关闭服务
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv

安装可视化界面
1、下载 地址:https://github.com/apache/rocketmq-dashboard
2、修改bootstrap.yml配置文件的的地址为自己服务器地址
3、在mq文件夹下 执行 mvn clean install -Dmaven.test.skip=true (可能会报错,我执行了三次才成功)
4、将生成的jar包上传服务器并启动 nohup java -jar /rocketmq-dashboard-1.0.1-SNAPSHOT.jar > rocket.log 2>&1 &
5、启动成功后 访问 ip:8081 (此处我改为8081,可根据自己需求修改)



遇到的问题:
第一个问题如下图所示:执行 mvn clean install -Dmaven.test.skip=true 报错。不管直接再次执行成功

第二个问题,broker启动后报连接错误
broker日志报错org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed
在broker.conf 配置文件中添加最后两行信息
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr = 你的IP:9876
brokerIP1 = 你的IP
保存后指定配置文件启动
nohup sh bin/mqbroker –n 116.205.237.227:9876 -c conf/broker.conf &
本文详细介绍了RocketMQ的使用方法,包括生产者如何同步、异步发送消息,以及消费者如何注册监听并消费消息。示例代码展示了DefaultMQProducer和DefaultMQPushConsumer的配置与操作,涉及消息发送的多种模式。
2418

被折叠的 条评论
为什么被折叠?



