本篇文章只涉及到代码实现,具体rabbitmq原理可以参考前面文章<<RabbitMQ六种队列模式>>。
一、定义队列名称
package com.shuofeng.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 工作队列
* @author menglingwei
*
*/
@Configuration
public class ProducerConsumerConfig {
@Bean
public Queue myQueue() {
Queue queue = new Queue("myqueue");
return queue;
}
}
启动加载并创建队列。
二、定义发送对象MAIL
package com.shuofeng.dto;
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 + "]";
}
}
三、定义生产者
package com.shuofeng.producer;
import com.shuofeng.dto.Mail;
public interface Producer {
public void sendMail(String queue, Mail mail);
}
package com.shuofeng.producer.impl;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.shuofeng.dto.Mail;
import com.shuofeng.producer.Producer;
/**
* 工作队列模式
* @author menglingwei
*
*/
@Transactional
@Service
public class ProducerImpl implements Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void sendMail(String queue, Mail mail) {
this.rabbitTemplate.convertAndSend(queue, mail);
}
}
四、定义消费者
package com.shuofeng.customer;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.shuofeng.dto.Mail;
@Component
public class QueueListener1 {
@RabbitListener(queues = "myqueue")
public void displayMail(Mail mail) throws Exception {
System.out.println("队列监听器1号收到消息" + mail.toString());
}
}
五、测试
package com.shuofeng;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.web.WebAppConfiguration;
import com.shuofeng.dto.Mail;
import com.shuofeng.producer.impl.ProducerImpl;
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ProducerImplTest {
@SpyBean
private ProducerImpl producerImpl;
@Test
public void testSendMail() {
Mail mail = new Mail();
mail.setMailId("001");
mail.setCountry("CHINA");
mail.setWeight(2.2);
this.producerImpl.sendMail("myqueue", mail);
}
}
运行结果如下图:
从上图看出,消费者已经消费。