springBoot集成rabbitmq 之工作模式(Work queues)
springBoot整合rabbitmq的例子: https://blog.youkuaiyun.com/weixin_45730866/article/details/128971917,建议先看。
consumer服务
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.37</version>
</dependency>
配置类
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitWorkQueuesConfig {
/**
* Queue 可以有4个参数
* 1.name 队列名
* 2.durable 持久化消息队列 ,rabbitmq重启的时候不需要创建新的队列 默认true
* 3.auto-delete 表示消息队列没有在使用时将被自动删除 默认是false
* 4.exclusive 表示该消息队列是否只在当前connection生效,默认是false
*/
@Bean
public Queue createWorkQueuesQueue() {
return new Queue("WorkQueues",true);
}
}
接收者
import com.alibaba.fastjson.JSON;
import com.lideru.consumer.pojo.User;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@RabbitListener(queues = "WorkQueues")
public class WorkQueuesReceiver {
@Value("${server.port}")
private int port;
@RabbitHandler
public void process(String user) {
User u = JSON.parseObject(user,User.class);
System.out.println(port+ " 服务接收 : " + u +","+ new Date());
}
}
producer服务
依赖和上面consumer服务一样
发送者
import com.alibaba.fastjson.JSON;
import com.lideru.producer.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.UUID;
@Component
public class WorkQueuesSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(int i) {
CorrelationData uuId = new CorrelationData(UUID.randomUUID().toString());
User user = new User("tom", 18 ,"man");
String u = JSON.toJSONString(user);
rabbitTemplate.convertAndSend("WorkQueues",(Object) u,uuId);
System.out.println("发送成功,"+new Date()+","+u);
}
}
测试类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping
@RestController
public class WorkQueuesTestController {
@Autowired
private WorkQueuesSender workQueuesSender;
@GetMapping("workQueuesTest")
public String workQueuesTest() throws Exception {
for (int j = 0; j < 10; j++) {
workQueuesSender.send(j);
}
return "workQueuesTestOK";
}
}
启动动producer服务,访问127.0.0.1:8080/workQueuesTes,返回结果是workQueuesTestOK,控制台结果如下:
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom0","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom1","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom2","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom3","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom4","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom5","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom6","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom7","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom8","sex":"man"}
发送成功,Mon Feb 13 09:55:10 CST 2023,{"age":18,"name":"tom9","sex":"man"}
然后我们再启动consumer服务,consumer的控制台结果如下:
8081 服务接收 : User(name=tom0, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom1, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom2, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom3, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom4, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom5, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom6, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom7, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom8, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
8081 服务接收 : User(name=tom9, age=18, sex=man),Mon Feb 13 09:55:10 CST 2023
到这里证明已经成功了。
然后我们再启动一个consumer服务,此时启动了两个consumer服务。再请求一次127.0.0.1:8080/workQueuesTes,两个consumer服务打印分别是:
8081 服务接收 : User(name=tom0, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8081 服务接收 : User(name=tom2, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8081 服务接收 : User(name=tom4, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8081 服务接收 : User(name=tom6, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8081 服务接收 : User(name=tom8, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8082 服务接收 : User(name=tom1, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8082 服务接收 : User(name=tom3, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8082 服务接收 : User(name=tom5, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8082 服务接收 : User(name=tom7, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
8082 服务接收 : User(name=tom9, age=18, sex=man),Mon Feb 13 09:59:59 CST 2023
看到上面的结果,证明在两个服务中轮询。