com.google.common.util.concurrent.ListenableFuture Scala Examples
The following examples show how to use com.google.common.util.concurrent.ListenableFuture.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: Writer.scala From eventuate with Apache License 2.0 | 5 votes |
package com.rbmhtechnology.example.querydb //#writer import java.lang.{ Long => JLong } import akka.actor.ActorRef import com.datastax.driver.core._ import com.rbmhtechnology.eventuate.EventsourcedWriter import scala.concurrent.Future override def readSuccess(result: Long): Option[Long] = Some(result + 1L) } object Writer { import java.util.concurrent.Executor import com.google.common.util.concurrent.ListenableFuture import scala.concurrent.{ ExecutionContext, Promise } import scala.language.implicitConversions import scala.util.Try implicit class ListenableFutureConverter[A](lf: ListenableFuture[A])(implicit executionContext: ExecutionContext) { def toFuture: Future[A] = { val promise = Promise[A] lf.addListener(new Runnable { def run() = promise.complete(Try(lf.get())) }, executionContext.asInstanceOf[Executor]) promise.future } } } //#
Example 2
Source File: package.scala From BusFloatingData with Apache License 2.0 | 5 votes |
package de.nierbeck.floating.data import com.google.common.util.concurrent.{FutureCallback, Futures, ListenableFuture} import de.nierbeck.floating.data.domain.{BoundingBox, LatLon} import scala.concurrent.{ExecutionContext, Future, Promise} import scala.util.{Failure, Success, Try} package object server { val Traversable = scala.collection.immutable.Traversable type Traversable[+A] = scala.collection.immutable.Traversable[A] val Iterable = scala.collection.immutable.Iterable type Iterable[+A] = scala.collection.immutable.Iterable[A] val Seq = scala.collection.immutable.Seq type Seq[+A] = scala.collection.immutable.Seq[A] val IndexedSeq = scala.collection.immutable.IndexedSeq type IndexedSeq[+A] = scala.collection.immutable.IndexedSeq[A] def futureToFutureTry[T](f: Future[T])(implicit ec: ExecutionContext): Future[Try[T]] = f.map(Success(_)).recover { case exception: Exception => Failure(exception) } implicit class RichListenableFuture[T](lf: ListenableFuture[T]) { def toFuture: Future[T] = { val p = Promise[T]() Futures.addCallback(lf, new FutureCallback[T] { def onFailure(t: Throwable): Unit = p failure t def onSuccess(result: T): Unit = p success result }) p.future } } def toBoundingBox(bbox: String): BoundingBox = { val bboxCoords: Array[String] = bbox.split(",") val boundingBox: BoundingBox = new BoundingBox(LatLon(bboxCoords(0).toFloat, bboxCoords(1).toFloat), LatLon(bboxCoords(2).toFloat, bboxCoords(3).toFloat)) boundingBox } }
Example 3
Source File: AsyncGuavaTests.scala From freestyle with Apache License 2.0 | 5 votes |
package freestyle.async package guava import java.util.concurrent.{Callable, Executors} import com.google.common.util.concurrent.{ListenableFuture, ListeningExecutorService, MoreExecutors} import org.scalatest._ import scala.concurrent.duration.Duration import scala.concurrent.{Await, ExecutionContext} class AsyncGuavaTests extends WordSpec with Matchers with Implicits { import ExecutionContext.Implicits.global import implicits._ val exception: Throwable = new RuntimeException("Test exception") val service: ListeningExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)) def failedFuture[T]: ListenableFuture[T] = service.submit(new Callable[T] { override def call(): T = throw exception }) def successfulFuture[T](value: T): ListenableFuture[T] = service.submit(new Callable[T] { override def call(): T = value }) val foo = "Bar" "Guava ListenableFuture Freestyle integration" should { "transform guava ListenableFutures into scala.concurrent.Future successfully" in { Await.result(listenableFuture2Async(successfulFuture(foo)), Duration.Inf) shouldBe foo } "recover from failed guava ListenableFutures wrapping them into scala.concurrent.Future" in { Await.result(listenableFuture2Async(failedFuture[String]).failed, Duration.Inf) shouldBe exception } "transform guava ListenableFuture[Void] into scala.concurrent.Future successfully through an implicit conversion" in { Await.result( listenableFuture2Async(listenableVoidToListenableUnit(successfulFuture[Void](None.orNull))), Duration.Inf) shouldBe ((): Unit) } "recover from failed guava ListenableFuture[Void] wrapping them into scala.concurrent.Future through an implicit conversion" in { Await.result( listenableFuture2Async(listenableVoidToListenableUnit(failedFuture[Void])).failed, Duration.Inf) shouldBe exception } } }
Example 4
Source File: FutureConversions.scala From quill with Apache License 2.0 | 5 votes |
package io.getquill.context.cassandra.util import java.util.concurrent.Executor import com.google.common.util.concurrent.ListenableFuture import scala.concurrent.{ ExecutionContext, Future, Promise } import scala.util.Try object FutureConversions { implicit class ListenableFutureConverter[A](val lf: ListenableFuture[A]) extends AnyVal { def asScala(implicit ec: ExecutionContext): Future[A] = { val promise = Promise[A] lf.addListener(new Runnable { def run(): Unit = { promise.complete(Try(lf.get())) () } }, ec.asInstanceOf[Executor]) promise.future } def asScalaWithDefaultGlobal: Future[A] = { import scala.concurrent.ExecutionContext.Implicits.global asScala(global) } } }
Example 5
Source File: TestKinesisProducerClient.scala From fs2-aws with MIT License | 5 votes |
package fs2.aws.testkit import java.nio.ByteBuffer import cats.effect.Sync import cats.effect.concurrent.Ref import com.amazonaws.services.kinesis.producer.{ Attempt, UserRecordResult } import com.google.common.util.concurrent.{ ListenableFuture, SettableFuture } import fs2.aws.internal.KinesisProducerClient import cats.implicits._ import io.circe.Decoder import io.circe.jawn.CirceSupportParser import scala.collection.JavaConverters._ case class TestKinesisProducerClient[F[_], T](state: Ref[F, List[T]])( implicit decoder: Decoder[T] ) extends KinesisProducerClient[F] { override def putData( streamName: String, partitionKey: String, data: ByteBuffer )(implicit F: Sync[F]): F[ListenableFuture[UserRecordResult]] = for { t <- CirceSupportParser .parseFromByteBuffer(data) .toEither .flatMap(_.as[T]) .liftTo[F] _ <- state.modify(orig => (t :: orig, orig)) res = { val future: SettableFuture[UserRecordResult] = SettableFuture.create() future.set(new UserRecordResult(List[Attempt]().asJava, "seq #", "shard #", true)) future } } yield res }
Example 6
Source File: KinesisProducerClient.scala From fs2-aws with MIT License | 5 votes |
package fs2.aws.internal import java.nio.ByteBuffer import cats.effect.Sync import com.amazonaws.auth.{ AWSCredentialsProviderChain, DefaultAWSCredentialsProviderChain } import com.amazonaws.services.kinesis.producer.{ KinesisProducer, KinesisProducerConfiguration, UserRecordResult } import com.google.common.util.concurrent.ListenableFuture trait KinesisProducerClient[F[_]] { def putData(streamName: String, partitionKey: String, data: ByteBuffer)( implicit F: Sync[F] ): F[ListenableFuture[UserRecordResult]] } class KinesisProducerClientImpl[F[_]] extends KinesisProducerClient[F] { val credentials: AWSCredentialsProviderChain = new DefaultAWSCredentialsProviderChain() val region: Option[String] = None private lazy val config: KinesisProducerConfiguration = { val c = new KinesisProducerConfiguration() .setCredentialsProvider(credentials) region.map(r => c.setRegion(r)) c } private lazy val client = new KinesisProducer(config) override def putData(streamName: String, partitionKey: String, data: ByteBuffer)( implicit F: Sync[F] ): F[ListenableFuture[UserRecordResult]] = F.delay(client.addUserRecord(streamName, partitionKey, data)) }
Example 7
Source File: TestKinesisProducerClient.scala From fs2-aws with MIT License | 5 votes |
package fs2.aws import java.nio.ByteBuffer import cats.effect.Sync import com.amazonaws.services.kinesis.producer.UserRecordResult import com.google.common.util.concurrent.ListenableFuture import fs2.aws.internal.KinesisProducerClient import fs2.aws.utils.KinesisStub case class TestKinesisProducerClient[F[_]]( respondWith: UserRecordResult, ops: F[ListenableFuture[UserRecordResult]] ) extends KinesisProducerClient[F] { override def putData(streamName: String, partitionKey: String, data: ByteBuffer)( implicit e: Sync[F] ): F[ListenableFuture[UserRecordResult]] = { KinesisStub.save(data) ops } }
Example 8
Source File: GrpcMonix.scala From grpcmonix with MIT License | 5 votes |
package grpcmonix import com.google.common.util.concurrent.ListenableFuture import io.grpc.stub.StreamObserver import monix.eval.{Callback, Task} import monix.execution.Ack.{Continue, Stop} import monix.execution.{Ack, Scheduler} import monix.reactive.Observable import monix.reactive.observables.ObservableLike.{Operator, Transformer} import monix.reactive.observers.Subscriber import monix.reactive.subjects.PublishSubject import org.reactivestreams.{Subscriber => SubscriberR} import scalapb.grpc.Grpc import scala.concurrent.Future object GrpcMonix { type GrpcOperator[I, O] = StreamObserver[O] => StreamObserver[I] def guavaFutureToMonixTask[T](future: ListenableFuture[T]): Task[T] = Task.deferFuture { Grpc.guavaFuture2ScalaFuture(future) } def grpcOperatorToMonixOperator[I,O](grpcOperator: GrpcOperator[I,O]): Operator[I,O] = { outputSubsriber: Subscriber[O] => val outputObserver: StreamObserver[O] = monixSubscriberToGrpcObserver(outputSubsriber) val inputObserver: StreamObserver[I] = grpcOperator(outputObserver) grpcObserverToMonixSubscriber(inputObserver, outputSubsriber.scheduler) } def monixSubscriberToGrpcObserver[T](subscriber: Subscriber[T]): StreamObserver[T] = new StreamObserver[T] { override def onError(t: Throwable): Unit = subscriber.onError(t) override def onCompleted(): Unit = subscriber.onComplete() override def onNext(value: T): Unit = subscriber.onNext(value) } def reactiveSubscriberToGrpcObserver[T](subscriber: SubscriberR[_ >: T]): StreamObserver[T] = new StreamObserver[T] { override def onError(t: Throwable): Unit = subscriber.onError(t) override def onCompleted(): Unit = subscriber.onComplete() override def onNext(value: T): Unit = subscriber.onNext(value) } def grpcObserverToMonixSubscriber[T](observer: StreamObserver[T], s: Scheduler): Subscriber[T] = new Subscriber[T] { override implicit def scheduler: Scheduler = s override def onError(t: Throwable): Unit = observer.onError(t) override def onComplete(): Unit = observer.onCompleted() override def onNext(value: T): Future[Ack] = try { observer.onNext(value) Continue } catch { case t: Throwable => observer.onError(t) Stop } } def grpcObserverToMonixCallback[T](observer: StreamObserver[T]): Callback[T] = new Callback[T] { override def onError(t: Throwable): Unit = observer.onError(t) override def onSuccess(value: T): Unit = { observer.onNext(value) observer.onCompleted() } } def liftByGrpcOperator[I, O](observable: Observable[I], operator: GrpcOperator[I, O]): Observable[O] = observable.liftByOperator( grpcOperatorToMonixOperator(operator) ) def unliftByTransformer[I, O](transformer: Transformer[I, O], subscriber: Subscriber[O]): Subscriber[I] = new Subscriber[I] { private[this] val subject = PublishSubject[I]() subject.transform(transformer).subscribe(subscriber) override implicit def scheduler: Scheduler = subscriber.scheduler override def onError(t: Throwable): Unit = subject.onError(t) override def onComplete(): Unit = subject.onComplete() override def onNext(value: I): Future[Ack] = subject.onNext(value) } }
Example 9
Source File: JavaConverters.scala From troy with Apache License 2.0 | 5 votes |
package troy package driver import com.google.common.util.concurrent.{ FutureCallback, Futures, ListenableFuture } import scala.concurrent.{ Future, Promise } object JavaConverters { // http://stackoverflow.com/a/19528638/234998 implicit class RichListenableFuture[T](lf: ListenableFuture[T]) { def asScala: Future[T] = { val p = Promise[T]() Futures.addCallback(lf, new FutureCallback[T] { def onFailure(t: Throwable): Unit = p failure t def onSuccess(result: T): Unit = p success result }) p.future } } }
Example 10
Source File: ScalaKinesisProducer.scala From kpl-scala with Apache License 2.0 | 5 votes |
package com.contxt.kinesis import com.amazonaws.services.kinesis.producer.{ KinesisProducer, KinesisProducerConfiguration, UserRecordResult } import com.google.common.util.concurrent.ListenableFuture import com.typesafe.config.{ Config, ConfigFactory } import java.nio.ByteBuffer import scala.concurrent._ import scala.language.implicitConversions import scala.util.Try import collection.JavaConverters._ import scala.concurrent.ExecutionContext.Implicits.global def shutdown(): Future[Unit] } object ScalaKinesisProducer { def apply( streamName: String, kplConfig: KinesisProducerConfiguration, config: Config = ConfigFactory.load() ): ScalaKinesisProducer = { val producerStats = ProducerStats.getInstance(config) ScalaKinesisProducer(streamName, kplConfig, producerStats) } def apply( streamName: String, kplConfig: KinesisProducerConfiguration, producerStats: ProducerStats ): ScalaKinesisProducer = { val streamId = StreamId(kplConfig.getRegion, streamName) val producer = new KinesisProducer(kplConfig) new ScalaKinesisProducerImpl(streamId, producer, producerStats) } private[kinesis] implicit def listenableToScalaFuture[A](listenable: ListenableFuture[A]): Future[A] = { val promise = Promise[A] val callback = new Runnable { override def run(): Unit = promise.tryComplete(Try(listenable.get())) } listenable.addListener(callback, ExecutionContext.global) promise.future } } private[kinesis] class ScalaKinesisProducerImpl( val streamId: StreamId, private val producer: KinesisProducer, private val stats: ProducerStats ) extends ScalaKinesisProducer { import ScalaKinesisProducer.listenableToScalaFuture stats.reportInitialization(streamId) def send(partitionKey: String, data: ByteBuffer, explicitHashKey: Option[String]): Future[UserRecordResult] = { stats.trackSend(streamId, data.remaining) { producer.addUserRecord(streamId.streamName, partitionKey, explicitHashKey.orNull, data).map { result => if (!result.isSuccessful) throwSendFailedException(result) else result } } } def shutdown(): Future[Unit] = shutdownOnce private lazy val shutdownOnce: Future[Unit] = { val allFlushedFuture = flushAll() val shutdownPromise = Promise[Unit] allFlushedFuture.onComplete { _ => shutdownPromise.completeWith(destroyProducer()) } val combinedFuture = allFlushedFuture.zip(shutdownPromise.future).map(_ => ()) combinedFuture.onComplete(_ => stats.reportShutdown(streamId)) combinedFuture } private def throwSendFailedException(result: UserRecordResult): Nothing = { val attemptCount = result.getAttempts.size val errorMessage = result.getAttempts.asScala.lastOption.map(_.getErrorMessage) throw new RuntimeException( s"Sending a record to $streamId failed after $attemptCount attempts, last error message: $errorMessage." ) } private def flushAll(): Future[Unit] = { Future { blocking { producer.flushSync() } } } private def destroyProducer(): Future[Unit] = { Future { blocking { producer.destroy() } } } }
Example 11
Source File: BigtableDoFnTest.scala From scio with Apache License 2.0 | 5 votes |
package com.spotify.scio.bigtable import java.util.concurrent.ConcurrentLinkedQueue import com.google.cloud.bigtable.grpc.BigtableSession import com.google.common.cache.{Cache, CacheBuilder} import com.google.common.util.concurrent.{Futures, ListenableFuture} import com.spotify.scio.testing._ import com.spotify.scio.transforms.BaseAsyncLookupDoFn.CacheSupplier import scala.jdk.CollectionConverters._ import scala.util.{Failure, Success} class BigtableDoFnTest extends PipelineSpec { "BigtableDoFn" should "work" in { val fn = new TestBigtableDoFn val output = runWithData(1 to 10)(_.parDo(fn)) .map(kv => (kv.getKey, kv.getValue.get())) output should contain theSameElementsAs (1 to 10).map(x => (x, x.toString)) } it should "work with cache" in { val fn = new TestCachingBigtableDoFn val output = runWithData((1 to 10) ++ (6 to 15))(_.parDo(fn)) .map(kv => (kv.getKey, kv.getValue.get())) output should contain theSameElementsAs ((1 to 10) ++ (6 to 15)).map(x => (x, x.toString)) BigtableDoFnTest.queue.asScala.toSet should contain theSameElementsAs (1 to 15) BigtableDoFnTest.queue.size() should be <= 20 } it should "work with failures" in { val fn = new TestFailingBigtableDoFn val output = runWithData(1 to 10)(_.parDo(fn)).map { kv => val r = kv.getValue.asScala match { case Success(v) => v case Failure(e) => e.getMessage } (kv.getKey, r) } output should contain theSameElementsAs (1 to 10).map { x => val prefix = if (x % 2 == 0) "success" else "failure" (x, prefix + x.toString) } } } object BigtableDoFnTest { val queue: ConcurrentLinkedQueue[Int] = new ConcurrentLinkedQueue[Int]() } class TestBigtableDoFn extends BigtableDoFn[Int, String](null) { override def newClient(): BigtableSession = null override def asyncLookup(session: BigtableSession, input: Int): ListenableFuture[String] = Futures.immediateFuture(input.toString) } class TestCachingBigtableDoFn extends BigtableDoFn[Int, String](null, 100, new TestCacheSupplier) { override def newClient(): BigtableSession = null override def asyncLookup(session: BigtableSession, input: Int): ListenableFuture[String] = { BigtableDoFnTest.queue.add(input) Futures.immediateFuture(input.toString) } } class TestFailingBigtableDoFn extends BigtableDoFn[Int, String](null) { override def newClient(): BigtableSession = null override def asyncLookup(session: BigtableSession, input: Int): ListenableFuture[String] = if (input % 2 == 0) { Futures.immediateFuture("success" + input) } else { Futures.immediateFailedFuture(new RuntimeException("failure" + input)) } } class TestCacheSupplier extends CacheSupplier[Int, String, java.lang.Long] { override def createCache(): Cache[java.lang.Long, String] = CacheBuilder.newBuilder().build[java.lang.Long, String]() override def getKey(input: Int): java.lang.Long = input.toLong }