gpt4 book ai didi

java - Akka 及其错误内核

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:13 25 4
gpt4 key购买 nike

我正在阅读 Akka(Java lib)文档,需要澄清一些他们自己宣称的 Akka/Actor Best Practices .

Actors should not block (i.e. passively wait while occupying a Thread) on some external entity...The blocking operations should be done in some special-cased thread which sends messages to the actors which shall act on them.

那么在 Akka/Java 中,这样的代码示例是什么样的?如果Actor 不是放置必须 阻止的代码的适当位置,那么所做的 满足“某些特殊情况”的定义线程”?

Do not pass mutable objects between actors. In order to ensure that, prefer immutable messages.

我熟悉如何创建不可变类(没有公共(public) setter 、没有公共(public)字段、使类成为 final 等)。但是 Akka 有自己的“不可变类”定义吗?如果有,它是什么?

Top-level actors are the innermost part of your Error Kernel...

我什至不知道这是什么意思!我理解他们所说的“顶级” Actor ( Actor /经理/主管层次结构中的最高层)是什么意思,但什么是“错误内核”,它与 Actor 有何关系?

最佳答案

我只能回答第一个问题(以后,请在帖子中只提出一个问题)。例如,考虑一个固有阻塞的数据库连接。为了允许参与者连接到数据库,程序员应该创建一个带有数据库请求队列的专用线程(或线程池)。请求包含数据库语句和对接收结果的参与者的引用。专用线程在循环中读取请求、访问数据库、将结果发送到引用的 actor 等。请求队列阻塞 - 当没有请求时,连接线程在 queue.take() 操作。

因此,对数据库的访问分为两个参与者 - 一个向队列发出请求,另一个处理结果。

更新:Java 代码草图(我不擅长 Scala)。

class Request {
String query;
ActorRef handler;
}

class DatabaseConnector implements Runnable {
LinkedBlockingQueue<Request> queue=new LinkedBlockingQueue<Request>();
Thread t = new Thread(this);
{t.start();}

public void sendRequest(Request r) {
queue.put(r);
}

public void run() {
for (;;) {
Request r=queue.take();
ResultSet res=doBlockingCallToJdbc(r.query);
r.handler.sendOneWay(res);
}
}

关于java - Akka 及其错误内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com