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