Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When run spring boot tests got hazelcast.core.DuplicateInstanceNameException

How to execute integration tests of spring boot application with using Hazelcast, because when run all tests got hazelcast.core.DuplicateInstanceNameException?

I use Spring Boot 2.0.0.RC1 and Hazelcast 3.9.2

Use java configuration for hazelcast:

@Bean
public Config getHazelCastServerConfig() {
    final Config config = new Config();
    config.setInstanceName(hzInstance);
    config.getGroupConfig().setName(hzGroupName).setPassword(hzGroupPassword);

    final ManagementCenterConfig managementCenterConfig = config.getManagementCenterConfig();
    managementCenterConfig.setEnabled(true);
    managementCenterConfig.setUrl(mancenter);

    final MapConfig mapConfig = new MapConfig();
    mapConfig.setName(mapName);
    mapConfig.setEvictionPolicy(EvictionPolicy.NONE);
    mapConfig.setTimeToLiveSeconds(0);
    mapConfig.setMaxIdleSeconds(0);

    config.getScheduledExecutorConfig(scheduler)
            .setPoolSize(16)
            .setCapacity(100)
            .setDurability(1);

    final NetworkConfig networkConfig = config.getNetworkConfig();
    networkConfig.setPort(5701);
    networkConfig.setPortAutoIncrement(true).setPortCount(30);

    final JoinConfig joinConfig = networkConfig.getJoin();
    joinConfig.getMulticastConfig().setEnabled(false);
    joinConfig.getAwsConfig().setEnabled(false);

    final TcpIpConfig tcpIpConfig = joinConfig.getTcpIpConfig();
    tcpIpConfig.addMember(memberOne)
            .addMember(memberTwo);
    tcpIpConfig.setEnabled(true);

    return config;
}

@Bean
public HazelcastInstance getHazelCastServerInstance() {
    final HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(getHazelCastServerConfig());
    hazelcastInstance.getClientService().addClientListener(new ClientListener() {
        @Override
        public void clientConnected(Client client) {
            System.out.println(String.format("Connected %s %s %s", client.getClientType(), client.getUuid(), client.getSocketAddress()));
            log.info(String.format("Connected %s %s %s", client.getClientType(), client.getUuid(), client.getSocketAddress()));
        }

        @Override
        public void clientDisconnected(Client client) {
            System.out.println(String.format("Disconnected %s %s %s", client.getClientType(), client.getUuid(), client.getSocketAddress()));
            log.info(String.format("Disconnected %s %s %s", client.getClientType(), client.getUuid(), client.getSocketAddress()));
        }
    });

    return hazelcastInstance;
}

I have simple test:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = UpaSdcApplication.class)
@ActiveProfiles("test")
 public class CheckEndpoints {

@Autowired
private ApplicationContext context;

private static final String HEALTH_ENDPOINT = "/actuator/health";

private static WebTestClient testClient;

@Before
public void init() {
    testClient = org.springframework.test.web.reactive.server.WebTestClient
            .bindToApplicationContext(context)
            .configureClient()
            .filter(basicAuthentication())
            .build();
}

@Test
public void testHealth(){
    testClient.get().uri(HEALTH_ENDPOINT).accept(MediaType.APPLICATION_JSON)
            .exchange()
            .expectStatus()
            .isOk()
            .expectBody()
            .json("{\"status\": \"UP\"}");
}
}

If run with test class separate from other tests - it execute fine and passes. If run wiith other tests - get exception:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.hazelcast.core.HazelcastInstance]: Factory method 'getHazelCastServerInstance' threw exception; nested exception is com.hazelcast.core.DuplicateInstanceNameException: HazelcastInstance with name 'counter-instance' already exists!
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579)
    ... 91 more
Caused by: com.hazelcast.core.DuplicateInstanceNameException: HazelcastInstance with name 'counter-instance' already exists!
    at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:170)
    at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:124)
    at com.hazelcast.core.Hazelcast.newHazelcastInstance(Hazelcast.java:58)
    at net.kyivstar.upa.sdc.config.HazelcastConfiguration.getHazelCastServerInstance(HazelcastConfiguration.java:84)
    at net.kyivstar.upa.sdc.config.HazelcastConfiguration$$EnhancerBySpringCGLIB$$c7da65f3.CGLIB$getHazelCastServerInstance$0(<generated>)
    at net.kyivstar.upa.sdc.config.HazelcastConfiguration$$EnhancerBySpringCGLIB$$c7da65f3$$FastClassBySpringCGLIB$$b920d5ef.invoke(<generated>)

How do you solve this problem? How do you run integration tests?

like image 201
makson Avatar asked Sep 19 '25 13:09

makson


2 Answers

I had the same problem and I solved it checking if the instance already exists or not:

@Bean
public CacheManager cacheManager() {
    HazelcastInstance existingInstance = Hazelcast.getHazelcastInstanceByName(CACHE_INSTANCE_NAME);
    HazelcastInstance hazelcastInstance = null != existingInstance 
         ? existingInstance                                                                       
         : Hazelcast.newHazelcastInstance(hazelCastConfig());
    return new HazelcastCacheManager(hazelcastInstance);
}

You can see the rest of the code here.

instanceName configuration element is used to create a named Hazelcast member and should be unique for each Hazelcast instance in a JVM. In your case, either you should set a different instance name for each HazelcastInstance bean creation in the same JVM, or you can totally remove instanceName configuration if you don't recall instances by using instance name.

like image 41
Alparslan Avci Avatar answered Sep 23 '25 05:09

Alparslan Avci



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!