JMS(Java Message Service),是Java平台中关于面向消息中间件的接口,是一种与厂商无关的API,用来访问消息收发。它的使用场景如下:
Producer:生产消息的服务。
Producer Group: 消息生产者组,发送同类消息的一个消息生产组。
Consumer: 消费消息的服务。
Consumber Group: 消费同类消息的多个实例。
Topic: 主题,某类消息,queue是消息的物理管理单位,而topic是逻辑管理单位,一个topic下有多个queue,默 认4个。
Tag: 标签,子主题(二级分类),对Topic的进一步细化,用于区分同个主题下不同的业务消息。
Message: 消息,每个message必须指定一个topic
Broker: MQ程序,接收生产的消息,提供给消费者的程序。
Name Server: 给生产者和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信息
Offset: 偏移量,可以理解为消息进度
Commit log: 消息存储会写在 commit log文件中
RocketMQ的下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.4.0/
rocketmq是用纯粹的Java语言编写,所以首先需要安装Jdk.
windows环境下:
set NAMESRV_ADDR=localhost:9876
tools.cmd org.apache.rocketmq.example.quickstart.Producer
set NAMESRV_ADDR=localhost:9876
tools.cmd org.apache.rocketmq.example.quickstart.Consumer
Linux环境下:
export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
下载地址:https://github.com/apache/rocketmq-externals
进入到 rocketmq-console 文件夹下,执行如下命令:
mvn clean package -Dmaven.test.skip=true
java -jar target/rocketmq-console-ng-1.0.1.jar
在浏览器输入:http://localhost:8080进行访问。
<dependency>
<groupId>org.apache.rocketmqgroupId>
<artifactId>rocketmq-clientartifactId>
<version>4.4.0version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
新建一个mq.properties文件,文件的内容如下:
主要就是将基本参数放在了配置文件中,直接在类中调用使用
nameServerAdr=localhost:9876
producerGroupName=producer-test
sendMailTopic=email-send-topic
sendMailTopic.tag=registerSuccess
consumerGroup=consumer-group
// 消息生产者
@Configuration
@PropertySource("classpath:mq.properties") //制定properties文件的位置
public class RocketProducer {
@Value("${nameServerAdr}")
private String nameServerAddress; // name-server的地址
@Value("${producerGroupName}")
private String producerGroup; //生产者组名
@Value("${sendMailTopic}")
private String topic;
@Value("${sendMailTopic.tag}")
private String tag;
@Bean
public DefaultMQProducer defaultMqProducer() {
// 实例消息的生产者,然后通过构造方法制定其组
DefaultMQProducer defaultMQProducer = new DefaultMQProducer(this.producerGroup);
//设置nameServer的地址
defaultMQProducer.setNamesrvAddr(this.nameServerAddress);
try {
defaultMQProducer.start(); //启动producer
} catch (MQClientException e) {
e.printStackTrace();
}
return defaultMQProducer;
}
}
我们在Controller中调用创建消息
@RequestMapping("/test01")
public Object test(){
DefaultMQProducer defaultMQProducer = rocketProducer.defaultMqProducer();
for (int i = 0; i < 100; i++) {
//创建信息类
Message msg = null;
try {
//参数 发送消息主题名, 消息标签, 信息
msg = new Message("toipcTest",
"aaaa",
("你好呀RocketMq " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = defaultMQProducer.send(msg);
System.out.printf("%s%n", sendResult);
} catch (UnsupportedEncodingException e) {
System.out.println(e.getMessage());
} catch (InterruptedException | RemotingException | MQBrokerException | MQClientException e) {
e.printStackTrace();
}
}
return "ok";
}
@Configuration
@PropertySource("classpath:mq.properties")
public class RocketConsumer {
@Value("${nameServerAdr}")
private String nameServerAddress; // name-server的地址
@Value("${producerGroupName}")
private String producerGroup; //生产者组名
@Value("${sendMailTopic}")
private String topic;
@Value("${sendMailTopic.tag}")
private String tag;
@Bean
public DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException {
// 实例消息的生产者,然后通过构造方法制定其组
DefaultMQPushConsumer defaultMqPushConsumer = new DefaultMQPushConsumer();
defaultMqPushConsumer.setConsumerGroup(this.producerGroup);
defaultMqPushConsumer.setNamesrvAddr(this.nameServerAddress);
//设置nameServer的地址
defaultMqPushConsumer.subscribe("toipcTest","aaaa");
defaultMqPushConsumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
System.out.println("开始接受消息==========================");
msgs.forEach(mt -> {
System.out.println(new String(mt.getBody()));
});
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
defaultMqPushConsumer.start();
return defaultMqPushConsumer;
}
消息成功接收到了