作者 朱兆平

增加直接从mq获取报文并解析的处理方案

@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 web: 2 web:
3 upload-path: upload/ 3 upload-path: upload/
4 server: 4 server:
5 - port: 10002 5 + port: 10003
6 servlet: 6 servlet:
7 context-path: ${SERVER_CONTEXTPATH:} 7 context-path: ${SERVER_CONTEXTPATH:}
8 spring: 8 spring:
@@ -22,7 +22,7 @@ spring: @@ -22,7 +22,7 @@ spring:
22 static-locations: classpath:/META-INF/resources/,classpath:/static,classpath:/resources/,classpath:/public/,file:${web.upload-path} 22 static-locations: classpath:/META-INF/resources/,classpath:/static,classpath:/resources/,classpath:/public/,file:${web.upload-path}
23 23
24 application: 24 application:
25 - name: WLTP-NMMS-CUSTOMMESSAGEPROCESS 25 + name: WLTP-NMMS-MQ-CUSTOMMESSAGEPROCESS
26 26
27 jackson: 27 jackson:
28 serialization: 28 serialization:
@@ -37,12 +37,20 @@ spring: @@ -37,12 +37,20 @@ spring:
37 #eureka主机名,会在控制页面中显示 37 #eureka主机名,会在控制页面中显示
38 #DEV环境关闭注册。 38 #DEV环境关闭注册。
39 features: 39 features:
40 - enabled: false 40 + enabled: true
41 discovery: 41 discovery:
42 - enabled: false 42 + enabled: true
43 service-registry: 43 service-registry:
44 auto-registration: 44 auto-registration:
45 - enabled: false 45 + enabled: true
  46 +#feign的配置,连接超时及读取超时配置
  47 +feign:
  48 + client:
  49 + config:
  50 + default:
  51 + connectTimeout: 6000
  52 + readTimeout: 60000
  53 + loggerLevel: basic
46 54
47 eureka: 55 eureka:
48 instance: 56 instance:
@@ -51,15 +59,12 @@ eureka: @@ -51,15 +59,12 @@ eureka:
51 prefer-ip-address: true 59 prefer-ip-address: true
52 instance-id: ${spring.cloud.client.ip-address}:${server.port} 60 instance-id: ${spring.cloud.client.ip-address}:${server.port}
53 hostname: ${spring.cloud.client.ip-address} 61 hostname: ${spring.cloud.client.ip-address}
54 - health-check-url-path: /actuator/health  
55 lease-renewal-interval-in-seconds: 15 62 lease-renewal-interval-in-seconds: 15
56 lease-expiration-duration-in-seconds: 45 63 lease-expiration-duration-in-seconds: 45
57 - metadata-map:  
58 - startup: ${random.int}  
59 client: 64 client:
60 #eureka注册中心服务器地址 65 #eureka注册中心服务器地址
61 service-url: 66 service-url:
62 - defaultZone: http://10.50.3.82:19527/eureka/ 67 + defaultZone: http://192.168.1.53:12345/eureka/
63 registry-fetch-interval-seconds: 30 68 registry-fetch-interval-seconds: 30
64 69
65 #debug配置,debug或者为true的时候,logback才会记录和写入日志文件 70 #debug配置,debug或者为true的时候,logback才会记录和写入日志文件
@@ -112,11 +117,11 @@ mq: @@ -112,11 +117,11 @@ mq:
112 #发送mq队列名称 117 #发送mq队列名称
113 send-to-mq: send 118 send-to-mq: send
114 #读取mq队列名称 119 #读取mq队列名称
115 - read-from-mq: receive 120 + read-from-mq: response.agent
116 exchange: 121 exchange:
117 #TCS回执发送到此交换,交换再把回执消息同步到其他配置的回执订阅队列 122 #TCS回执发送到此交换,交换再把回执消息同步到其他配置的回执订阅队列
118 #交换名称 123 #交换名称
119 - name: air.rcv.broadcast 124 + name: cus.rcv.broadcast
120 #交换类型 125 #交换类型
121 type: fanout 126 type: fanout
122 #routing key名称,此处为空,所有绑定交换的队列都被广播 127 #routing key名称,此处为空,所有绑定交换的队列都被广播
@@ -125,11 +130,11 @@ mq: @@ -125,11 +130,11 @@ mq:
125 connection: 130 connection:
126 ip: 218.28.199.134 131 ip: 218.28.199.134
127 port: 8004 132 port: 8004
128 - vHost: AIRTRANS 133 + vHost: NMMS
129 username: tianbo 134 username: tianbo
130 password: vmvnv1v2VV 135 password: vmvnv1v2VV
131 # ip: 192.168.1.63 136 # ip: 192.168.1.63
132 # port: 5672 137 # port: 5672
133 # vHost: NMMS 138 # vHost: NMMS
134 # username: mrz 139 # username: mrz
135 -# password: vmvnv1v2  
  140 +# password: vmvnv1v2
@@ -11,9 +11,9 @@ @@ -11,9 +11,9 @@
11 <relativePath/> <!-- lookup parent from repository --> 11 <relativePath/> <!-- lookup parent from repository -->
12 </parent> 12 </parent>
13 <groupId>com.tianbo</groupId> 13 <groupId>com.tianbo</groupId>
14 - <artifactId>customs</artifactId> 14 + <artifactId>customs-with-mq</artifactId>
15 <version>1.0-SNAPSHOT</version> 15 <version>1.0-SNAPSHOT</version>
16 - <name>customMessageProcess</name> 16 + <name>customMessageWithMQ</name>
17 <description>process customs xml files with RabbitMQ</description> 17 <description>process customs xml files with RabbitMQ</description>
18 <properties> 18 <properties>
19 <druid.version>1.1.9</druid.version> 19 <druid.version>1.1.9</druid.version>
@@ -32,6 +32,10 @@ @@ -32,6 +32,10 @@
32 <version>1.3.2</version> 32 <version>1.3.2</version>
33 </dependency> 33 </dependency>
34 <dependency> 34 <dependency>
  35 + <groupId>org.springframework.cloud</groupId>
  36 + <artifactId>spring-cloud-starter-openfeign</artifactId>
  37 + </dependency>
  38 + <dependency>
35 <groupId>org.springframework.boot</groupId> 39 <groupId>org.springframework.boot</groupId>
36 <artifactId>spring-boot-starter-websocket</artifactId> 40 <artifactId>spring-boot-starter-websocket</artifactId>
37 <exclusions> 41 <exclusions>
@@ -97,6 +101,12 @@ @@ -97,6 +101,12 @@
97 <artifactId>util</artifactId> 101 <artifactId>util</artifactId>
98 <version>1.0-SNAPSHOT</version> 102 <version>1.0-SNAPSHOT</version>
99 </dependency> 103 </dependency>
  104 + <dependency>
  105 + <groupId>com.tianbo</groupId>
  106 + <artifactId>util</artifactId>
  107 + <version>1.0-SNAPSHOT</version>
  108 + <scope>compile</scope>
  109 + </dependency>
100 <!--util依赖--> 110 <!--util依赖-->
101 111
102 <!--&lt;!&ndash;IMF需要的包&ndash;&gt;--> 112 <!--&lt;!&ndash;IMF需要的包&ndash;&gt;-->
@@ -438,4 +448,4 @@ @@ -438,4 +448,4 @@
438 <url>https://repo.spring.io/milestone</url> 448 <url>https://repo.spring.io/milestone</url>
439 </pluginRepository> 449 </pluginRepository>
440 </pluginRepositories> 450 </pluginRepositories>
441 -</project>  
  451 +</project>
@@ -12,6 +12,7 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat @@ -12,6 +12,7 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat
12 import org.springframework.boot.web.client.RestTemplateBuilder; 12 import org.springframework.boot.web.client.RestTemplateBuilder;
13 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 13 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
14 import org.springframework.cloud.client.loadbalancer.LoadBalanced; 14 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  15 +import org.springframework.cloud.openfeign.EnableFeignClients;
15 import org.springframework.context.annotation.Bean; 16 import org.springframework.context.annotation.Bean;
16 import org.springframework.scheduling.annotation.EnableScheduling; 17 import org.springframework.scheduling.annotation.EnableScheduling;
17 import org.springframework.transaction.annotation.EnableTransactionManagement; 18 import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -25,6 +26,7 @@ import java.time.Duration; @@ -25,6 +26,7 @@ import java.time.Duration;
25 HibernateJpaAutoConfiguration.class}) 26 HibernateJpaAutoConfiguration.class})
26 @EnableScheduling 27 @EnableScheduling
27 @EnableDiscoveryClient 28 @EnableDiscoveryClient
  29 +@EnableFeignClients
28 @EnableTransactionManagement 30 @EnableTransactionManagement
29 //@MapperScan("com.tianbo.analysis.dao") 31 //@MapperScan("com.tianbo.analysis.dao")
30 public class MQBootApplication { 32 public class MQBootApplication {
  1 +package com.tianbo.analysis.handle;
  2 +
  3 +import com.rabbitmq.client.Channel;
  4 +import com.rabbitmq.client.Envelope;
  5 +import com.tianbo.analysis.service.CustomAnalysisService;
  6 +import com.tianbo.util.Date.DateUtil;
  7 +import lombok.Data;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.apache.commons.io.FileExistsException;
  10 +import org.apache.commons.io.FileUtils;
  11 +import org.apache.commons.lang.StringUtils;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.beans.factory.annotation.Value;
  14 +import org.springframework.stereotype.Component;
  15 +import org.xml.sax.InputSource;
  16 +
  17 +import javax.annotation.PostConstruct;
  18 +import javax.xml.parsers.DocumentBuilder;
  19 +import javax.xml.parsers.DocumentBuilderFactory;
  20 +import java.io.File;
  21 +import java.io.IOException;
  22 +import java.io.StringReader;
  23 +import java.util.UUID;
  24 +
  25 +/**
  26 + * 报文分发到舱单回执解析服务线程
  27 + * 分发前判定报文是否为正常合规的XML报文
  28 + * 合规的过滤掉XML的头部信息(为了能将原报文内容转发到IMF),
  29 + * 并备份一份到bakupDir目录,并转发一份到新舱单转发回执到IMF发送端监听目录下
  30 + * 不合规的备份到errBakDir目录
  31 + */
  32 +
  33 +@Component
  34 +@Data
  35 +@Slf4j
  36 +public class CustomHandleThead implements Runnable{
  37 +
  38 + private String msg;
  39 +
  40 + private Channel ackChannel;
  41 +
  42 + private Envelope envelope;
  43 +
  44 + //备份目录
  45 + @Value("${custom.receptBakDir}")
  46 + private String bakupDir;
  47 +
  48 + @Value("${custom.errBakDir}")
  49 + private String errBakDir;
  50 +
  51 + //回执转发目录
  52 + @Value("${custom.transmitDir}")
  53 + private String transmitDir;
  54 +
  55 + private static CustomHandleThead customHandleThead;
  56 +
  57 + @Autowired
  58 + CustomAnalysisService customAnalysisService;
  59 +
  60 + public CustomHandleThead(){
  61 +
  62 + }
  63 +
  64 + public CustomHandleThead(String msg) {
  65 + this.msg = msg;
  66 + }
  67 +
  68 + public CustomHandleThead(String msg, Channel ackChannel,Envelope envelope) {
  69 + this.msg = msg;
  70 + this.ackChannel = ackChannel;
  71 + this.envelope = envelope;
  72 + }
  73 +
  74 + @PostConstruct
  75 + public void init() {
  76 + customHandleThead = this;
  77 +
  78 + customHandleThead.customAnalysisService = this.customAnalysisService;
  79 + customHandleThead.bakupDir = this.bakupDir;
  80 + customHandleThead.errBakDir = this.errBakDir;
  81 + customHandleThead.transmitDir = this.transmitDir;
  82 +
  83 +
  84 + // 初使化时将已静态化的testService实例化
  85 + }
  86 +
  87 + @Override
  88 + public void run() {
  89 + try {
  90 + if (StringUtils.isNotBlank(msg) && isXmlDocument(msg)){
  91 + //过滤报文头部
  92 + msg = msg.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>","");
  93 +
  94 + boolean result = customHandleThead.customAnalysisService.analysis(msg);
  95 + if (result){
  96 + ack();
  97 + }else {
  98 + ack();
  99 + }
  100 + }else {
  101 + //错误报文直接消费 不处理;并备份
  102 + ack();
  103 + }
  104 + }catch (Exception e){
  105 + nack();
  106 + e.printStackTrace();
  107 + }
  108 +
  109 + }
  110 +
  111 + private void ack(){
  112 + try {
  113 + ackChannel.basicAck(envelope.getDeliveryTag(),false);
  114 + log.warn("tag:{}已消费",envelope.getDeliveryTag());
  115 + }catch (IOException e){
  116 + e.printStackTrace();
  117 + }
  118 + }
  119 +
  120 + private void nack(){
  121 + try {
  122 + ackChannel.basicNack(envelope.getDeliveryTag(), false, true);
  123 + }catch (IOException e){
  124 + e.printStackTrace();
  125 + }
  126 + }
  127 +
  128 +
  129 +
  130 + private static boolean isXmlDocument(String rtnMsg) {
  131 + boolean flag = true;
  132 + try {
  133 + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  134 + DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
  135 + builder.parse(new InputSource(new StringReader(rtnMsg)));
  136 + } catch (Exception e) {
  137 + flag = false;
  138 + }
  139 + return flag;
  140 + }
  141 +
  142 + public static void bakFile(String content,String filePath){
  143 + try {
  144 + String fileName = customHandleThead.bakupDir + UUID.randomUUID().toString()+".xml";
  145 + log.info("-----------{}报文保存成功----------",fileName);
  146 + File fileToDirectory = new File(fileName);
  147 + FileUtils.writeStringToFile(fileToDirectory,content,"UTF-8");
  148 + }catch (IOException e){
  149 +
  150 + }
  151 +
  152 + }
  153 +
  154 +
  155 +}
  1 +package com.tianbo.analysis.handle;
  2 +
  3 +import com.rabbitmq.client.AMQP;
  4 +import com.rabbitmq.client.Channel;
  5 +import com.rabbitmq.client.DefaultConsumer;
  6 +import com.rabbitmq.client.Envelope;
  7 +import com.tianbo.analysis.task.XMLThreadPoolFactory;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +
  10 +import java.io.IOException;
  11 +import java.nio.charset.StandardCharsets;
  12 +import java.util.concurrent.RejectedExecutionException;
  13 +import java.util.concurrent.ThreadPoolExecutor;
  14 +
  15 +@Slf4j
  16 +public class RabbitGetMessage extends DefaultConsumer {
  17 +
  18 + private Channel ackChannel;
  19 + /**
  20 + * 初始化线程池
  21 + */
  22 + private static ThreadPoolExecutor threadPool = XMLThreadPoolFactory.instance();
  23 +
  24 + public RabbitGetMessage(Channel channel) {
  25 + super(channel);
  26 + this.ackChannel= channel;
  27 + }
  28 +
  29 +
  30 + @Override
  31 + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
  32 + String message = new String(body, StandardCharsets.UTF_8);
  33 +// log.info("消费状态:consumerTag->{},envelope->{},properties->{},body->{}",consumerTag,envelope,properties,message);
  34 +
  35 +// ackChannel.basicAck(envelope.getDeliveryTag(),false);
  36 +
  37 + //todo:多线程处理消息
  38 + handleMessage(message,ackChannel,envelope);
  39 +
  40 + }
  41 +
  42 + private void handleMessage(String message,Channel channel,Envelope envelope){
  43 + CustomHandleThead customResponseHandleThread = new CustomHandleThead(message,channel,envelope);
  44 + try{
  45 + threadPool.execute(customResponseHandleThread);
  46 + }catch (RejectedExecutionException e){
  47 + e.printStackTrace();
  48 + log.error("线程池已满");
  49 + }catch (Exception e){
  50 + e.printStackTrace();
  51 + log.error("线程池异常");
  52 + }
  53 + }
  54 +
  55 +}
1 -package com.tianbo.analysis.model;  
2 -  
3 -import lombok.Data;  
4 -  
5 -@Data  
6 -public class CustomReception {  
7 - //回执报头  
8 - private String messageID;  
9 - private String functionCode;  
10 - private String messageType;  
11 - private String senderID;  
12 - private String receiverID;  
13 - private String sendTime;  
14 - private String version;  
15 -  
16 - //一般业务回执  
17 - private String flightNo;  
18 - private String flightDate;  
19 - private String wayBillMaster;  
20 - private String wayBillSecond;  
21 - private String responseCode;  
22 - private String responseText;  
23 -  
24 - //国际转运回执  
25 - private String importFlightDate;  
26 - private String importFlightNo;  
27 - private String importWaybillMaster;  
28 - private String exportFlightDate;  
29 - private String exportFlightNo;  
30 - private String exportWaybillMaster;  
31 -  
32 - public CustomReception(String messageType,  
33 - String flightNo,  
34 - String flightDate,  
35 - String wayBillMaster,  
36 - String wayBillSecond,  
37 - String responseCode,  
38 - String responseText,  
39 - String messageID,  
40 - String sendTime,  
41 - String senderID,  
42 - String receiverID,  
43 - String version,  
44 - String functionCode){  
45 - this.messageType = messageType;  
46 - this.flightNo = flightNo;  
47 - this.flightDate = flightDate;  
48 - this.wayBillMaster = wayBillMaster;  
49 - this.wayBillSecond = wayBillSecond;  
50 - this.responseCode = responseCode;  
51 - this.responseText = responseText;  
52 - this.messageID = messageID;  
53 - this.sendTime = sendTime;  
54 - this.senderID =senderID;  
55 - this.receiverID = receiverID;  
56 - this.version = version;  
57 - this.functionCode = functionCode;  
58 - }  
59 -  
60 - public CustomReception(String messageType,  
61 - String importFlightNo,  
62 - String importFlightDate,  
63 - String importWaybillMaster,  
64 - String transResponseCode,  
65 - String transResponseText,  
66 - String messageID,  
67 - String sendTime,  
68 - String senderID,  
69 - String receiverID,  
70 - String version,  
71 - String functionCode){  
72 - this.messageType = messageType;  
73 - this.importFlightNo = importFlightNo;  
74 - this.importFlightDate = importFlightDate;  
75 - this.importWaybillMaster = importWaybillMaster;  
76 - this.responseCode = transResponseCode;  
77 - this.responseText = transResponseText;  
78 - this.messageID = messageID;  
79 - this.sendTime = sendTime;  
80 - this.senderID =senderID;  
81 - this.receiverID = receiverID;  
82 - this.version = version;  
83 - this.functionCode = functionCode;  
84 - }  
85 -}  
  1 +package com.tianbo.analysis.model;
  2 +
  3 +import com.rabbitmq.client.Channel;
  4 +import com.rabbitmq.client.Connection;
  5 +import com.tianbo.analysis.handle.RabbitGetMessage;
  6 +import com.tianbo.util.RabitMq.ConnectionUtil;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +
  9 +import java.io.IOException;
  10 +import java.util.concurrent.TimeoutException;
  11 +
  12 +@Slf4j
  13 +public class RabbitMQ {
  14 +
  15 + public static String status = "not runing";
  16 +
  17 + private String queueName;
  18 +
  19 + private String exchangeName;
  20 +
  21 + private String routingKey;
  22 +
  23 + private String mqIp;
  24 +
  25 + private int mqPort;
  26 +
  27 + private String mqVhost;
  28 +
  29 + private String mqUsername;
  30 +
  31 + private String mqPassword;
  32 +
  33 + public String getQueueName() {
  34 + return queueName;
  35 + }
  36 +
  37 + public void setQueueName(String queueName) {
  38 + this.queueName = queueName;
  39 + }
  40 +
  41 + public String getExchangeName() {
  42 + return exchangeName;
  43 + }
  44 +
  45 + public void setExchangeName(String exchangeName) {
  46 + this.exchangeName = exchangeName;
  47 + }
  48 +
  49 + public String getRoutingKey() {
  50 + return routingKey;
  51 + }
  52 +
  53 + public void setRoutingKey(String routingKey) {
  54 + this.routingKey = routingKey;
  55 + }
  56 +
  57 + public String getMqIp() {
  58 + return mqIp;
  59 + }
  60 +
  61 + public void setMqIp(String mqIp) {
  62 + this.mqIp = mqIp;
  63 + }
  64 +
  65 + public int getMqPort() {
  66 + return mqPort;
  67 + }
  68 +
  69 + public void setMqPort(int mqPort) {
  70 + this.mqPort = mqPort;
  71 + }
  72 +
  73 + public String getMqVhost() {
  74 + return mqVhost;
  75 + }
  76 +
  77 + public void setMqVhost(String mqVhost) {
  78 + this.mqVhost = mqVhost;
  79 + }
  80 +
  81 + public String getMqUsername() {
  82 + return mqUsername;
  83 + }
  84 +
  85 + public void setMqUsername(String mqUsername) {
  86 + this.mqUsername = mqUsername;
  87 + }
  88 +
  89 + public String getMqPassword() {
  90 + return mqPassword;
  91 + }
  92 +
  93 + public void setMqPassword(String mqPassword) {
  94 + this.mqPassword = mqPassword;
  95 + }
  96 +
  97 + public RabbitMQ(String mqIp, int mqPort, String mqVhost, String mqUsername, String mqPassword, String queueName) {
  98 + this.mqIp = mqIp;
  99 + this.mqPort = mqPort;
  100 + this.mqVhost = mqVhost;
  101 + this.mqUsername = mqUsername;
  102 + this.mqPassword = mqPassword;
  103 + this.queueName = queueName;
  104 + }
  105 +
  106 + public void getResponseFromMq() {
  107 + try {
  108 + // 获取到连接以及mq通道
  109 + Connection connection = ConnectionUtil.getConnection(
  110 + mqIp,
  111 + mqPort,
  112 + mqVhost,
  113 + mqUsername,
  114 + mqPassword);
  115 + // 从连接中创建通道
  116 + Channel channel = connection.createChannel();
  117 + // 声明(创建)队列
  118 +// channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);
  119 +// channel.queueDeclare(queueName, true, false, false, null);
  120 + channel.queueBind(queueName,exchangeName,routingKey);
  121 + channel.basicQos(15);
  122 + channel.basicConsume(queueName, false, new RabbitGetMessage(channel));
  123 + status = "runing";
  124 + }catch (IOException e){
  125 + status = "not runing";
  126 + e.printStackTrace();
  127 + log.error("MQ服务器连接失败,连接不上服务器:{},异常退出",e.toString());
  128 + }catch (TimeoutException e){
  129 + status = "not runing";
  130 + e.printStackTrace();
  131 + log.error("MQ服务器连接失败,连接超时:{},异常退出",e.toString());
  132 + }catch (Exception e){
  133 + e.printStackTrace();
  134 + status = "not runing";
  135 + }
  136 +
  137 + }
  138 +}
1 package com.tianbo.analysis.rabbitmq; 1 package com.tianbo.analysis.rabbitmq;
2 2
3 import com.rabbitmq.client.*; 3 import com.rabbitmq.client.*;
  4 +import com.tianbo.analysis.bean.SpringBeanUtitl;
  5 +import com.tianbo.analysis.handle.CustomHandleThead;
  6 +import com.tianbo.analysis.service.CustomAnalysisService;
  7 +import com.tianbo.analysis.task.XMLThreadPoolFactory;
4 import com.tianbo.util.RabitMq.MqResponse; 8 import com.tianbo.util.RabitMq.MqResponse;
5 import lombok.extern.slf4j.Slf4j; 9 import lombok.extern.slf4j.Slf4j;
6 import org.apache.commons.io.FileUtils; 10 import org.apache.commons.io.FileUtils;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Component;
  13 +
7 import java.io.File; 14 import java.io.File;
8 import java.io.IOException; 15 import java.io.IOException;
9 import java.nio.charset.StandardCharsets; 16 import java.nio.charset.StandardCharsets;
10 import java.util.UUID; 17 import java.util.UUID;
  18 +import java.util.concurrent.RejectedExecutionException;
  19 +import java.util.concurrent.ThreadPoolExecutor;
11 import java.util.regex.*; 20 import java.util.regex.*;
12 21
13 /** 22 /**
@@ -22,12 +31,18 @@ public class GetResponse extends DefaultConsumer { @@ -22,12 +31,18 @@ public class GetResponse extends DefaultConsumer {
22 31
23 private static GetResponse getResponse; 32 private static GetResponse getResponse;
24 33
  34 + /**
  35 + * 初始化线程池
  36 + */
  37 + private static ThreadPoolExecutor threadPool = XMLThreadPoolFactory.instance();
  38 +
25 public GetResponse(Channel channel) { 39 public GetResponse(Channel channel) {
26 super(channel); 40 super(channel);
27 } 41 }
28 public GetResponse(Channel channel,String dir) { 42 public GetResponse(Channel channel,String dir) {
29 super(channel); 43 super(channel);
30 this.receptDir = dir; 44 this.receptDir = dir;
  45 +
31 } 46 }
32 /** 47 /**
33 * 处理回来的信息 48 * 处理回来的信息
@@ -46,7 +61,9 @@ public class GetResponse extends DefaultConsumer { @@ -46,7 +61,9 @@ public class GetResponse extends DefaultConsumer {
46 // System.err.println("body: " + new String(body)); 61 // System.err.println("body: " + new String(body));
47 this.mqResponse = new MqResponse(consumerTag,envelope,properties,new String(body, StandardCharsets.UTF_8)); 62 this.mqResponse = new MqResponse(consumerTag,envelope,properties,new String(body, StandardCharsets.UTF_8));
48 log.info("-----------获取到报文----------\n{}",mqResponse.getContent()); 63 log.info("-----------获取到报文----------\n{}",mqResponse.getContent());
49 - writeToReadDir(mqResponse.getContent()); 64 +
  65 + handleMessage(mqResponse.getContent());
  66 +// writeToReadDir(mqResponse.getContent());
50 67
51 //写入回执目录 68 //写入回执目录
52 } 69 }
@@ -71,4 +88,18 @@ public class GetResponse extends DefaultConsumer { @@ -71,4 +88,18 @@ public class GetResponse extends DefaultConsumer {
71 88
72 } 89 }
73 90
  91 + private void handleMessage(String message){
  92 + CustomHandleThead customResponseHandleThread = new CustomHandleThead();
  93 + customResponseHandleThread.setMsg(message);
  94 + try{
  95 + threadPool.execute(customResponseHandleThread);
  96 + }catch (RejectedExecutionException e){
  97 + e.printStackTrace();
  98 + log.error("线程池已满");
  99 + }catch (Exception e){
  100 + e.printStackTrace();
  101 + log.error("线程池异常");
  102 + }
  103 + }
  104 +
74 } 105 }
@@ -46,8 +46,8 @@ public class ReadMessage { @@ -46,8 +46,8 @@ public class ReadMessage {
46 String exchangeName = "amq.topic"; 46 String exchangeName = "amq.topic";
47 String routingKey = "consumer.#"; 47 String routingKey = "consumer.#";
48 // 声明(创建)队列 48 // 声明(创建)队列
49 - channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);  
50 - channel.queueDeclare(queueName, true, false, false, null); 49 +// channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);
  50 +// channel.queueDeclare(queueName, true, false, false, null);
51 channel.queueBind(queueName,exchangeName,routingKey); 51 channel.queueBind(queueName,exchangeName,routingKey);
52 status = "runing"; 52 status = "runing";
53 channel.basicConsume(queueName, true, new GetResponse(channel,dir)); 53 channel.basicConsume(queueName, true, new GetResponse(channel,dir));
  1 +package com.tianbo.analysis.service;
  2 +
  3 +import org.springframework.cloud.openfeign.FeignClient;
  4 +import org.springframework.web.bind.annotation.PostMapping;
  5 +import org.springframework.web.bind.annotation.RequestParam;
  6 +
  7 +@FeignClient(name = "wltp-nmms-custom-reciption-resolver")
  8 +public interface CustomAnalysisService {
  9 +
  10 + @PostMapping("/cust/analysis")
  11 + boolean analysis(@RequestParam(value = "xml",required = true) String xml);
  12 +}
  1 +package com.tianbo.analysis.task;
  2 +
  3 +
  4 +import com.tianbo.analysis.model.RabbitMQ;
  5 +import com.tianbo.analysis.rabbitmq.ReadMessage;
  6 +import com.tianbo.util.Date.DateUtil;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.springframework.beans.factory.annotation.Value;
  9 +import org.springframework.scheduling.annotation.Scheduled;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import java.text.SimpleDateFormat;
  13 +import java.util.Date;
  14 +import java.util.concurrent.ThreadPoolExecutor;
  15 +
  16 +/**
  17 + * 新舱单从mq服务器的tcs回执队列中获取回执报文并落地保存
  18 + * 回执解析定时任务
  19 + * 从mq获取报文 落地保存
  20 + */
  21 +@Slf4j
  22 +@Component
  23 +public class CustomMqGetTask {
  24 +
  25 + //报文保存目录
  26 + @Value("${mq.dir.saveXml-dir}")
  27 + private String receptDir;
  28 +
  29 + @Value("${mq.connection.ip}")
  30 + private String mqIp;
  31 +
  32 + @Value("${mq.connection.port}")
  33 + private int mqPort;
  34 +
  35 + @Value("${mq.connection.vHost}")
  36 + private String mqVhost;
  37 +
  38 + @Value("${mq.connection.username}")
  39 + private String mqUsername;
  40 +
  41 + @Value("${mq.connection.password}")
  42 + private String mqPassword;
  43 +
  44 + @Value("${mq.queue.read-from-mq}")
  45 + private String queueName;
  46 +
  47 + @Value("${mq.exchange.name}")
  48 + private String exchangeName;
  49 +
  50 + @Value("${mq.exchange.routing-key}")
  51 + private String routingKey;
  52 +
  53 + @Scheduled(fixedRate = 5000)
  54 + public void startTask(){
  55 +
  56 + try {
  57 + //从mq获取回执
  58 + RabbitMQ readMessage = new RabbitMQ(mqIp,mqPort,mqVhost,mqUsername,mqPassword,queueName);
  59 + readMessage.setExchangeName(exchangeName);
  60 + readMessage.setRoutingKey(routingKey);
  61 + if(!"runing".equals(RabbitMQ.status)){
  62 + log.info("开始连接MQ服务器");
  63 + readMessage.getResponseFromMq();
  64 + log.info("MQ通道建立成功");
  65 + }
  66 + }catch (Exception e){
  67 + e.printStackTrace();
  68 + log.error("程序出错",e);
  69 + }
  70 +
  71 +// log.info("获取消息结束");
  72 +
  73 + }
  74 +
  75 +}
@@ -43,7 +43,7 @@ public class NmmsMqGetTask { @@ -43,7 +43,7 @@ public class NmmsMqGetTask {
43 @Value("${mq.queue.read-from-mq}") 43 @Value("${mq.queue.read-from-mq}")
44 private String queueName; 44 private String queueName;
45 45
46 - @Scheduled(fixedRate = 5000) 46 +// @Scheduled(fixedRate = 5000)
47 public void startTask(){ 47 public void startTask(){
48 48
49 49
@@ -59,7 +59,7 @@ public class NmmsMqSendTask { @@ -59,7 +59,7 @@ public class NmmsMqSendTask {
59 */ 59 */
60 private final static int theadamount = 10; 60 private final static int theadamount = 10;
61 61
62 - @Scheduled(fixedRate = 5000) 62 +// @Scheduled(fixedRate = 5000)
63 public void startTask(){ 63 public void startTask(){
64 64
65 final SimpleDateFormat sdf = new SimpleDateFormat( 65 final SimpleDateFormat sdf = new SimpleDateFormat(
@@ -11,9 +11,9 @@ public class XMLThreadPoolFactory { @@ -11,9 +11,9 @@ public class XMLThreadPoolFactory {
11 public static ThreadPoolExecutor instance(){ 11 public static ThreadPoolExecutor instance(){
12 if (threadPool==null){ 12 if (threadPool==null){
13 XMLThreadFactory xmlThreadFactory = new XMLThreadFactory("xml"); 13 XMLThreadFactory xmlThreadFactory = new XMLThreadFactory("xml");
14 - threadPool = new ThreadPoolExecutor(10, 100, 14 + threadPool = new ThreadPoolExecutor(15, 240,
15 0L, TimeUnit.MILLISECONDS, 15 0L, TimeUnit.MILLISECONDS,
16 - new LinkedBlockingQueue<Runnable>(1024), 16 + new LinkedBlockingQueue<Runnable>(),
17 xmlThreadFactory, 17 xmlThreadFactory,
18 new ThreadPoolExecutor.AbortPolicy()); 18 new ThreadPoolExecutor.AbortPolicy());
19 } 19 }