1、部署rocketmq namesrv、broker
a、rocketmq下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/
b、配置JAVA_HOME、ROCKETMQ_HOME
c、cmd下运行mqnamesrv
d、再开cmd下运行mqbroker -n 127.0.0.1:9876
2、springboot rocketmq 客户端程序:
a、配置:
#rocketmq
spring.rocketmq.namesrvaddr=localhost:9876
b、依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.1.0-incubating</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-common</artifactId>
<version>4.1.0-incubating</version>
</dependency>
c、生产者:
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* RocketMQ生产者
*/
@Component
public class MQProducer {
private static final Logger LOGGER = LoggerFactory.getLogger(MQProducer.class);
@Value("${spring.rocketmq.namesrvaddr}")
private String namesrvAddr;
private final DefaultMQProducer producer = new DefaultMQProducer("TestRocketMQProducer");
/**
* 初始化
*/
@PostConstruct
public void start() {
try {
LOGGER.info("MQ:启动生产者");
producer.setNamesrvAddr(namesrvAddr);
producer.start();
} catch (MQClientException e) {
LOGGER.error("MQ:启动生产者失败:{}-{}", e.getResponseCode(), e.getErrorMessage());
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 发送消息
* @param data 消息内容
* @param topic 主题
* @param tags 标签
* @param keys 唯一主键
*/
public void sendMessage(String data, String topic, String tags, String keys) {
try {
byte[] messageBody = data.getBytes(RemotingHelper.DEFAULT_CHARSET);
Message mqMsg = new Message(topic, tags, keys, messageBody);
producer.send(mqMsg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
LOGGER.info("MQ: 生产者发送消息 {}", sendResult);
}
@Override
public void onException(Throwable throwable) {
LOGGER.error(throwable.getMessage(), throwable);
}
});
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
@PreDestroy
public void stop() {
if (producer != null) {
producer.shutdown();
LOGGER.info("MQ:关闭生产者");
}
}
}
d、消费者:
扫描二维码关注公众号,回复:
2888185 查看本文章
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;
/**
* RocketMQ消费者
*/
@Component
public class MQPushConsumer implements MessageListenerConcurrently {
private static final Logger LOGGER = LoggerFactory.getLogger(MQPushConsumer.class);
@Value("${spring.rocketmq.namesrvaddr}")
private String namesrvAddr;
private final DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TestRocketMQPushConsumer");
/**
* 初始化
*
* @throws MQClientException
*/
@PostConstruct
public void start() {
try {
LOGGER.info("MQ:启动消费者");
consumer.setNamesrvAddr(namesrvAddr);
// 从消息队列头开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 集群消费模式
consumer.setMessageModel(MessageModel.CLUSTERING);
// 订阅主题
consumer.subscribe("TopicTest", "*");
// 注册消息监听器
consumer.registerMessageListener(this);
// 启动消费端
consumer.start();
} catch (MQClientException e) {
LOGGER.error("MQ:启动消费者失败:{}-{}", e.getResponseCode(), e.getErrorMessage());
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 消费消息
* @param msgs
* @param context
* @return
*/
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
int index = 0;
try {
for (; index < msgs.size(); index++) {
MessageExt msg = msgs.get(index);
String messageBody = new String(msg.getBody(), RemotingHelper.DEFAULT_CHARSET);
LOGGER.info("MQ:消费者接收新信息: {} {} {} {} {}", msg.getMsgId(), msg.getTopic(), msg.getTags(), msg.getKeys(), messageBody);
}
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
} finally {
if (index < msgs.size()) {
context.setAckIndex(index + 1);
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
@PreDestroy
public void stop() {
if (consumer != null) {
consumer.shutdown();
LOGGER.error("MQ:关闭消费者");
}
}
}
e、测试:
import javax.annotation.Resource;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.wec.light.mq.center.producer.MQProducer;
@RestController
@SpringBootApplication
public class WecBootApplication extends SpringBootServletInitializer implements CommandLineRunner {
@Resource
private MQProducer mqProducer;
public static void main(String[] args) {
SpringApplication.run(WecBootApplication.class, args);
}
@RequestMapping("/")
public String hello() {
return "Hello World!";
}
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8082);
connector.setSecure(false);
connector.setRedirectPort(8081);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
@Override
public void run(String... args) throws Exception {
for (int i = 0; i < 10; i++) {
mqProducer.sendMessage("Hello RocketMQ " + i, "TopicTest", "TagTest", "Key" + i);
}
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3、rocketmq-console
下载地址:https://github.com/apache/rocketmq-externals 找到consolecha'插件
mvn install、eclipse下运行
application.properties
server.contextPath=
server.port=8090
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=127.0.0.1:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
地址:http://127.0.0.1:8090