1

I am using Spring-Boot, Spring-Data/JPA with Hazelcast client/server topology. I've been trying to use a MapStore as a Write-Behind buffer for my database through HazelcastRepository. My goal is to use a JpaRepository inside my MapStore to store sessions.

My current problem is that repository is not getting @Autowired, it always returns null.

Found this post about a similar situation, but it's not working because hazelcastClientInstance.getConfig().getManagedContext() is returning null.

Hazelcast configuration:

@Configuration
@EnableHazelcastRepositories(basePackages = {"com.xpto.database"})
@EnableJpaRepositories(basePackages = {"com.xpto.database"})
@ComponentScan(basePackages = {"com.xpto"})
public class HazelcastConfiguration {

@Bean
public SpringManagedContext managedContext() {
    return new SpringManagedContext();
}
@Bean
HazelcastInstance hazelcastClientInstance(){
    // Real all configuration from hazelcast-client file
    ClientConfig clientConfig = null;

    try {
        clientConfig = new XmlClientConfigBuilder("hazelcast-client-config.xml").build().
                setManagedContext(managedContext());
    } catch (IOException e) {
        e.printStackTrace();
    }


    return HazelcastClient.newHazelcastClient(clientConfig);
}
}


MapStore:

@SpringAware
public class SessionMapStore implements MapStore<String, Session>, MapLoaderLifecycleSupport {
private static final Logger LOGGER = LoggerFactory.getLogger(SessionMapStore.class);

@Autowired
private SessionsHCRepository sessionsHCRepository;


@Override
public void init(HazelcastInstance hazelcastClientInstance, Properties properties, String mapName) {
    hazelcastClientInstance.getConfig().getManagedContext().initialize(this);
}

@Override
public void destroy() {

}


Repository:

@Repository
public interface SessionsHCRepository extends HazelcastRepository<SessionDB, String> {
}


pom file:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.10.0</version>
    </dependency>

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.11.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.11.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.2.1</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.15</version>
    </dependency>

    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis-jaxrpc</artifactId>
        <version>1.4</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.rpc</groupId>
        <artifactId>javax.xml.rpc-api</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.5</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-all</artifactId>
        <version>4.2.2</version>
    </dependency>

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>spring-data-hazelcast</artifactId>
        <version>1.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>

</dependencies>
ajms
  • 67
  • 7
  • What's your architecture? I'm inclined to believe that you're using Hazelcast in a Client-Server architecture: you've a Hazelcast cluster and your application is its client. Can you confirm? – Nicolas Dec 14 '21 at 13:14
  • Yes Nicolas. Exactly like that – ajms Dec 14 '21 at 13:55
  • 1
    In that case, the problem is that your MapStore should run in the cluster. But, no Spring application runs on the cluster, they are just simple Hazelcast nodes. Hence, either you use simple code that doesn't require a framework (not JPA, no Spring) or you change the server to also run Spring. – Nicolas Dec 14 '21 at 14:12
  • Thanks for the info. When you say change server to run spring you mean create a spring application only to run the hazelcast server? And then connect to it using the client spring app? Atm im using docker to run the server – ajms Dec 14 '21 at 15:06
  • 1
    "Create a spring application only to run the hazelcast server", yes, exactly that – Nicolas Dec 15 '21 at 16:17

0 Answers0