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);
     }
   }
   ```
   
   ## 测试结果
   
   
![image](https://user-images.githubusercontent.com/22049770/217135196-85a0c462-ed3f-40d6-a9f2-6693d1e0f39c.png)
   


-- 
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]

Reply via email to