RabbitMQ
安装环境
需要下载erlang语言环境
配置erlang环境变量
ERLANG_HOME=安装根路径;
在path中配置: %ERLANG_HOME%\bin
安装RabbitMq:
配置显示插件:在根目录下中的sbin文件夹中打开cmd,输入
rabbitmq-plugins.bat enable rabbitmq_management
然后重启服务;
java基础实现
maven依赖导入
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<!--和springboot2.0.5对应-->
<version>5.4.1</version>
</dependency>
</dependencies>
创建链接
//链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("123456");
//得到链接
Connection connection = factory.newConnection();
生产者
1.获取链接
2.建立通道
Channel channel = connection.createChannel();
3.创建交换机
channel.exchangeDeclare("交换机名称","交换机类别");
4.发送消息
channel.basicPublish("交换机名称","唯一识别routingkey" ,null,"发送消息".getBytes());
消费者
1.获取链接
2.建立通道
3.创建队列
//true 持久化 false 仅限此链接 false 是否自动回复
channel.queueDeclare("队列名",true,false,false,null);
4.绑定交换机
channel.queueBind("交换机名称","队列名称","routingkey");
5.准备消费者
Consumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//处理
//手动处理返回
channel.basicAck(envelope.getDeliveryTag(),true);
}
};
6.消费信息
channel.basicConsume("队列名称",false,consumer);
rabbitMQ常用5种模型
1.hello
一对一,可以不用使用交换机,在交换机添加时填写空字符串即可.
2.work
一对多,使用多个消费者,会自动采用轮询的方式进行分配,
能者多劳配置(设置任务执行数量)
channel.basicQos(1);
3.fanout
订阅模型fanout,根据交换机名称和队列名称寻找,没有使用routingkey,填写空字符串.
4.direct
定向订阅模型direct,使用routingkey指定队列接受.
5.topic
通配订阅模型topic,消费者在绑定队列的routingkey使用通配符:
'" * " : 代表一个单词
" # ": 代表多个单词
springboot集成RabbitMQ
maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--spirngboot集成rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
基本配置
package xyz.kochiya.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq 配置文件
*/
@Configuration
public class RabbitMQConfig {
public static final String EXCHANGE_NAME_BOOT="exchange_name_boot";
public static final String QUEUE_NAME_BOOT="queue_name_boot";
/**
* 创建交换机
* @return
*/
@Bean
public Exchange createExchange(){
return ExchangeBuilder.topicExchange(EXCHANGE_NAME_BOOT).durable(true).build();
}
/**
* 创建消息队列
* @return
*/
@Bean
public Queue createQueue(){
return QueueBuilder.durable(QUEUE_NAME_BOOT).build();
}
/**
* 绑定消息队列
* @return
*/
@Bean
public Binding bindingExchange(){
return BindingBuilder.bind(createQueue()).to(createExchange()).with("kochiya.#").noargs();
}
}
生产者
package xyz.kochiya.send;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import xyz.kochiya.App;
import xyz.kochiya.config.RabbitMQConfig;
/**
* 发送
*/
@SpringBootTest(classes = App.class)
@RunWith(SpringRunner.class)
public class Sender {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
//交换机回调函数
rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{
System.err.println("交换机回调");
System.out.println(ack);
System.out.println(cause);
});
//消息队列失败回调
rabbitTemplate.setReturnCallback(( message, replyCode, replyText, exchange, routingKey)->{
System.err.println("队列失败回调");
System.out.println(new String(message.getBody()));
System.out.println(replyCode);
System.out.println(exchange);
System.out.println(replyText);
System.out.println(routingKey);
});
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME_BOOT,"kochiya.cc","给你发送一个消息");
}
}
消费者
package xyz.kochiya.receiver;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import xyz.kochiya.config.RabbitMQConfig;
import java.io.IOException;
@Component
public class Receiver {
@RabbitListener(queues = {RabbitMQConfig.QUEUE_NAME_BOOT})
public void getMsg(Message message, Channel channel) throws IOException {
System.err.println("==========");
System.out.println(new String(message.getBody()));
channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
}
}