Using Infinispan with Kotlin

What You Will Learn

How to use the Infinispan Hot Rod Java client from Kotlin, including basic cache operations and Protobuf serialization with @Proto annotations on Kotlin data classes.

Prerequisites

  • Java 17+

  • An Infinispan Server running on localhost:11222 (or Docker/Podman available for Testcontainers)

Start an Infinispan Server with Docker or Podman:

docker run -it --rm -p 11222:11222 -e USER=admin -e PASS=password quay.io/infinispan/server:latest
Tip
You can replace docker with podman in the command above if you use Podman.
Tip
If no server is running, the tutorial code automatically starts an Infinispan Server using Testcontainers.

Step 1: Add Kotlin and Infinispan Dependencies

Add the Kotlin standard library, Infinispan Hot Rod client, and Protostream dependencies to your pom.xml:

<dependency>
   <groupId>org.jetbrains.kotlin</groupId>
   <artifactId>kotlin-stdlib</artifactId>
   <version>${kotlin.version}</version>
</dependency>
<dependency>
   <groupId>org.infinispan</groupId>
   <artifactId>infinispan-client-hotrod</artifactId>
</dependency>
<dependency>
   <groupId>org.infinispan.protostream</groupId>
   <artifactId>protostream-processor</artifactId>
   <version>${version.protostream}</version>
</dependency>

Configure the Kotlin Maven plugin with kapt for annotation processing. See the pom.xml for the full build configuration.

Step 2: Define a Protobuf Entity in Kotlin

Use @Proto on a Kotlin data class. Fields must use @JvmField for Protostream compatibility:

@Proto
data class GreetingKotlin(@JvmField var name: String?=null,
                          @JvmField var greeting: String?=null)

Register the schema:

@ProtoSchema(includeClasses = [GreetingKotlin::class])
interface GreetingSchemaKotlin : GeneratedSchema

Step 3: Connect and Perform Cache Operations

Use the same TutorialsConnectorHelper from Kotlin:

object InfinispanKotlinExample {
    lateinit var cacheManager: RemoteCacheManager
    lateinit var cache: RemoteCache<String, String>

    @JvmStatic
    fun main(args: Array<String>) {
        connectToInfinispan()
        manipulateCache()
        disconnect()
    }

    fun manipulateCache() {
        // Store a value
        cache.put("key", "value")
        // Retrieve the value and print it out
        println("key = ${cache["key"]}")
    }

    fun connectToInfinispan() {
        // Connect to the server
        cacheManager = TutorialsConnectorHelper.connect()
        // Obtain the remote cache
        cache = cacheManager.getCache(TUTORIAL_CACHE_NAME)
    }

    fun disconnect() {
        // Stop the cache manager and release all resources
        TutorialsConnectorHelper.stop(cacheManager)
    }
}

Step 4: Run the Tutorial

mvn package exec:java

You should see output like:

key = value

What’s Next