All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sksamuel.pulsar4s.Reader.scala Maven / Gradle / Ivy

package com.sksamuel.pulsar4s

import java.io.Closeable
import java.util.concurrent.TimeUnit

import scala.concurrent.duration.Duration
import scala.language.higherKinds

trait Reader[T] extends Closeable {
  def hasMessageAvailable: Boolean
  def topic: Topic
  def next: ConsumerMessage[T]
  def next(duration: Duration): Option[ConsumerMessage[T]]
  def nextAsync[F[_] : AsyncHandler]: F[ConsumerMessage[T]]
  def closeAsync[F[_] : AsyncHandler]: F[Unit]
  def hasReachedEndOfTopic: Boolean
}

class DefaultReader[T](reader: org.apache.pulsar.client.api.Reader[T],
                       override val topic: Topic) extends Reader[T] {

  override def hasMessageAvailable: Boolean = reader.hasMessageAvailable

  override def next: ConsumerMessage[T] = ConsumerMessage.fromJava(reader.readNext)

  override def next(duration: Duration): Option[ConsumerMessage[T]] =
    Option(reader.readNext(duration.toSeconds.toInt, TimeUnit.SECONDS)).map(ConsumerMessage.fromJava)

  override def nextAsync[F[_] : AsyncHandler]: F[ConsumerMessage[T]] = implicitly[AsyncHandler[F]].nextAsync(reader)

  override def close(): Unit = reader.close()
  override def closeAsync[F[_] : AsyncHandler]: F[Unit] = implicitly[AsyncHandler[F]].close(reader)

  /**
    * Returns true if the topic was terminated and this reader
    * has reached the end of the topic.
    */
  override def hasReachedEndOfTopic: Boolean = reader.hasReachedEndOfTopic

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy