Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发送到Kinesis时未执行Scala期货(Amazon AWS)_Scala_Amazon Web Services_Concurrency_Future_Amazon Kinesis - Fatal编程技术网

发送到Kinesis时未执行Scala期货(Amazon AWS)

发送到Kinesis时未执行Scala期货(Amazon AWS),scala,amazon-web-services,concurrency,future,amazon-kinesis,Scala,Amazon Web Services,Concurrency,Future,Amazon Kinesis,我正在尝试使用Scala Futures将消息异步写入Amazon Kinesis,以便能够加载测试应用程序 这段代码可以工作,我可以看到数据沿着管道向下移动,以及输出打印到控制台 import com.amazonaws.services.kinesis.AmazonKinesisClient import java.nio.CharBuffer import java.nio.charset.Charset import java.text.SimpleDateFormat import j

我正在尝试使用Scala Futures将消息异步写入Amazon Kinesis,以便能够加载测试应用程序

这段代码可以工作,我可以看到数据沿着管道向下移动,以及输出打印到控制台

import com.amazonaws.services.kinesis.AmazonKinesisClient
import java.nio.CharBuffer
import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.{Date, TimeZone}    

object KinesisDummyDataProducer extends App {

  val kinesis = new AmazonKinesisClient(PipelineConfig.awsCredentials)
  println("Connected")

  lazy val encoder = Charset.forName("UTF-8").newEncoder()
  lazy val tz = TimeZone.getTimeZone("UTC")
  lazy val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z")
  df.setTimeZone(tz)

  (1 to args(0).toInt).map(int => send(int)).map(msg => println(msg))

  private def send(int: Int) = {
    val msg = "{\"event_name\":\"test\",\"timestamp\":\"%s\",\"int\":%s}".format(df.format(new Date()), int.toString)
    val bytes = encoder.encode(CharBuffer.wrap(msg))
    encoder.flush(bytes)
    kinesis.putRecord("PrimaryEventStream", bytes, "123")
    msg
  }
}
这段代码适用于Scala Futures

import scala.concurrent.future
import scala.concurrent.ExecutionContext.Implicits.global

def doIt(x: Int) = {Thread.sleep(1000); x + 1}
(1 to 10).map(x => future{doIt(x)}).map(y => y.onSuccess({case x => println(x)}))
您将注意到,序列映射的语法几乎相同。但是,以下操作不起作用,即它既不打印到控制台,也不向我的管道发送数据

import com.amazonaws.services.kinesis.AmazonKinesisClient
import java.nio.CharBuffer
import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.{Date, TimeZone}
import scala.concurrent.future
import scala.concurrent.ExecutionContext.Implicits.global


object KinesisDummyDataProducer extends App {

  val kinesis = new AmazonKinesisClient(PipelineConfig.awsCredentials)
  println("Connected")

  lazy val encoder = Charset.forName("UTF-8").newEncoder()
  lazy val tz = TimeZone.getTimeZone("UTC")
  lazy val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z")
  df.setTimeZone(tz)

  (1 to args(0).toInt).map(int => future {send(int)}).map(f => f.onSuccess({case msg => println(msg)}))

  private def send(int: Int) = {
    val msg = "{\"event_name\":\"test\",\"timestamp\":\"%s\",\"int\":%s}".format(df.format(new Date()), int.toString)
    val bytes = encoder.encode(CharBuffer.wrap(msg))
    encoder.flush(bytes)
    kinesis.putRecord("PrimaryEventStream", bytes, "123")
    msg
  }
}
关于这个项目的更多说明。我正在使用Maven从命令行进行构建,并且从命令行运行上面的所有代码非常有效


我的问题是:为什么使用相同的语法时,我的函数“send”似乎没有执行?

可能的重复不会出现重复,因为在将来包装整个函数,然后调用:f.onSuccess{case x=>printlnsucture};wait.readyf,Duration.Inf;不会像其他解决方案那样解决它。但是,如果这样做,您的应用程序仍然可能在打印成功的回调有机会执行之前退出。尝试调用Await.result,然后在同一线程中依次调用println。如果成功被打印出来,你就知道未来成功地完成了。如果你有一个错误,你会看到堆栈跟踪,最后如果未来从未完成,你的应用程序将挂起。还要注意的是,你在一个地图中产生了几个未来。结果你会得到一个期货集合,它本身并不是未来。为了能够等待所有futures完成,您首先需要在单个future中转换期货集合,这可以使用future.sequence完成。将其包装为:val aggregateFuture=Future.sequence1到args0.toInt.mapint=>Future{sendint};等待结果聚合未来;印刷成功