Spring-boot 整合RabbitMQ ------基於註解的開發
阿新 • • 發佈:2018-11-25
spring:
rabbitmq:
host: 192.168.3.193
username: guest
password: guest
package com.shi.amqp; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 自動配置 * 1. RabbitAutoConfiguration 幫我們配置了很多東西 * 2. 有自動連線工廠 ConntectionFactory * 3. RabbitProperties :封裝了 rabbitMq的配置, * 4. RabbitTemplate: 給rabbitMQ傳送和接收訊息 * 5. amqpAdmin: rabbitmq系統管理功能元件, * amqpAdmin:用來建立 queue,exchange,binbing * 6. @EnableRabbit + RabbitListener 監聽訊息 */ @EnableRabbit //開啟基於註解的rabbitmq模式 @SpringBootApplication public class AmqpApplication { public static void main(String[] args) { SpringApplication.run(AmqpApplication.class, args); } }
package com.shi.amqp; import com.shi.amqp.model.Book; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; 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 java.util.Date; import java.util.HashMap; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest public class AmqpApplicationTests { @Autowired RabbitTemplate rabbitTemplate; @Autowired AmqpAdmin amqpAdmin; @Test public void contextLoads() { } @Test public void create(){ amqpAdmin.declareQueue(new Queue("amqp.queue"));//建立佇列 System.out.println("佇列建立成功"); amqpAdmin.declareExchange(new DirectExchange("ampq.exchage"));//建立直連型交換機 System.out.println("交換機建立成功"); amqpAdmin.declareBinding(new Binding("amqp.queue", Binding.DestinationType.QUEUE,"ampq.exchage","amqp",null));//繫結資訊 System.out.println("佇列與交換機的繫結建立成功"); } /** * 1 單播 (點對點) */ @Test public void sendMessage(){ //message 需要自己構造一個,定義訊息體內容和訊息頭 //rabbitTemplate.send(exchange,routingKey,message); //obj 預設當成訊息體,只需要傳入要傳送的物件,自動序列化傳送給rabbitMq //rabbitTemplate.convertAndSend(exchange,routingKey, obj); /*Map<String,Object> map = new HashMap<>(); map.put("msg","我的測試直連訊息佇列"); map.put("date",new Date()); rabbitTemplate.convertAndSend("amq.direct","direct",map); */ Book book = new Book(); book.setName("三國演義3333"); book.setAuthor("羅貫中3333"); rabbitTemplate.convertAndSend("amq.direct","direct",book); } /** * 接收訊息佇列中的資料 */ @Test public void receiverMsg(){ Object obj = rabbitTemplate.receiveAndConvert("TESTQUEUE"); System.out.println(obj.getClass()); System.out.println(obj); } }
package com.shi.amqp.service; import com.shi.amqp.model.Book; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; @Service public class BooService { /** * 用來監聽佇列,佇列中有訊息過來就呼叫該方法 * @param book */ @RabbitListener(queues = "TESTQUEUE") public void recive1(Book book){ System.out.println(book.getAuthor()); System.out.println(book.getName()); } }
package com.shi.amqp.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAMQPConfig {
/**
* 把訊息對佇列中的訊息轉換成json格式
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}