导入的pom是:
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
先常见一个消息生产者:
import com.techen.tap.vo.ResponseResult;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mq")
public class AAmqController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public ResponseResult<Object> send()
{
rabbitTemplate.convertAndSend("lihao" , "user" , "消息1");
return ResponseResult.ok("ok");
}
}
一个消费者:
@RestController
@RequestMapping("/consumer")
public class AAmqConsumerController {
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,
exchange = @Exchange(value = "lihao"),
key = {"user", "error", "warning"}
)
})
@RabbitHandler
public void get(Message message)
{
System.out.print(new String(message.getBody()) + "-----------------------");
}
}
convertAndSendReceive表示发送消息有序。 发一条, 等消费者消费完后才发下一条。 这个和消费者手动确认那个不是一回事。
如果想使用消息手动确认机制, 就要在消费者的方法中加入 Channel参数。 传过来一个通道。
然后从通道设置ACK。
这里注意要导对包:
import com.rabbitmq.client.Channel; 别的包不好使!
没有设置手动确认前,自动确认时,消息会一次性发给消费者,存在消费者的通道里, 队列会清空。
设置手动确认后,消息发给消费者后,会等待消费者向mq确认, 消费者确认后, mq才会接着发送下一条数据。
设置手动确认的同时,一般会同时设置QOS , 一次只发送一条消息。
使用ACK手动确认:
channel.basicAck(message.getMessageProperties().getDeliveryTag() , false);
basicAck的第一个参数表示:消息的index , 应为消息是存放在队列里的,队列里的数据都有索引index , basicAck会告诉mq 这个索引对应的消息已经被我消费。 第二个参数是 设置是否批量确认。
如果为true , basicAck会告诉mq 这个index索引对应的消息和他之前的消息都已经被我消费。 如果为false , 表示不支持批量, basicAck会告诉mq 单单这一条Index的索引对应的消息被我消费。
使用QOS限流:
channel.basicQos(0, 1 ,true);
第一个参数表示: mq一次发送消息的内容的最大长度。 0表示对消息大小没有限制。
第二个参数表示:mq一次发送不超过这个参数的消息个数, 如果传值为3 , mq一次会发送不超过3条消息给消费者。
第三个参数表示:以上这些设置是适用于整个通道还是只适用于当前消费者, true表示使用与整个通道, false表示使用与当前消费者。
使用NACK拒绝消息:
channel.basicNack(x ,x , x)
第一个参数表示这条消息的index
第二个参数表示是否批量, 如果为true,表示为批量,mq会被告知当前index和他之前的消息全部处理失败,如果给false,表示不批量,mq会被告知仅当前index所对应的消息处理失败。
第三个参数表示 对于处理失败的消息是否重回队列。true表示重回队列, false表示丢弃。 对于重回队列的消息, 又会被消费者重新消费。