私は現在、Scalaで使用するロギングメカニズムに取り組んでいますが、予期しない問題が発生し、実際に作業できなくなりました。機能をテストするために、簡単なメッセージパッシングリングを設定することを検討しています。リング内では、各ノードはScalaアクターの拡張であり、そのすぐ隣(前/次)を認識しています。
リングの構築は次のように行われ、パラメーター「ノード」はコントローラーアクターから渡されます。
def buildRing(nodes:Array[Actor]){
var spliceArr:Array[Actor] = new Array[Actor](2)
spliceArr(0) = nodes(nodes.length-1)
spliceArr(1) = nodes(1)
nodes(0) ! spliceArr
Thread.sleep(100)
spliceArr(0) = nodes(nodes.length-2)
spliceArr(1) = nodes(0)
nodes(nodes.length-1) ! spliceArr
Thread.sleep(100)
for(i <-1 to numNodes-2){
spliceArr(0) = nodes(i-1)
spliceArr(1) = nodes(i+1)
nodes(i) ! spliceArr
Thread.sleep(100)
}
}
これは私が望むように機能しているように見え、各ノードは正しいネイバーのペアを受け取ります。ノードクラスには、次のように設定されたサイズ2の配列があります。
class node(locLogger:logger,nid:Int,boss:Actor) extends Actor{
val ringNeighbors:Array[Actor] = new Array[Actor](2)
def act{
locLogger.start
loop{
receive{
case n:Array[Actor] =>
ringNeighbors(0) = n(0)
ringNeighbors(1) = n(1)
すべてが順調ですが、(ノード0から)リングの周りに渡されるメッセージを導入すると、すべてのノードがそのringNeighbors配列に同じ値を持っていることがわかりました。これらの値は、ringBuilder(つまりノード8のネイバー)関数のループの最後の反復と一致しています。追加のメッセージパッシングは発生しないため、ノード配列内のインスタンスごとに、したがってリングごとにこれらの値がどのように変更されたかがわかりません。
私はまだScalaのロープを学んでおり、誤って単純なものを見落としていないことを願っています。