diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderWithCopies.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderWithCopies.java index 045c1c55d..44fea4a0c 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderWithCopies.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderWithCopies.java @@ -2,30 +2,37 @@ package com.ai.cloud.skywalking.sender; import static com.ai.cloud.skywalking.conf.Config.Sender.MAX_COPY_NUM; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; /** * 带副本的数据发送器 + * * @author wusheng * */ -public class DataSenderWithCopies implements IDataSender{ +public class DataSenderWithCopies implements IDataSender { private int maxCopyNum; - - private List senders = new ArrayList(); - - public DataSenderWithCopies(int maxKeepConnectingSenderSize){ - //最大副本数量,不能大于可用最大连接数 - maxCopyNum = maxKeepConnectingSenderSize > MAX_COPY_NUM ? MAX_COPY_NUM: maxKeepConnectingSenderSize; + + private Set senders = new HashSet(); + + public DataSenderWithCopies(int maxKeepConnectingSenderSize) { + // 最大副本数量,不能大于可用最大连接数 + maxCopyNum = maxKeepConnectingSenderSize > MAX_COPY_NUM ? MAX_COPY_NUM + : maxKeepConnectingSenderSize; } - + /** * 尝试增加到最大可用副本数,极端情况可能不足 + * * @param dataSender * @return */ - public boolean append(IDataSender dataSender){ + public boolean append(IDataSender dataSender) { + // 出现重复sender,副本到达最大限度 + if (senders.contains(dataSender)) { + return false; + } senders.add(dataSender); return senders.size() < maxCopyNum; } @@ -35,14 +42,16 @@ public class DataSenderWithCopies implements IDataSender{ */ public boolean send(String data) { int successNum = 0; - for(IDataSender sender : senders){ - if(sender.send(data)){ + for (IDataSender sender : senders) { + if (sender.send(data)) { successNum++; } } - if(successNum >= 2 || successNum >= maxCopyNum){ + if (senders.size() == 1 && successNum == 1) { return true; - }else{ + } else if (successNum >= 2) { + return true; + } else { return false; } }