implementation("io.micronaut.ignite:micronaut-ignite-core")
Micronaut Ignite
Integration between Micronaut and Apache Ignite
Version:
1 Introduction
Apache Ignite is a horizontally distributed fault tolerant compute platform for real-time applications that can process terabytes of data with in-memory speed.
This project adds support for Apache Ignite and bridges support to other Micronaut components : Micronaut Cache
2 Release History
For this project, you can find a list of releases (with release notes) here:
3 Ignite Quick Start
To add support for Ignite to an existing project, you should first add the Micronaut Ignite Core configuration to your build configuration. For example in Gradle:
<dependency>
<groupId>io.micronaut.ignite</groupId>
<artifactId>micronaut-ignite-core</artifactId>
</dependency>
The minimum requirement for configure Ignite is set the value of the ignite.enabled
property in application.yaml
.
ignite:
enabled: true
4 Configuration Ignite
The full list of configurable options via micronaut properties is below:
Property | Type | Description |
---|---|---|
|
java.lang.String |
|
|
int |
|
|
int |
|
|
boolean |
|
|
int |
|
|
int |
|
|
long |
|
|
long |
|
|
int |
|
|
int |
|
|
long |
|
|
long |
|
|
int |
|
|
boolean |
|
|
boolean |
|
|
int |
|
|
long |
|
|
boolean |
|
|
boolean |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
java.lang.String |
|
|
boolean |
|
|
java.lang.String |
|
|
int |
|
|
int |
|
|
long |
|
|
int |
|
|
int |
|
|
long |
|
|
long |
|
|
long |
|
|
long |
|
|
int |
|
|
long |
|
|
long |
|
|
int |
|
|
int |
|
|
long |
|
|
java.lang.String |
|
|
int |
|
|
org.apache.ignite.cache.CacheMode |
|
|
int |
|
|
org.apache.ignite.cache.affinity.AffinityFunction |
|
|
java.lang.String |
|
|
boolean |
Sets whether the DefaultIgniteConfiguration is enabled. |
|
boolean |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.io.Serializable |
|
|
java.util.Map |
|
|
int |
|
|
int |
|
|
long |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
int |
|
|
long |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.util.UUID |
|
|
boolean |
|
|
boolean |
|
|
java.lang.String[] |
|
|
int |
|
|
long |
|
|
long |
|
|
long |
|
|
int |
|
|
long |
|
|
int |
|
|
int |
|
|
long |
|
|
long |
|
|
long |
|
|
int |
|
|
org.apache.ignite.plugin.segmentation.SegmentationPolicy |
|
|
boolean |
|
|
boolean |
|
|
int |
|
|
long |
|
|
long |
|
|
long |
|
|
long |
|
|
org.apache.ignite.configuration.DeploymentMode |
|
|
int |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
[I |
|
|
java.lang.String |
|
|
int |
|
|
int |
|
|
java.lang.String[] |
|
|
long |
|
|
java.util.Map |
|
|
java.lang.ClassLoader |
|
|
boolean |
|
|
long |
|
|
int |
|
|
long |
|
|
boolean |
|
|
java.lang.String[] |
To apply additional configuration a bean created event listener can be registered to intercept the creation of the IgniteConfiguration.
package io.micronaut.ignite.docs.config;
import io.micronaut.context.event.BeanCreatedEvent;
import io.micronaut.context.event.BeanCreatedEventListener;
import org.apache.ignite.configuration.IgniteConfiguration;
import javax.inject.Singleton;
@Singleton
public class IgniteConfigurationFactoryInterceptor implements BeanCreatedEventListener<IgniteConfiguration> {
@Override
public IgniteConfiguration onCreated(BeanCreatedEvent<IgniteConfiguration> event) {
IgniteConfiguration configuration = event.getBean();
configuration.setIgniteInstanceName("instance-a");
return configuration;
}
}
package io.micronaut.ignite.docs.config
import io.micronaut.context.event.BeanCreatedEvent
import io.micronaut.context.event.BeanCreatedEventListener
import org.apache.ignite.configuration.IgniteConfiguration
@Singleton
class IgniteConfigurationFactoryInterceptor implements BeanCreatedEventListener<IgniteConfiguration>{
@Override
IgniteConfiguration onCreated(BeanCreatedEvent<IgniteConfiguration> event) {
IgniteConfiguration configuration = event.bean
configuration.setIgniteInstanceName("instance-a")
return configuration
}
}
package io.micronaut.ignite.docs.config
import io.micronaut.context.event.BeanCreatedEvent
import io.micronaut.context.event.BeanCreatedEventListener
import org.apache.ignite.configuration.IgniteConfiguration
class IgniteConfigurationFactoryInterceptor : BeanCreatedEventListener<IgniteConfiguration> {
override fun onCreated(event: BeanCreatedEvent<IgniteConfiguration>?): IgniteConfiguration {
val configuration = event!!.bean
configuration.igniteInstanceName = "instance-a"
return configuration
}
}
4.1 Configuring Ignite Cache
It is possible to configure multiple Ignite Caches.
ignite:
enabled: true
cache-configurations:
bank:
group-name: one
query-entities:
- table-name: "ACCOUNTS"
keyFieldName: ID
keyType: java.lang.Long
valueType: java.lang.Object
fields:
ID: java.lang.Long
amount: java.lang.Double
updateDate: java.util.Date
second:
group-name: two
Property | Type | Description |
---|---|---|
|
java.lang.Class |
|
|
java.lang.Class |
|
|
java.util.HashSet |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
org.apache.ignite.cache.eviction.EvictionPolicy |
|
|
boolean |
|
|
boolean |
|
|
int |
|
|
org.apache.ignite.cache.CacheWriteSynchronizationMode |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
int |
|
|
org.apache.ignite.cache.CacheMode |
|
|
org.apache.ignite.cache.CacheAtomicityMode |
|
|
int |
|
|
long |
|
|
boolean |
|
|
java.lang.String |
|
|
org.apache.ignite.cache.CacheRebalanceMode |
|
|
int |
|
|
int |
|
|
long |
|
|
int |
|
|
int |
|
|
boolean |
|
|
int |
|
|
long |
|
|
int |
|
|
int |
|
|
boolean |
|
|
int |
|
|
long |
|
|
long |
|
|
long |
|
|
int |
|
|
boolean |
|
|
boolean |
|
|
java.lang.Class[] |
|
|
long |
|
|
int |
|
|
java.lang.String |
|
|
boolean |
|
|
java.lang.Class[] |
|
|
org.apache.ignite.cache.PartitionLossPolicy |
|
|
java.util.Collection |
|
|
int |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
boolean |
|
|
org.apache.ignite.configuration.DiskPageCompression |
|
|
java.lang.Integer |
A factory can provide configurations that can’t ideally be configured from properties .
package io.micronaut.ignite.docs.config;
import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.ignite.annotation.IgnitePrimary;
import org.apache.ignite.configuration.CacheConfiguration;
@Factory
public class IgniteCacheConfigurationFactory {
@Bean
@IgnitePrimary
CacheConfiguration<String,String> cacheInstance() {
return new CacheConfiguration<String, String>("my-cache")
.setBackups(2);
}
}
package io.micronaut.ignite.docs.config
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.ignite.annotation.IgnitePrimary
import org.apache.ignite.configuration.CacheConfiguration
@Factory
class IgniteCacheConfigurationFactory {
@Bean
@IgnitePrimary
CacheConfiguration<String,String> cacheInstance() {
new CacheConfiguration<String, String>("my-cache")
.setBackups(2)
}
}
package io.micronaut.ignite.docs.config
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.ignite.annotation.IgnitePrimary
import org.apache.ignite.configuration.CacheConfiguration
@Factory
class IgniteCacheConfigurationFactory {
@Bean
@IgnitePrimary
fun cacheInstance(): CacheConfiguration<String, String>? {
return CacheConfiguration<String, String>("my-cache")
.setBackups(2)
}
}
4.2 Configuring Discovery SPI
Ignite nodes, can discover each other by using the TcpDiscoverySpi
. There are a couple configuration options supported by Ignite for Discovery.
Additional information can be found under TCP/IP Discovery.
Static IP Finder
The static-ip-finder.enabled
flag has to be true to use the static ip finder.
ignite:
enabled: true
discovery-spi:
static-ip-finder:
enabled: true
addresses:
- "127.0.0.1:47500"
- "127.0.0.1:47501"
Property | Type | Description |
---|---|---|
|
boolean |
vm ip finder is enabled. |
|
java.util.Collection |
|
|
boolean |
|
|
java.util.Collection |
Parses provided values and initializes the internal collection of addresses via {@link #setAddresses(Collection)}. |
Discovery Kubernetes
The kubernetes-ip-finder.enabled
flag has to be true to use kubernetes discovery.
ignite:
enabled: true
discovery-spi:
kubernetes-ip-finder:
enabled: true
Property | Type | Description |
---|---|---|
|
boolean |
Sets whether the DefaultTcpDiscoveryKubernetesIpFinder is enabled. |
|
boolean |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
5 Configuration Thin Client
ignite-thin-client:
enabled: true
addresses:
- "127.0.0.1:10800"
- "127.0.0.1:10801"
Property | Type | Description |
---|---|---|
|
boolean |
Sets whether the DefaultIgniteThinClientConfiguration is enabled. |
|
java.lang.String[] |
|
|
boolean |
|
|
int |
|
|
int |
|
|
int |
|
|
org.apache.ignite.client.SslMode |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
boolean |
|
|
org.apache.ignite.client.SslProtocol |
|
|
java.lang.String |
|
|
java.lang.String |
|
|
boolean |
|
|
long |
|
|
int |
|
|
org.apache.ignite.transactions.TransactionConcurrency |
|
|
org.apache.ignite.transactions.TransactionIsolation |
|
|
long |
6 Ignite Transaction
Ignite Transaction
A method call in micronaut can be wrapped with @IgniteTransaction
to ensure consistency.
For example the follow is an example case for @IgniteTransaction
:
package io.micronaut.ignite.docs.transaction;
import io.micronaut.ignite.annotation.IgniteTransaction;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
public class SampleIgniteTransaction {
private final Ignite ignite;
SampleIgniteTransaction(Ignite ignite) {
this.ignite = ignite;
}
@IgniteTransaction
public void method() {
IgniteCache cache = this.ignite.cache("sample");
cache.put("key", "value");
}
}
package io.micronaut.ignite.docs.transaction
import io.micronaut.ignite.annotation.IgniteTransaction
import org.apache.ignite.Ignite
import org.apache.ignite.IgniteCache
class SampleIgniteTransaction {
private final Ignite ignite
SampleIgniteTransaction(Ignite ignite) {
this.ignite = ignite
}
@IgniteTransaction
void method() {
IgniteCache cache = this.ignite.cache("sample")
cache.put("key", "value")
}
}
package io.micronaut.ignite.docs.transaction
import io.micronaut.ignite.annotation.IgniteTransaction
import org.apache.ignite.Ignite
import org.apache.ignite.IgniteCache
class SampleIgniteTransaction constructor(private val ignite: Ignite) {
@IgniteTransaction
fun method() {
val cache: IgniteCache<String, String> = ignite.cache("sample")
cache.put("key", "value")
}
}
7 Micronaut Cache
Micronaut Cache
To take advantage of Micronaut Cache, this can be enabled by including the following dependency:
implementation("io.micronaut.ignite:micronaut-ignite-cache")
<dependency>
<groupId>io.micronaut.ignite</groupId>
<artifactId>micronaut-ignite-cache</artifactId>
</dependency>
The primary bean from the Ignite instance is used for the cache configuration. The cacheName will reference the associated cache instance from ignite. More information about usage can be found Micronaut Cache.
8 Repository
You can find the source code of this project in this repository: