java-----MqServer启动监听后,导致服务器其他线程宕机,无法接收到任何请求,只能接收MQ队列消息

 1 public class MqServerOld {
 2 
 3     @Autowired
 4     private MqConfig config;
 5 
 6     public void start(){
 7         System.out.println("=====MQ服务启动=======");
 8 
 9         SydmqServer server = new SydmqServer(config.getConfig());
10         try {
11             server.open();
12             while(true){
13                 SydmqData request = server.recv();//TODO 此时队列会阻塞其他线程,解决方案如下||
14                 if(request.getCorrelId() !=null){
15                     System.out.println("======接收到的消息");
16                 }
17             }
18         }catch (Exception e){
19 
20         }
21     }
22 }

思路:开启一个新的线程来监听MQ服务,多线程处理监听得到的消息

 1 public class MqServerOld {
 2 
 3     @Autowired
 4     private MqConfig config;
 5     /**
 6      * 是否循环接收队列标识
 7      */
 8     private Boolean tryFlag = true;
 9 
10     /**
11      * 注入线程池
12      */
13     @Autowired
14     ThreadPoolTaskExecutor mqPool;
15 
16     public void start(){
17 
18         new Thread(new Runnable() {
19             @Override
20             public void run() {
21                 System.out.println("=====MQ服务启动=======");
22                 final SydmqServer server = new SydmqServer(config.getConfig());
23                 try {
24                     server.open();
25                 }catch (Exception e){
26                     tryFlag = false;
27                     server.close;
28                 }
29                 while (tryFlag){
30                     try {
31                         SydmqData request = server.recv();
32                         mqPool.submit(new Runnable() {
33                             @Override
34                             public void run() {
35                                 if(request.getCorrelId() !=null){
36                                     System.out.println("======接收到的消息");
37                                 } 
38                             }
39                         });
40                         
41                     }catch (Exception e){
42 
43                     }
44                 }
45 
46             }
47         }).start();
48     }
49 }

附上Spring启动配置:servlet-context.xml

<bean id="mqExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 核心线程数 -->
        <property name="corePoolSize" value="10" />
        <!-- 最大线程数 -->
        <property name="maxPoolSize" value="100" />
        <!-- 队列最大长度 -->
        <property name="queueCapacity" value="500" />
        <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
        <property name="keepAliveSeconds" value="60" />
    </bean>

 

 

此时可以解决线程阻塞问题;

原创,转载说明!

posted @ 2020-08-12 16:24  _xue  阅读(339)  评论(0)    收藏  举报