yhs0092 commented on issue #3624:
URL:
https://github.com/apache/servicecomb-java-chassis/issues/3624#issuecomment-1420118503
## 测试用例
```java
package org.apache.servicecomb.registry.consumer;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.servicecomb.registry.api.registry.Microservice;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
class MicroserviceVersionsTest {
private static final int SCALE = 10000;
private static final String MOCK_SERVICE_ID = "serviceId";
private static final String MOCK_INSTANCE_ID = "instanceId";
@Test
public void test() throws InterruptedException {
final MicroserviceVersions microserviceVersions =
mockMicroserviceVersions();
final List<MicroserviceInstance> instanceList =
mockMicroserviceInstanceList();
final AtomicLong counter = new AtomicLong(0);
microserviceVersions.safeSetInstances(instanceList, "" +
counter.getAndIncrement());
final ExecutorService pool = Executors.newFixedThreadPool(2);
final CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
final CountDownLatch countDownLatch = new CountDownLatch(2);
final AtomicBoolean continueFlag = new AtomicBoolean(true);
pool.submit(() -> {
// mock pulled instance list refreshing
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
while (continueFlag.get()) {
microserviceVersions.safeSetInstances(instanceList, "" +
counter.getAndIncrement());
sleep();
}
countDownLatch.countDown();
});
final HashMap<Integer, Integer> resultMap = new HashMap<>();
pool.submit(() -> {
// mock microservice invocation load balancing
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
for (int i = 0; i < SCALE; ++i) {
sleep();
resultMap.compute(microserviceVersions.getVersions().get(MOCK_SERVICE_ID).getInstances().size(),
(k, v) -> v == null ? 1 : v + 1);
}
continueFlag.set(false);
countDownLatch.countDown();
});
countDownLatch.await();
System.out.println(resultMap);
pool.shutdown();
Assertions.assertTrue((int) resultMap.get(0) == 0, "concurrent problem
occurs!");
}
private void sleep() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private MicroserviceVersions mockMicroserviceVersions() {
return new MicroserviceVersions(new AppManager(), "appId", "ms") {
@Override
public MicroserviceVersion createMicroserviceVersion(String
microserviceId,
List<MicroserviceInstance> instances) {
final Microservice microservice = new Microservice();
microservice.setVersion("0.0.1.0");
return new MicroserviceVersion(this, microservice, "msName",
instances);
}
};
}
private List<MicroserviceInstance> mockMicroserviceInstanceList() {
final MicroserviceInstance instance = new MicroserviceInstance();
instance.setServiceId(MOCK_SERVICE_ID);
instance.setInstanceId(MOCK_INSTANCE_ID);
return Collections.singletonList(instance);
}
}
```
## 测试结果

--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]