ソースを参照

修改modbus tcp 事务标识符 多线程引起的序号相同的问题

weiyigulu 3 年 前
コミット
7d0953d274

+ 15 - 13
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/tcpextracode/TransactionIdentifier.java

@@ -43,21 +43,23 @@ public class TransactionIdentifier {
 	@Setter
 	private Byte extraCode2 = 0;
 
-	public static TransactionIdentifier getInstance(AbstractTcpMasterBuilder masterBuilder) throws ModbusException {
-		if (!((masterBuilder instanceof ModbusMasterBuilderInterface) && (masterBuilder instanceof AbstractTcpMasterBuilder))) {
-			throw new ModbusException("请传人实现了<ModbusMasterBuilderInterface>的TCPMaster");
-		}
-		Integer i = 0;
-		if (counters.containsKey(masterBuilder)) {
-			i = counters.get(masterBuilder);
-			if (i == 65535) {
-				i = 0;
-			} else {
-				i++;
+	public static synchronized TransactionIdentifier getInstance(AbstractTcpMasterBuilder masterBuilder) throws ModbusException {
+		synchronized (masterBuilder) {
+			if (!((masterBuilder instanceof ModbusMasterBuilderInterface) && (masterBuilder instanceof AbstractTcpMasterBuilder))) {
+				throw new ModbusException("请传人实现了<ModbusMasterBuilderInterface>的TCPMaster");
+			}
+			Integer i = 0;
+			if (counters.containsKey(masterBuilder)) {
+				i = counters.get(masterBuilder);
+				if (i == 65535) {
+					i = 0;
+				} else {
+					i++;
+				}
 			}
+			counters.put(masterBuilder, i);
+			return new TransactionIdentifier().setSeq(i).setExtraCode1((byte) (i >> 8)).setExtraCode2((byte) (i & 0xff));
 		}
-		counters.put(masterBuilder, i);
-		return new TransactionIdentifier().setSeq(i).setExtraCode1((byte) (i >> 8)).setExtraCode2((byte) (i & 0xff));
 	}
 
 	public void encode(List<Byte> bytes) {