例:
import scala.actors._
import Actor._
class BalanceActor[T <: Actor] extends Actor {
val workers: Int = 10
private lazy val actors = new Array[T](workers)
override def start() = {
for (i <- 0 to (workers - 1)) {
// error below: classtype required but T found
actors(i) = new T
actors(i).start
}
super.start()
}
// error below: method mailboxSize cannot be accessed in T
def workerMailboxSizes: List[Int] = (actors map (_.mailboxSize)).toList
.
.
.
Run Code Online (Sandbox Code Playgroud)
注意第二个错误表明它知道actor项是"T",但不是"T"是actor的子类,而是在类通用定义中受到约束.
如何纠正此代码(使用Scala 2.8)?
在Finagle中使用的Netty使用"处理程序"管道来顺序处理和输出绑定数据.Netty示例和包含的库显示了用于诸如身份验证,协议编解码器和服务的实际业务逻辑之类的各种处理程序.
Finagle似乎采用了处理程序的概念,而是直接为API用户提供编解码器,过滤器和服务.虽然这些签名具有不同的签名,但Finagle的新用户仍然需要决定使用哪个来实现其整个服务器的每个部分.他们现在需要决定哪个部分应该是编解码器的一部分,而不是任何过滤器,而不是仅仅链接到链的末端的单一服务.总之,虽然Finagle是一个比Netty更高级别的库,并且应该使构建服务的任务更容易,但API用户可能有更多的选择.
将处理流的特定部分放入编解码器而不是过滤器与单一服务的关键决策点和优缺点是什么?如果管道有可能进一步扩展,那么服务逻辑是否应该放入过滤器中,而在管道末端使用"noop"服务?鉴于订购过滤器(作为管道中的处理程序)的灵活性,与一端的单一编解码器和另一端的服务相比,为什么"一切"都不应该是过滤器?
什么是(或)推荐的方法来实现Scala远程执行程序的安全性(允许与此actor对话的远程节点的身份验证,以及对讨论内容的加密)?有没有人这样做过; 它是如何运作的?
SSL ...
一些Java库......
一些JSR ......
自定义序列化...
只有VPN才能解决这个问题......
???
使用Scala的2.8 RC1或更高版本,什么是最好的(最简单的和/或最直接的)方法来"窥视"在演员的邮箱等邮件(来自同一个演员的行为()方法中),以检查是什么队列,无需以任何方式响应/接收消息和/或干扰邮箱的当前内容.
这样做的目的是,参与者可以通过首先确定是否有任何剩余的邮箱消息是必须处理的消息来确定是否可以安全地处理退出请求,而不是通过立即停止该动作来删除.
在https://github.com/magarciaEPFL/scaladotnet上阅读README,为简单的"Hello World"应用创建一个Windows exe:
package hello.world
object Main {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Run Code Online (Sandbox Code Playgroud)
使用自述文件中的命令构建.exe:
scalacompiler.exe ^
-d C:\test\bin ^
-target:exe ^
-Ystruct-dispatch:no-cache ^
-Xassem-name HelloWorld.exe ^
-Xassem-extdirs C:\scala.net ^
-Xshow-class hello.world.Main ^
C:\test\src\HelloWorld.scala
Run Code Online (Sandbox Code Playgroud)
在使用Windows 7 Pro,64位时,我在尝试运行时收到此错误:
C:\测试\ BIN> HelloWorld.exe的
未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'scalalib,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.该系统找不到指定的文件.在Main(String [] args)
Scala .Net编译器目录直接位于路径中,但似乎HelloWorld.exe无法找到并加载该目录中的scalalib.dll.根据下面的注释,将HelloWorld.exe直接复制到C:\ scala.net目录,然后从那里执行,按预期工作.但是,将.exe放在另一个目录中,而将C:\ scala.net目录作为PATH的一部分,则不会.
怎么了?
打电话给!! 即使在呼叫者收到回复之后,从一个演员到另一个演员的方法似乎也保持频道开放(即:未来准备就绪).
例如,使用!! 从一个演员发送11个不同的消息到另一个演员将导致在原始调用者的邮箱中显示类似于下面的11个消息,每个消息具有不同的Channel @ xxxx值.
!(scala.actors.Channel @ 11b456f,退出(com.test.app.actor.QueryActor @ 4f7bc2,"正常))
这些消息是否正在等待来自worker的回复,因为原始调用者在自己调用exit()时发出Exit消息,或者它们是否在另一端生成,并且出于某种原因,上面显示的是打印形式?到这时,工人演员已经退出了,所以原来的来电者!! 绝对不会收到任何回复.
这种行为是不可取的,因为原始调用actor的邮箱填充了这些退出消息(每次使用时为每个通道创建一个!!).
怎么能停止?原始呼叫者是否自动"链接"到每个创建的回复频道!! 呼叫?