公司要把项目放到阿里云上,然后使用阿里云的数据库和消息队列。结果阿里云上面只有rabbitmq服务器而没有rocketmq服务器。所以我只好再写一套rabbitmq的代码。顺便一提阿里云上没有tidb只有mysql,幸好tidb是兼容mysql的。
参考文章:
springboot+rabbitmq整合示例程
Windows下安装及配置RabbitMQ
rabbitmq的安装就不说了,因为是用erlang语言写的,安装rabbitmq之前还需要安装erlang。
rabbitmq的使用真的挺方便的,不同于kafka需要zookeeper,rocketmq需要nameserver,只要启动一个服务就行了,而且自带网页管理监控系统,这点真的让我喜欢。
springboot很好地整合了rabbitmq,不用rocketmq那样麻烦,用默认的配置和注解的方式就能使用。
先maven导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
rabbitmq配置
#rabbitmq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/
#rabbitmq消息重试设置
spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.max-attempts=5
spring.rabbitmq.listener.simple.retry.initial-interval=2000
spring.rabbitmq.listener.simple.default-requeue-rejected=false
然后配置最简单的队列
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitmqConfig {
@Bean
public Queue baseQueue() {
//队列名以这里的名字为准
return new Queue("base");
};
}
我尝试了一下是队列是以new Queue("队列名");为准的,不知道为什么看的文章中是以方法名作为队列名,然后实际上会报错。
按理来说是要配置相应的转发器,并且将转发器和队列联系起来,但是rabbitmq中是有默认的转发器的,所以用这种最简单的方式也可以
下面配置消费者
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.kq.highnet2.framework.base.common.model.RabbitMqMessageDTO;
@Component
@RabbitListener(queues = "base")//也可以加在方法上
public class RabbitMqReceiver {
Logger logger = LoggerFactory.getLogger("mqInfo");
@RabbitHandler
public void process(RabbitMqMessageDTO message) throws Exception {
logger.info("==========RABBITMQ_CONSUME_START===========");
logger.info("key:"+message.getKey());
logger.info("body:"+message.getBody());
logger.info("==========RABBITMQ_CONSUME_END===========");
}
}
和rocketmq比起来用注解的方式配置简单多了,而且没有rocketmq中的顺序消费,并发消费模式之分,并且也不用返回值,如果要重复消费抛出异常就行,注意,抛出AmqpRejectAndDontRequeueException异常的话是不会重复消费的。
然后发送消息
@Resource
AmqpTemplate amqpTemplate;
public void sendMessage(String key, String msg){
RabbitMqMessageDTO message = new RabbitMqMessageDTO();
message.setKey(key);
message.setBody(msg);
amqpTemplate.convertAndSend("monitorDataQueue", message);
}
和rocketmq比起来,也不需要配置生产者集群什么的,使用很简单,当然效率的比较久不清楚了
这就是rabbitmq的简单使用