Project: Hazelcast Jet (App Definition and Development / Streaming & Messaging)
File: 004-spring-boot-starter.md

title: 004 - Spring Boot Starter description: Spring Boot Starter for Hazelcast Jet id: version-4.4-004-spring-boot-starter original_id: 004-spring-boot-starter Since: 4.1 User should be able to auto configure/start Jet in a Spring Boot environment. Spring Boot uses `META-INF/spring.factories` metadata file to define classes which will be evaluated for auto-configuration. We've added `HazelcastJetAutoConfiguration` class as a starting point for auto configuring Jet. ```java @Configuration(proxyBeanMethods = false) @ConditionalOnClass(JetInstance.class) @Import({ HazelcastJetServerConfiguration.class, HazelcastJetClientConfiguration.class }) public class HazelcastJetAutoConfiguration { } ``` Spring Boot has a feature named `ConfigurationProperties` which makes external configuration easily accessible. We've defined configuration properties for server and client. User can point the starter to the desired configuration file by defining `hazelcast.jet.server.config` for server, `hazelcast.jet.imdg.config` for imdg, and `hazelcast.jet.client.config` for client. Spring Boot has a concept of `Conditional`, which can be put on to the classes as an annotation. The conditional enables the evaluation of the class if the defined condition is met. There are some predefined conditionals like `@ConditionalOnClass` or `@ConditionalOnMissingBean`. You can also create a custom `Condition` and use it with `@Conditional` annotation. We've created custom conditions for server and client configurations. These conditions checks if a configuration file is defined, as a system property or a . If not the conditions looks for the configuration files ( `hazelcast-jet.(yaml|yml|xml)` for server and `hazelcast-client.(yaml|yml|xml)` for client ) on the classpath or at the root directory. Since `HazelcastJetAutoConfiguration` imports the server configuration first and then the client, Spring Boot evaluates server configuration class first. If `JetConfig` is available as a bean, a member will be created using the bean. If `ClientConfig` is available as a bean, a client will be created using the bean. If `hazelcast.jet.server.config` config property is defined, a member will be created using the defined configuration file. If `hazelcast.jet.config` system property is defined, a member will be created using the defined configuration file. If

config property is defined, a client will be created using the defined configuration file. If `hazelcast.client.config` system property is defined, a client will be created using the defined configuration file. If `hazelcast-jet.(yaml|yml|xml)` found on the classpath or at the root directory, a member will be created with that configuration file. If `hazelcast-client.(yaml|yml|xml)` found on the classpath or at the root directory, a client will be created with that configuration file. If none of the above conditions are met, a member will be created using the default configuration file (`hazelcast-jet-default.yaml`). Spring-boot has a concept of checking if a provided service is up and running, this can then be plugged to various monitoring tools. We've created `HazelcastJetHealthIndicator` which reports the status of the Jet instance via `HazelcastInstance.getLifecycleService().isRunning()`. We've also added the auto-configuration of this health indicator (`HazelcastJetHealthIndicatorAutoConfiguration`) to the `META-INF/spring.factories`. We've decided to set the version of the starter as `2.0.0` because it is compatible with Spring Boot 2.0.0 and above. Spring Boot has out of the box support for IMDG starter which creates a `HazelcastInstance` if `hazelcast.(yaml|yml|xml)` or `hazelcast-client.(yaml|yml|xml)` found on the classpath or at the root directory. This means that IMDG starter will create a `HazelcastInstance` while the Jet starter will create a `JetInstance`. The solution to this conflict is to disable the IMDG starter if Jet is present. We've raised a to address this on Spring Boot repository. The starter provides unit/integration tests using Spring Boot Test project. The health indicator for Jet actually uses the wrapped `HazelcastInstance` to report the status. We could re-use `HazelcastHealthIndicator` which is already available in Spring Boot distribution instead of creating a Jet specific one. The problem is Spring Boot still uses IMDG `3.12.x` and `com.hazelcast.core.Endpoint` is moved to `com.hazelcast.cluster.Endpoint` in `4.0`. Since this class is used in `HazelcastHealthIndicator` we should wait for Spring Boot to upgrade to IMDG `4.0` to continue this unification. See the .