我正在 Scala 中编写递归重试函数,我想知道将来的创建是否存在运行时错误。如果有,则重试未来的实例化。
想象一下我有一个数据库查询功能:
dbLookup(userId : UserId) : Option[UserName] = ???
Run Code Online (Sandbox Code Playgroud)
重试看起来像这样:
retry[T](f : () => Future[Option[T]],
notifyFailure : (t : Throwable) => Unit,
n : Int) : Future[Option[T]] = {
if(n <= 0) { Future{None} }
else {
val fut = f()
if(f.resultsInException) { //I don't know how to write this
notifyFailure(f.exception)
retry(f, notifyFailure, n-1) //try again
}
else {
f.originalValueAsFuture
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何实现这个未来的功能并允许尾递归优化?
如果在我尝试创建 Future 时执行上下文不断抛出异常,则此函数可用于为用户重试数据库 10 次:
val userNameAfterRetries =
retry(() => Future{dbLookup("1234")},
(t) => system …
Run Code Online (Sandbox Code Playgroud) 我如何scala.concurrent.Duration
在一些 Java/Scala 时间表示中添加一个以获取未来/过去的时间?
我真的很喜欢 Scala 如何Duration
为整数添加方法(例如10 seconds
),所以我正在尝试做一些以下形式的事情:
import java.time.LocalDateTime
val futurePoint: LocalDateTime = LocalDateTime.now + (10 Seconds)
Run Code Online (Sandbox Code Playgroud)
我不想使用本答案中建议的其他库,我试图坚持使用 Java/Scala 语言库。
我有一个使用Akka的系统,它目前通过消息队列处理传入的流数据.当记录到达时,它被处理,mq被激活并且记录被传递以在系统内进一步处理.
现在我想添加对使用DB作为输入的支持.
什么是输入源能够处理数据库的方法(应该以接收器可以处理的速度输入> 100M记录 - 所以我假设反应/ akka-streams?)?
在Scala中,我有一个表单的字符串
val str = "[ab][bc][cd][dx][42]"
Run Code Online (Sandbox Code Playgroud)
什么是Scala中最有效的方法,正则表达式利用或以其他方式将该字符串拆分Seq[String]
为以下格式:
("ab","bc","cd","dx","42")
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试创建一个非常简单的 JavaFX TableView:1 列字符串。我有一个我想可视化的数组:
String[] acronyms = {"Foo", "Bar"};
Run Code Online (Sandbox Code Playgroud)
该文档假定某种数据类型来填充多个列(例如 Person、Book 等)。我会比那更“你好世界”:只显示一个字符串数组。
使用场景构建器,我创建了一个带有表和列的 fxml 文件:
<TableView fx:id="clientAcronymTable" prefHeight="200.0" prefWidth="200.0">
<columns>
<TableColumn fx:id="clientAcronymColumn" prefWidth="199.0" text="Client Acronyms" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
Run Code Online (Sandbox Code Playgroud)
然后我将这些元素“连线”到我的控制器中:
@FXML private TableView<String> clientAcronymTable;
@FXML private TableColumn<ObservableList<String>, String> clientAcronymColumn;
Run Code Online (Sandbox Code Playgroud)
在我的Initializable::initialize
方法中,我有:
clientAcronymTable.setItems(FXCollections.observableList(acronyms));
Run Code Online (Sandbox Code Playgroud)
但是,GUI 中没有出现任何字符串。我知道发生了一些事情,因为列中显示了可见的行行,但它们都是空的。
当然还有类似的问题并不真正适用:
所以,我的问题是:
如何使我的 Array 中的字符串在 TableView 中可见?
如何使单列可编辑,以便用户可以添加更多字符串?
预先感谢您的考虑和回应。
我正在使用json4s库将scala case类转换为json消息.我的case类依赖于第三方java枚举类型:
//third party java code
public enum Fruit {
Banana (1),
Cherry (2);
}
Run Code Online (Sandbox Code Playgroud)
然后我的scala类使用此枚举作为参数:
case class Order(fruit : Fruit, quantity : Int)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用EnumNameSerializer
`org.json4s.ext'库提供的:
import org.json4s._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{write, read}
import org.json4s.ext.EnumNameSerializer
case class Order(fruit : Fruit, quantity : Int) {
implicit lazy val formats =
DefaultFormats + new EnumNameSerializer(fruit)
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个编译时错误:
错误:推断类型参数[Fruit]不符合类EnumNameSerializer的类型参数bounds [E <:Enumeration]
如何将java枚举转换为json4s的EnumNameSerializer的scala Enumeration?
我希望避免编写自定义序列化程序,因为我的实际用例涉及我的case类中使用的许多不同的java枚举类型,因此我将不得不编写许多不同的自定义序列化程序.
提前感谢您的考虑和回应.
我正在尝试使用流而不是纯粹的actor来处理http请求,我带来了以下代码:
trait ImagesRoute {
val log = LoggerFactory.getLogger(this.getClass)
implicit def actorRefFactory: ActorRefFactory
implicit def materializer: ActorMaterializer
val source =
Source
.actorRef[Image](Int.MaxValue, OverflowStrategy.fail)
.via(Flow[Image].mapAsync(1)(ImageRepository.add))
.toMat(Sink.asPublisher(true))(Keep.both)
val route = {
pathPrefix("images") {
pathEnd {
post {
entity(as[Image]) { image =>
val (ref, publisher) = source.run()
val addFuture = Source.fromPublisher(publisher)
val future = addFuture.runWith(Sink.head[Option[Image]])
ref ! image
onComplete(future.mapTo[Option[Image]]) {
case Success(img) =>
complete(Created, img)
case Failure(e) =>
log.error("Error adding image resource", e)
complete(InternalServerError, e.getMessage)
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是正确的方法,或者即使这是一个很好的方法,或者如果我应该使用actor与路径交互,使用ask模式然后在actor内部,流式传输所有内容.
有任何想法吗?
是否有与该mapAsync()
方法等效的方法,但适用于filter
?
这是使用伪代码的示例:
val filter: T => Future[Boolean] = /.../
source.filter(filter).runWith(/.../)
^^^^^^
Run Code Online (Sandbox Code Playgroud)
谢谢
我编写了一个生成元组列表的DAML模型,例如[(Int, Text)]
.我通过DA Ledger API接收这些数据 - 如何将其转换为List<Pair<Long, String>>
Java?
我正在编写一些示例来理解 akka 流和背压。我正在尝试了解缓慢的消费者背压对 AkkaPublisher 有何影响
我的代码如下。
class DataPublisher extends ActorPublisher[Int] {
import akka.stream.actor.ActorPublisherMessage._
var items: List[Int] = List.empty
def receive = {
case s: String =>
println(s"Producer buffer size ${items.size}")
if (totalDemand == 0)
items = items :+ s.toInt
else
onNext(s.toInt)
case Request(demand) =>
if (demand > items.size) {
items foreach (onNext)
items = List.empty
}
else {
val (send, keep) = items.splitAt(demand.toInt)
items = keep
send foreach (onNext)
}
case other =>
println(s"got other $other")
}
}
Run Code Online (Sandbox Code Playgroud)
和
Source.fromPublisher(ActorPublisher[Int](dataPublisherRef)).runWith(sink) …
Run Code Online (Sandbox Code Playgroud) scala reactive-programming akka reactive-streams akka-stream
在Scala中,如何akka.util.ByteString
将a转换为java.io.InputStream
?
我尝试了以下方法:
val byteStringToInputStream : ByteString => InputStream =
byteStr => new ByteArrayInputStream(byteStr.asByteBuffer.array()))
Run Code Online (Sandbox Code Playgroud)
但这导致抛出异常
java.nio.ByteBuffer.array中的java.nio.ReadOnlyBufferException(ByteBuffer.java:996)
预先感谢您的考虑和回应。
我正在跟踪scala对象序列化的基本示例。但是,运行以下单元测试时
package mytest
import java.io.{ByteArrayOutputStream, ObjectOutputStream}
import org.scalatest.{Matchers, WordSpec}
class BasicSerializationSpec extends WordSpec with Matchers {
@SerialVersionUID(123L)
class TestRecord(var content: String) extends Serializable {
override def toString = s"TestRecord($content)"
}
"A TestRecord" should {
"be serializable" in {
val oo = new ObjectOutputStream(new ByteArrayOutputStream())
val tr = new TestRecord("42")
oo.writeObject(tr)
oo.close
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
org.scalatest.Assertions $ AssertionsHelper java.io.NotSerializableException:在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)在java.io.ObjectOutputStream。 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)的writeSerialData(ObjectOutputStream.java:1509)java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)的java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java) :1548)at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)at java .io。mytest.BasicSerializationSpec。$ anonfun $ new $ 2(BasicSerializationSpec.scala:20)的ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
我试图明确设置类型
val tr : java.io.Serializable …
Run Code Online (Sandbox Code Playgroud)