我有一连串的TPL Dataflow块,并希望观察系统内部的进度。
我知道我可以将a TransformBlock
塞入要观察的网格中,将其发布到各种进度更新器中,然后将消息原封不动地返回到下一个块。我不喜欢这种解决方案,因为该块纯粹是因为它的副作用而存在,而且我还必须在我想观察的任何地方更改块链接逻辑。
因此,我想知道是否可以ISourceBlock<T>.AsObservable
用来观察网格内消息的传递而无需更改它,也无需消耗消息。如果可行的话,这似乎是一种更纯净,更实用的解决方案。
从我对Rx的(有限的)理解中,这意味着我需要可观察的对象是热的而不是冷的,以便我的progress
更新程序可以看到该消息但不使用它。并且.Publish().RefCount()
似乎是使可观察到的热点的方法。但是,它根本不起作用按预期-而不是要么block2
或progress
接收并消耗每条消息。
// Set up mesh
var block1 = new TransformBlock<int, int>(i => i + 20, new ExecutionDataflowBlockOptions() { BoundedCapacity = 1 });
var block2 = new ActionBlock<int>(i => Debug.Print("block2:" + i.ToString()), new ExecutionDataflowBlockOptions() { BoundedCapacity = 1 });
var obs = block1.AsObservable().Publish().RefCount(); // Declare this here just in case it makes a difference to do it before the LinkTo call. …
Run Code Online (Sandbox Code Playgroud) 从Java 9开始,直接从scala脚本使用时,从Scala中调用java.sql中定义的对象会抛出java.lang.SecurityException.
Java Version: 10.0.1
Scala Version: 2.12.4
sbt Version: 1.2.0
Run Code Online (Sandbox Code Playgroud)
下面的屏幕截图是一个完整的最小工作示例,其中包含适用于工作和非工作版本的控制台输出.具体来说:将脚本代码复制到类中,并从该类运行它,可以解决问题.有没有办法编写直接使用对象的Scala脚本java.sql
?
build.sbt
name := "mypackage"
version := "0.1"
scalaVersion := "2.12.4"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.4"
Run Code Online (Sandbox Code Playgroud)
broken-script.scala
import java.sql.{Connection, DriverManager}
import java.util.Properties
object Main {
private def url = "jdbc:postgresql://localhost:5432/postgres"
val credentials: Properties ={
val properties = new Properties()
properties.setProperty("user", "integration_test")
properties.setProperty("password", "integration-pass")
properties
}
def connect(): Connection =
DriverManager.getConnection(url, credentials)
def run(): Unit = {
connect()
}
}
Main.run()
Run Code Online (Sandbox Code Playgroud)
如下面的控制台输出所示,broken-script.scala
遇到SecurityException.
brokenScript.scala Output …