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>
此时可以解决线程阻塞问题;
原创,转载说明!

浙公网安备 33010602011771号