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();
}
}