退出演员没有错误消息

时间:2012-05-17 21:57:59

标签: scala actor

这是我正在开发的聊天中的一个问题。 主要方法有一个main / gui对象,一个发送消息的Actor发送者和一个接收它们的empfänger。 问题是使empfänger使用main / gui对象的函数来显示传入的消息。因为它不起作用,我简化了它,但我仍然没有解决问题。 可能有人告诉我为什么这在终点站什么都不返回? 我做错了什么?

import scala.actors._
object main_object {
    def infoterm(msg: String) = {
        println(msg)
    }
    def main(args: Array[String]) = {
    println("hallo")
    empfänger ! "foo"


    }
}


object empfänger extends Actor{
    var port = 50042
    var name = "local"
    var continuevar = true
    def foo(in: String) = {
        println("foo-empfänger" + in)
    }
    def act() {
        println("ydfjskj")
        test2.infoterm("tut")
        println("Empfänger gestartet")
        while(continuevar) {
            react {
                case msg:String  => {
                    println("empfänger" + msg)
                    test2.infoterm(msg)
                    foo("empfänger" + msg)
                }
            }
        }
    }
}

谢谢你的帮助,但我仍然没有继续。 我像你告诉我的那样进行了修改,但它仍然没有用。

只有通过定义Actorempfänger,整个程序才会停止工作,如下所示:

import scala.actors._
object test2 {
    def infoterm(msg: String) = {
        println(msg)
    }
    def main(args: Array[String]) = {
    println("hallo")
    }
}

object empfänger extends Actor{
    def act() {
        // test2.infoterm("tut")
        // println("Empfänger gestartet")
        loop {
            react {
                case msg:String  => {
                    if(msg == "Stop") exit()
                    else {
                    println("empfänger" + msg)
                    // test2.infoterm(msg)
                    }
                }
            }
        }
    }
}

我做错了什么?

3 个答案:

答案 0 :(得分:1)

在接收事件时循环的演员有两种方式:

  1. 而-接收
  2. 环反应
  3. 您正在使用两者的混合物(即同时反应)。由于以下原因,这根本不起作用:

    接收

    接收阻止当前执行线程等待消息处理。它可以在while循环中使用;虽然你很少使用它,因为它将一个actor绑定到一个线程 - 即它不可伸缩,因为你每个actor使用1个线程。

    反应

    请注意,react方法的签名表示其返回类型为Nothing。这意味着方法无法正常终止;它必须永远不会返回或抛出异常。实际上后者发生了;它使用异常作为流控制机制,只有在react内使用loop时才会起作用(假设您要继续处理事件)。因此,您的act方法应该如下所示:

    def act() {
      loop {
        react {
          case msg: String => 
        }
      }
    }
    

    值得一看的是演员源代码,看看异常流控制是如何工作的,因为它是一件美丽的东西。

    错误消息:链接演员

    这是我为actor框架所做的努力。如果一个actor的反应抛出一个异常,那么这个actor会退出,并且没有记录这个是sys-out或sys-err是很常见的。这可能非常令人沮丧。

    我强烈建议将 canary 演员链接到每个系统角色,以便按以下方式侦听退出:

    def act() {
      import Actor._
      self link actor {
        case Exit(from, msg) => /* your logging here */
      }
      loop { ...
      }  
     }
    }
    

    但是,在您的情况下不起作用(再次,非常令人沮丧),因为您的整个act方法会抛出异常。

答案 1 :(得分:0)

你在act方法中使用了while循环。当接收到消息时,该actor以异步方式工作并被激活。使用loop {}代替while,它应该有效。要停止演员,您必须向'stop发送消息,并使用actexit方法中对其做出反应。

答案 2 :(得分:0)

演员没有自动启动,这将是一件坏事。你必须明确地调用'start'方法,即你的main()empänger.start()