5

我开发了一个基于 Akka 的服务器,并且喜欢微内核的想法。但是,当我查看使用 Java 和 Maven 的实现细节时,我正在使用一个简单的 Java 主启动类来换取一个特定于框架的解决方案,该解决方案承诺我不需要编写启动脚本,最后我发现它需要:

  • 安装了 Akka(否则我可以在没有安装 Akka 的情况下仅使用库来工作)
  • 我需要两个额外的 Maven 相关更改和一个额外的装配工件
  • 我还需要一个“开始”脚本,那有什么意义呢?

也许我错过了什么?但与普通的旧 Java 主要解决方案相比,我没有看到任何更简单的设置或优势。

更新:得到答案后想得更多。用微内核编写你的主类可能仍然是一个很好的例子,以便将来可以通过 Akka 控制台启动它,例如

public class MapReduceServer implements Bootable {
    //---------------------------------------------------------------
    // public
    //---------------------------------------------------------------
    /**
     * Default constructor simply initializes the system.
     */
    public MapReduceServer() {
        system = ActorSystem.create("MapReduceApp", ConfigFactory.
                load().getConfig("MapReduceApp"));
    }

    //---------------------------------------------------------------
    /**
     * {@inheritDoc}
     */
    @Override
    public void startup() {
        // create the list of reduce Actors
        ActorRef reduceActor = system.actorOf(Props.create(ReduceActor.class)
                .withRouter(new FromConfig()), "reduceActor");

        // create the list of map Actors
        ActorRef mapActor = system.actorOf(Props.create(MapActor.class, reduceActor).
                withRouter(new FromConfig()), "mapActor");

        // create the overall Master Actor that acts as the remote actor for clients
        @SuppressWarnings("unused")
        ActorRef masterActor = system.actorOf(
                Props.create(MapReduceMasterActor.class, mapActor), "masterActor");
    }

    //---------------------------------------------------------------
    /**
     * {@inheritDoc}
     */
    @Override
    public void shutdown() {
        system.shutdown();
    }

    //---------------------------------------------------------------
    /**
     * Main method
     *
     * @param args
     */
    public static void main(String[] args) {
        MapReduceServer mapReduceServer = null;

        LOGGER.info("starting ...");
        mapReduceServer = new MapReduceServer();
        mapReduceServer.startup();
        LOGGER.info("done");
    }
4

2 回答 2

8

使用 sbt 时,微内核作为一种打包机制可以很方便,但对于 Maven 用户,我同意它不会增加任何价值。我认为您应该使用主类并以 Maven 方式打包您的应用程序。

于 2013-06-27T13:18:55.247 回答
0

至少微内核为您保存了关闭挂钩的定义(处理 CTRL-C)。在普通的主要方法中,这是您关心的问题。当然,这里没有什么特别或花哨的。

于 2017-03-27T07:56:27.087 回答