我在使用时使用resourceGeneratorssbt键来复制fastOptJs生成的.js文件products,如下所示:
(resourceGenerators in Compile) <+=
(fastOptJS in Compile in frontend, packageScalaJSLauncher in Compile in frontend, packageJSDependencies in Compile in frontend)
.map((f1, f2, f3) => {
Seq(f1.data, f2.data, f3)
})
Run Code Online (Sandbox Code Playgroud)
在sbt中运行以下命令,我可以看到生成文件的路径:
> show frontend/fastOptJS
[info] Attributed(/some/path/frontend/target/scala-2.11/frontend-fastopt.js)
[success] Total time: 0 s, completed Mar 12, 2016 1:59:22 PM
Run Code Online (Sandbox Code Playgroud)
同样,我可以很容易地看到Scala.js生成的启动器结束的位置:
> show frontend/packageScalaJSLauncher
[info] Attributed(/some/path/frontend/target/scala-2.11/frontend-launcher.js)
[success] Total time: 0 s, completed Mar 12, 2016 2:00:10 PM
Run Code Online (Sandbox Code Playgroud)
但是,我无法找到指向.js.map文件位置的任务/密钥.我试着查看插件来源,但找不到它.有没有办法在不诉诸创建手动映射的情况下做到这一点build.sbt?
我正在编写一个 Splittable DoFn 来读取 MongoDB 更改流。它允许我观察描述集合更改的事件,并且只要 oplog 有足够的历史记录,我就可以在我想要的任意集群时间戳处开始读取。集群时间戳是自纪元以来的秒数与给定秒内操作的序列号相结合。
我看过 SDF 的其他示例,但到目前为止我所看到的所有示例都假设有一个“可查找”数据源(Kafka 主题分区、Parquet/Avro 文件等)
MongoDB 公开的接口是一个简单的 Iterable,因此我无法真正seek获得精确的偏移量(除了在时间戳之后开始获取新的 Iterable 之外),并且它生成的事件只有集群时间戳 - 同样,没有与输出关联的精确偏移量元素。
为了配置 SDF,我使用以下类作为输入元素类型:
public static class StreamConfig implements Serializable {
public final String databaseName;
public final String collectionName;
public final Instant startFrom;
...
}
Run Code Online (Sandbox Code Playgroud)
作为限制,我使用的是OffsetRange因为我可以将这些时间戳转换为长值并返回。对于偏移跟踪器,我选择了 GrowableOffsetRangeTracker,因为它可以处理潜在的无限范围。
我在提出范围结束估计器时遇到了问题 - 最后我假设now()将是最大潜在时间戳,因为我们可以读取流的最快速度是实时的。
@GetInitialRestriction
public OffsetRange getInitialRestriction(@Element StreamConfig element) {
final int fromEpochSecond =
(int) (Optional.ofNullable(element.startFrom).orElse(Instant.now()).getMillis() / 1000);
final BsonTimestamp bsonTimestamp = new BsonTimestamp(fromEpochSecond, 0);
return new OffsetRange(bsonTimestamp.getValue(), Long.MAX_VALUE); …Run Code Online (Sandbox Code Playgroud) 我有一个密封的案例类家族,它指定了一些规则,这些规则是从外部源反序列化的.我还有一个类型类,有几个实例来执行实际逻辑,如下所示:
import scala.util.Try
sealed trait ReaderConfig
case class Substring(begin: Int, end: Int) extends ReaderConfig
case class Regex(expr: String) extends ReaderConfig
trait Read[M[_], RC <: ReaderConfig] {
def apply(config: RC, raw: String): M[String]
}
object Read {
implicit val TryReadSubstring: Read[Try, Substring] = (config: Substring, raw: String) => Try {
raw.substring(config.begin, config.end)
}
implicit val TryReadRegex: Read[Try, Regex] = (config: Regex, raw: String) => Try {
config.expr.r.findFirstIn(raw).get
}
trait Helper[RC <: ReaderConfig] {
def as[M[_]](implicit read: Read[M, RC]): M[String]
}
def …Run Code Online (Sandbox Code Playgroud)