Connection

A connection to Apache Pulsar is an expensive operation, reason why it is recommended to create a single instance per application.

The main constructor returns a cats.effect.Resource, and is defined as follows.

import cats.effect._
import dev.profunktor.pulsar.Config.PulsarURL
import dev.profunktor.pulsar.Pulsar.Settings

import org.apache.pulsar.client.api.{ PulsarClient => Underlying }

type T = Underlying

def make[F[_]: Sync](
    url: PulsarURL,
    settings: Settings = Settings()
): Resource[F, T] = ???

A PulsarURL can only be built using smart builders, as shown in the next section.

Configuration

A default configuration is usually enough to get started locally.

import dev.profunktor.pulsar.Config

val config = Config.Builder.default

It sets tenant=public, namespace=default, and url=pulsar://localhost:6650. If would like to change any of these values, you can use the configuration builder. E.g.

val custom: Config =
  Config.Builder
    .withTenant("custom")
    .withNameSpace("services")
    .withURL("pulsar://custom.net:6650")
    .build

Pulsar client

Once we have a configuration, we can proceed with the creation of a Pulsar client, necessary to create consumers, producers, and so on.

import dev.profunktor.pulsar._

Pulsar.make[IO](config.url)

Connection settings

Via the second constructor argument, we can set a few client options, such as timeouts.

import scala.concurrent.duration._

val settings =
  Settings()
    .withConnectionTimeout(45.seconds)
    .withOperationTimeout(30.minutes)
    .withTransactions

Pulsar.make[IO](config.url, settings)

To learn more about transactions, check out the Transactions section.