1 瞭解Rabbitmq
rabbitmq作爲目前應用最廣泛的消息中間件,在微服務應用中充當重要角色。特別是一些典型的應用場景以及重要的模塊中有重要作用,例如業務服務模塊解耦,異步通信, 併發限流,數據延遲處理等等。。。
producer:消息生產者;
consumer:消息消費者;
queue:消息隊列;
exchange:接收producer發送的消息按照binding規則轉發給相應的queue;
binding:exchange與queue之間的關係;
virtualHost:每個virtualHost持有自己的exchange、queue、binding,用戶只能在virtualHost粒度控制權限。
exchange的幾種類型
fanout:
羣發到所有綁定的queue;
direct:
根據routing key routing到相應的queue,routing不到任何queue的消息扔掉;可以不同的key綁到同一個queue,也可以同一個key綁到不同的queue;
topic:
類似direct,區別是routing key是由一組以“.”分隔的單詞組成,可以有通配符,“*”匹配一個單詞,“#”匹配0個或多個單詞;
headers:
根據arguments來routing。
arguments爲一組key-value對,任意設置。
“x-match”是一個特殊的key,值爲“all”時必須匹配所有argument,值爲“any”時只需匹配任意一個argument,不設置默認爲“all”。
添加依賴:
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
direct類型消息
根據routing key routing到相應的queue,routing不到任何queue的消息扔掉;可以不同的key綁到同一個queue,也可以同一個key綁到不同的queue;
首先啓動rabbit服務;安裝過程在此省去
控制檯地址 以及默認賬戶密碼:
guest/guest
下面引入代碼:
//連接rabbitMQ的基本配置
@Configuration
@EnableRabbit
public class RabbitConfig {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("192.168.99.100");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setPort(5672);
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(connectionFactory());
}
@Bean
public RabbitTemplate rabbitTemplate() {
return new RabbitTemplate(connectionFactory());
}
//配置消費者監聽的容器
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
return factory;
}
}
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DirectExchangeConfig {
@Bean
public DirectExchange directExchange(){
DirectExchange directExchange=new DirectExchange("direct");
return directExchange;
}
@Bean
public Queue directQueue1() {
Queue queue=new Queue("directqueue1");
return queue;
}
@Bean
public Queue directQueue2() {
Queue queue=new Queue("directqueue2");
return queue;
}
//3個binding將交換機和相應隊列連起來
@Bean
public Binding bindingorange(){
Binding binding=BindingBuilder.bind(directQueue1()).to(directExchange()).with("orange");
return binding;
}
@Bean
public Binding bindingblack(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("black");
return binding;
}
@Bean
public Binding bindinggreen(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("green");
return binding;
}
2創建Direct監聽
@Component
public class DirectListener1 {
@RabbitListener(queues = "directqueue1")
public void displayMail(Mail mail) throws Exception {
System.out.println("directqueue1隊列監聽器1號收到消息"+mail.toString());
}
}
@Component
public class DirectListener2 {
@RabbitListener(queues = "directqueue2")
public void displayMail(Mail mail) throws Exception {
System.out.println("directqueue2隊列監聽器2號收到消息"+mail.toString());
}
}
發佈類
@Service("publisher")
public class PublisherImpl implements Publisher{
@Autowired
RabbitTemplate rabbitTemplate;
public void publishMail(Mail mail) {
rabbitTemplate.convertAndSend("fanout", "", mail);
}
public void senddirectMail(Mail mail, String routingkey) {
rabbitTemplate.convertAndSend("direct", routingkey, mail);
}
public void sendtopicMail(Mail mail, String routingkey) {
rabbitTemplate.convertAndSend("mytopic", routingkey, mail);
}
}
相關實體
import java.io.Serializable;
public class Mail implements Serializable{
private static final long serialVersionUID = -8140693840257585779L;
private String mailId;
private String country;
private Double weight;
public Mail() {
}
public Mail(String mailId, String country, double weight) {
this.mailId = mailId;
this.country = country;
this.weight = weight;
}
public String getMailId() {
return mailId;
}
public void setMailId(String mailId) {
this.mailId = mailId;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Mail [mailId=" + mailId + ", country=" + country + ", weight="
+ weight + "]";
}
}
controller測試
@RequestMapping(value="/direct",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public void direct(@ModelAttribute("mail")TopicMail mail){
Mail m=new Mail(mail.getMailId(),mail.getCountry(),mail.getWeight());
publisher.senddirectMail(m, mail.getRoutingkey());
}
測試啓動
查看rabbitmq控制檯
最後感謝(參考)