From dfbd8f002de1ee4d1807c6d6c8d3de2276df3f12 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <xltys1995>
Date: 星期四, 24 九月 2020 13:16:10 +0800
Subject: [PATCH] #线程安全问题

---
 src/main/java/com/zy/core/model/protocol/StaProtocol.java   |   11 ++++++++++-
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |   26 +++++++++++++-------------
 src/main/java/com/zy/core/thread/DevpThread.java            |   11 +++++++++++
 3 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index c31e4dd..67b8cb9 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -109,7 +109,7 @@
                 String barcode = barcodeThread.getBarcode();
                 // 鑾峰彇鍏ュ簱绔欎俊鎭�
                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone();
                 if (staProtocol == null) {
                     continue;
                 }
@@ -182,7 +182,7 @@
                         barcodeThread.setBarcode("");
                         staProtocol.setWorkNo((short) workNo);
                         staProtocol.setStaNo(startupDto.getStaNo().shortValue());
-                        staProtocol.setPakMk(false);
+                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                         boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                         if (!result) {
                             throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
@@ -212,7 +212,7 @@
             for (DevpSlave.Sta inSta : devp.getInSta()) {
                 // 鑾峰彇鍏ュ簱绔欎俊鎭�
                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone();
                 if (staProtocol == null) { continue; }
                 // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
                 if (staProtocol.isAutoing() && staProtocol.isLoading()
@@ -227,7 +227,7 @@
                     // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
                     staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
                     staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
-                    staProtocol.setPakMk(false);
+                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                     if (result) {
                         // 鏇存柊宸ヤ綔涓绘。
@@ -258,7 +258,7 @@
             for (DevpSlave.Sta pickSta : devp.getPickSta()) {
                 // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
+                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()).clone();
                 if (staProtocol == null) { continue; }
                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                     && staProtocol.getWorkNo() > 0 && staProtocol.isPakMk()){
@@ -321,7 +321,7 @@
                     // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
                     staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
                     staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
-                    staProtocol.setPakMk(false);
+                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                     if (!result) {
                         log.error("鍙戝竷鍛戒护鑷宠緭閫佺嚎闃熷垪澶辫触锛侊紒锛� [plc缂栧彿锛歿}]", devp.getId());
@@ -344,7 +344,7 @@
             for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                 // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
                 if (staProtocol == null) { continue; }
                 if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
                     // 鏌ヨ宸ヤ綔妗�
@@ -446,7 +446,7 @@
             boolean flag = false;
             // 鑾峰彇鍫嗗灈鏈哄叆搴撶珯淇℃伅
             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
             if (staProtocol == null) { continue; }
             // 鏌ヨ绔欑偣璇︾粏淇℃伅
             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
@@ -534,7 +534,7 @@
             }
             // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
             if (staProtocol == null) { continue; }
             // 鏌ヨ绔欑偣璇︾粏淇℃伅
             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
@@ -706,7 +706,7 @@
             for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
                 // 鑾峰彇绌烘澘鍏ュ簱绔欎俊鎭�
                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo());
+                StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()).clone();
                 if (staProtocol == null) { continue; }
                 // 绔欑偣鏉′欢鍒ゆ柇
                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
@@ -753,7 +753,7 @@
                         // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
                         staProtocol.setWorkNo((short) workNo);
                         staProtocol.setStaNo(startupDto.getStaNo().shortValue());
-                        staProtocol.setPakMk(false);
+                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                         boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                         if (!result) {
                             throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
@@ -784,7 +784,7 @@
             List<WrkMast> wrkMasts = new ArrayList<>();
             for (Integer staNo : led.getStaArr()) {
                 // 鑾峰彇鍙夎溅绔欑偣
-                StaProtocol staProtocol = devpThread.getStation().get(staNo);
+                StaProtocol staProtocol = devpThread.getStation().get(staNo).clone();
                 if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { continue; }
                 // 鑾峰彇宸ヤ綔妗f暟鎹�
                 WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
@@ -871,7 +871,7 @@
             boolean reset = true;
             for (Integer staNo : led.getStaArr()) {
                 // 鑾峰彇鍙夎溅绔欑偣
-                StaProtocol staProtocol = devpThread.getStation().get(staNo);
+                StaProtocol staProtocol = devpThread.getStation().get(staNo).clone();
                 if (staProtocol == null) {continue;}
                 if (staProtocol.getWorkNo() != 0) {
                     reset = false;
diff --git a/src/main/java/com/zy/core/model/protocol/StaProtocol.java b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
index 71f9030..64e43af 100644
--- a/src/main/java/com/zy/core/model/protocol/StaProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -8,7 +8,7 @@
  * Created by vincent on 2020/8/6
  */
 @Data
-public class StaProtocol {
+public class StaProtocol implements Cloneable {
 
     // 绔欑偣缂栧彿
     private Integer siteId;
@@ -59,5 +59,14 @@
         return basDevp;
     }
 
+    @Override
+    public StaProtocol clone() {
+        try {
+            return (StaProtocol) super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
 }
diff --git a/src/main/java/com/zy/core/thread/DevpThread.java b/src/main/java/com/zy/core/thread/DevpThread.java
index 84e83ec..90d5837 100644
--- a/src/main/java/com/zy/core/thread/DevpThread.java
+++ b/src/main/java/com/zy/core/thread/DevpThread.java
@@ -192,6 +192,7 @@
 //        status[4] = staProtocol.isEmptyMk();
 //        OperateResult write2 = siemensS7Net.Write("DB100." + ((staProtocol.getSiteId() - 1) + 40), status);     //  鐘舵��
         if (!write.IsSuccess || !write1.IsSuccess) {
+            staProtocol = station.get(staProtocol.getSiteId());
             if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                 staProtocol.setPakMk(true);
             }
@@ -250,6 +251,16 @@
         }
     }
 
+    /**
+     * 璁剧疆鍏ュ簱鏍囪
+     */
+    public void setPakMk(Integer siteId, boolean pakMk) {
+        StaProtocol staProtocol = station.get(siteId);
+        if (null != staProtocol) {
+            staProtocol.setPakMk(pakMk);
+        }
+    }
+
     @Override
     public void close() {
         siemensS7Net.ConnectClose();

--
Gitblit v1.9.1