发送到Kinesis时未执行Scala期货(Amazon AWS)
我正在尝试使用Scala Futures将消息异步写入Amazon Kinesis,以便能够加载测试应用程序 这段代码可以工作,我可以看到数据沿着管道向下移动,以及输出打印到控制台发送到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
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};等待结果聚合未来;印刷成功