Akka 扩展

    每个ActorSystem只加载一次扩展,由 Akka 管理。你可以选择按需加载扩展,也可以通过 Akka 配置在ActorSystem创建时加载扩展。有关如何实现这一点的详细信息,请参阅下面的“从配置中加载”部分。

    • 警告:由于扩展是一种钩住 Akka 本身的方法,因此扩展的实现者需要确保其扩展的线程安全。

    现在,让我们创建一个示例扩展,用于计算某些事情的发生次数。

    首先,我们定义Extension应该做什么:

    然后,我们需要为扩展创建一个ExtensionId,这样我们就可以获取它。

    1. import akka.actor.*;
    2. import java.util.concurrent.atomic.AtomicLong;
    3. static class CountExtension extends AbstractExtensionId<CountExtensionImpl>
    4. implements ExtensionIdProvider {
    5. // This will be the identifier of our CountExtension
    6. public static final CountExtension CountExtensionProvider = new CountExtension();
    7. private CountExtension() {}
    8. // so we return ourselves here, this allows us
    9. // the ActorSystem starts up
    10. public CountExtension lookup() {
    11. return CountExtension.CountExtensionProvider; // The public static final
    12. }
    13. // This method will be called by Akka
    14. // to instantiate our Extension
    15. public CountExtensionImpl createExtension(ExtendedActorSystem system) {
    16. return new CountExtensionImpl();
    17. }
    18. }
    1. // typically you would use static import of the
    2. // CountExtension.CountExtensionProvider field
    3. CountExtension.CountExtensionProvider.get(system).increment();

    或者从 Akka Actor 的内部:

    就这些了!

    为了能够从 Akka 的配置中加载扩展,必须在提供给ActorSystem的配置的akka.extensions部分中添加ExtensionIdExtensionIdProvider实现的 FQCN。

    1. extensions = ["docs.extension.ExtensionDocTest.CountExtension"]
    2. }

    一切都是可能的!顺便问一下,你知道 Akka Typed Actor、序列化和其他特性是作为 Akka 扩展实现的吗?

    配置示例:

    1. myapp {
    2. db {
    3. uri = "mongodb://example1.com:27017,example2.com:27017"
    4. }
    5. circuit-breaker {
    6. timeout = 30 seconds
    7. }
    8. }

    Extension示例:

    使用它:

    1. static class MyActor extends AbstractActor {
    2. // typically you would use static import of the Settings.SettingsProvider field
    3. final SettingsImpl settings = Settings.SettingsProvider.get(getContext().getSystem());
    4. Connection connection = connect(settings.DB_URI, settings.CIRCUIT_BREAKER_TIMEOUT);
    5. }

    第三方库可以通过将其附加到其reference.conf中的akka.library-extensions来注册它的扩展,以便在 Actor 系统启动时自动加载。


    英文原文链接Akka Extensions.