概要
提示:这里可以添加技术概要
RocketMQ 5.3.0
https://dlcdn.apache.org/rocketmq/5.3.0/ 可以去下载
本地启动
修改runserver.sh 占用内存
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"
conf/broker.conf
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=127.0.0.1:9876
brokerIP1=127.0.0.1
启动 NameServer:
nohup sh mqnamesrv &
查看进程
ps aux | grep mqnamesrv
tail -f ~/logs/rocketmqlogs/namesrv.log
2025-04-15 16:58:33 INFO main - The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876
启动 Broker
nohup sh mqbroker -n 127.0.0.1:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
看到启动正常的日志
2025-04-15 17:01:33 INFO main - The broker[U-4NFQQ751-2056.local, 30.177.33.6:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876```
关闭服务
```bash
sh mqshutdown namesrv
sh mqshutdown broker
java代码
提示:这里可以添加技术名词解释
pom引用,用的是spring-boot-starter-parent 2.3.2.RELEASE
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-bus-rocketmq</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
消息发送端
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
public interface MessageProducer {
String OUTPUT_TOPIC1 = "output-topic1";
String OUTPUT_TOPIC2 = "output-topic2";
@Output(OUTPUT_TOPIC1)
MessageChannel outputTopic1();
@Output(OUTPUT_TOPIC2)
MessageChannel outputTopic2();
}
@Service
@EnableBinding(MessageProducer.class)
public class MessageProducerService {
@Autowired
private MessageProducer messageProducer;
public void sendMessageToTopic1(String message, String tag, String region) {
messageProducer.outputTopic1().send(MessageBuilder.withPayload(message)
.setHeader("rocketmq_TAGS", tag)
.setHeader("region", region)
.build());
}
public void sendMessageToTopic2(String message, String tag, String region) {
messageProducer.outputTopic2().send(MessageBuilder.withPayload(message)
.setHeader("rocketmq_TAGS", tag)
.setHeader("region", region)
.build());
}
}
MessageController
@RestController
public class MessageController {
@Autowired
private MessageProducerService messageProducerService;
@GetMapping("/send/topic1")
public String sendMessageToTopic1(@RequestParam String message, @RequestParam String tag, @RequestParam String region) {
messageProducerService.sendMessageToTopic1(message, tag, region);
return "Message sent to Topic1: " + message + " with tag " + tag + " and region " + region;
}
@GetMapping("/send/topic2")
public String sendMessageToTopic2(@RequestParam String message, @RequestParam String tag, @RequestParam String region) {
messageProducerService.sendMessageToTopic2(message, tag, region);
return "Message sent to Topic2: " + message + " with tag " + tag + " and region " + region;
}
}
消费端
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
public interface CustomBindings {
String INPUT_TOPIC1 = "input-topic1";
String INPUT_TOPIC2 = "input-topic2";
@Input(INPUT_TOPIC1)
SubscribableChannel inputTopic1();
@Input(INPUT_TOPIC2)
SubscribableChannel inputTopic2();
}
@Service
public class MessageConsumer {
@StreamListener(value="input-topic1",condition = "headers['rocketmq_TAGS'] == 'TagA'")
public void receiveMessageFromTopic1(Message<String> message) {
System.out.println("Received message from Topic1: " + message.getPayload());
}
@StreamListener(value="input-topic2",condition = "headers['rocketmq_TAGS'] == 'TagB'")
public void receiveMessageFromTopic2(Message<String> message) {
System.out.println("Received message from Topic2: " + message.getPayload());
}
}
验证,在url里面输入后,看消费端有没有日志打印。切换不同tag观察。
http://localhost:8081/send/topic1?message=test113&tag=TagA®ion=Hangzhou
技术细节
提示:这里可以添加技术细节
注意tag过滤
小结
提示:这里可以添加总结
每个topic也可以单独一个service实现