提问人:Dionysis Nt. 提问时间:5/30/2020 最后编辑:Mario GalicDionysis Nt. 更新时间:5/30/2020 访问量:63
akka Actor 中的可变集合返回 NullPointerException
Mutable collections in akka Actor return NullPointerException
问:
我有一个参与者,每次它收到来自 Web 套接字的更新时,它都会调用 websocket 并更新地图。执行组件在命令中的另一个点使用相同的地图。
class MyActor(broker: InMemoryBroker) extends Actor {
val myMap: TrieMap[String, String] = new TrieMap[String, String]()
//Gets a response every 1 second
webSocket.get(onReponse= r=> myMap(r.key) = r.value)
def receive()={
case MyCommand(key)=>
if(myMap.get(key).isDefined){ //Null pointer exception is thrown here
//Do stuff
}
}
我期望线程安全并且没有此类问题。有什么建议吗?TrieMap
答:
4赞
Tim
5/30/2020
#1
您应该在该方法中进行尽可能多的处理。因此,与其直接更新地图,不如给自己发送一条消息,并在收到地图时更新地图:receive
onResponse
class MyActor(broker: InMemoryBroker) extends Actor {
val myMap: TrieMap[String, String] = new TrieMap[String, String]()
private case class UpdateMap(r: ???)
//Gets a response every 1 second
webSocket.get(onReponse = r => self ! UpdateMap(r))
def receive() = {
case UpdateMap(r) =>
myMap(r.key) = r.value
case MyCommand(key) =>
if (myMap.get(key).isDefined) { //Null pointer exception is thrown here
//Do stuff
}
}
}
使用该方法,一次只能从单个线程访问。TrieMap
此外,该测试最好按以下方式完成:
myMap.get(key).foreach{ value =>
???
}
评论