Akka 扩展
每个ActorSystem
只加载一次扩展,由 Akka 管理。你可以选择按需加载扩展,也可以通过 Akka 配置在ActorSystem
创建时加载扩展。有关如何实现这一点的详细信息,请参阅下面的“从配置中加载”部分。
- 警告:由于扩展是一种钩住 Akka 本身的方法,因此扩展的实现者需要确保其扩展的线程安全。
现在,让我们创建一个示例扩展,用于计算某些事情的发生次数。
首先,我们定义Extension
应该做什么:
然后,我们需要为扩展创建一个ExtensionId
,这样我们就可以获取它。
import akka.actor.*;
import java.util.concurrent.atomic.AtomicLong;
static class CountExtension extends AbstractExtensionId<CountExtensionImpl>
implements ExtensionIdProvider {
// This will be the identifier of our CountExtension
public static final CountExtension CountExtensionProvider = new CountExtension();
private CountExtension() {}
// so we return ourselves here, this allows us
// the ActorSystem starts up
public CountExtension lookup() {
return CountExtension.CountExtensionProvider; // The public static final
}
// This method will be called by Akka
// to instantiate our Extension
public CountExtensionImpl createExtension(ExtendedActorSystem system) {
return new CountExtensionImpl();
}
}
// typically you would use static import of the
// CountExtension.CountExtensionProvider field
CountExtension.CountExtensionProvider.get(system).increment();
或者从 Akka Actor 的内部:
就这些了!
为了能够从 Akka 的配置中加载扩展,必须在提供给ActorSystem
的配置的akka.extensions
部分中添加ExtensionId
或ExtensionIdProvider
实现的 FQCN。
extensions = ["docs.extension.ExtensionDocTest.CountExtension"]
}
一切都是可能的!顺便问一下,你知道 Akka Typed Actor、序列化和其他特性是作为 Akka 扩展实现的吗?
配置示例:
myapp {
db {
uri = "mongodb://example1.com:27017,example2.com:27017"
}
circuit-breaker {
timeout = 30 seconds
}
}
Extension
示例:
使用它:
static class MyActor extends AbstractActor {
// typically you would use static import of the Settings.SettingsProvider field
final SettingsImpl settings = Settings.SettingsProvider.get(getContext().getSystem());
Connection connection = connect(settings.DB_URI, settings.CIRCUIT_BREAKER_TIMEOUT);
}
第三方库可以通过将其附加到其reference.conf
中的akka.library-extensions
来注册它的扩展,以便在 Actor 系统启动时自动加载。
英文原文链接:Akka Extensions.