实现逻辑:模拟多个客户端进行升级任务,使用一个请求队列(由服务器端声明创建),每一个客户端为自己创建独一无二的临时响应队列,用于接收升级进度;
一、linux服务器中使用docker部署RabbitMQ
docker run -id --name=rabbitmq -v /home/file/mq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:management
其中,15672可以访问RabbitMQ的管理页面,5672用于客户端和服务器端使用RabbitMQ的通信,账户和密码用于登录管理页面,进行访问时要打开端口;
二、模拟实现多个客户端
调用顺序:Client_Multi—>Multi_Thread—>Client_one_task
资源类访问RabbitMQ的实现和线程池实现分开
1.在pom.xml中配置依赖
<dependencies>
<!-- rabbitmq 依赖客户端-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<!-- slf4j日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.67_noneautotype2</version>
</dependency>
</dependencies>
2.Client_Multi(使用循环模拟多个客户端)
public class Client_Multi {
public static ExecutorService msgHandleService = Executors.newFixedThreadPool(5);
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("线程池关闭!!!");
msgHandleService.shutdown();
}));
for (int i = 0; i < 2; i++) {
msgHandleService.execute(new Multi_Thread.MessageHandleTask("升级"+i+"命令"));
}
}
}
3.Multi_Thread(线程池的实现)
public class Multi_Thread{
public static Logger logger = LoggerFactory.getLogger(Multi_Thread.class);
public static class MessageHandleTask implements Runnable {
String message;
public MessageHandleTask(String message) {
this.message = message;
}