LINUX.ORG.RU

История изменений

Исправление Legioner, (текущая версия) :

Я вот нынче helidon se пробую. И ты знаешь - офигенная штука. Вообще никакой магии, обычная жава. Вот мой main:

    public static void main(String[] args) {
        LogConfig.configureRuntime();
        log = Logger.getLogger(Main.class.getName());

        var config = Config.create();
        var appConfig = config.get("app");
        var serverConfig = config.get("server");

        var routing = Routing.builder()
                .register("/sync", new SyncService(appConfig))
                .build();

        var webServer = WebServer.builder(routing)
                .config(serverConfig)
                .build();

        webServer.start()
                .thenAccept(ws -> {
                    log.info("Web server is available at http://127.0.0.1:" + ws.port() + "/");
                    getRuntime().addShutdownHook(new Thread(() -> ws.shutdown().await()));
                })
                .exceptionallyAccept(e -> {
                    log.log(SEVERE, "Web server startup failed", e);
                });
    }

Вот мой хэндлер (кусок)


    @Override
    public void update(Routing.Rules rules) {
        rules.post("/{endpoint}/{service}", this::postHandler);
    }

    private void postHandler(ServerRequest request, ServerResponse response) {
        request.headers().contentType().ifPresent(contentType -> {
            if (!contentType.equals(APPLICATION_XML)) {
                throw new HttpException("Unsupported Media Type", UNSUPPORTED_MEDIA_TYPE_415);
            }
        });

        String endpoint = request.path().param("endpoint");
        String service = request.path().param("service");

        EndpointData endpointData = appConfig.get("endpoint." + endpoint).as(EndpointData::fromConfig).orElseThrow(() ->
                new HttpException("endpoint", BAD_REQUEST_400));
        ServiceData serviceData = appConfig.get("service." + service).as(ServiceData::fromConfig).orElseThrow(() ->
                new HttpException("service", BAD_REQUEST_400));

        request.content().as(byte[].class)
                .onError(response::send)
                .flatMapSingle(body -> processRequest(endpointData, serviceData, body))
                .forSingle(responseBody -> {
                    response.headers().contentType(APPLICATION_XML);
                    response.send(responseBody);
                });
    }

Один минус - асинхронное дерьмо. Но с этим ещё долго жить. Впрочем в спринг его тоже умудряются протащить. В остальном только плюсы. Стартует моментально. Память жрёт умеренно, в JVM режиме пустой сервер я запустил на -Xmx6m. В теории компилируется граалем. Под капотом netty, то бишь работает настолько быстро, насколько только возможно. Сам проект самый, что ни на есть, обычный и скучный мавен. Там какие-то плагины есть, но что они делают, я до сих пор не понимаю, по-моему ничего не делают. Единственное - я не по их quickstart-у делал, а ручками, но это мелочи.

Мне пока очень даже нравится. Все строительные блоки есть. Да, там где у спринга будет аннотация, тут я руками две строчки напишу, но мне это больше по душе.

Тут даже модули прописаны у всех библиотек. Я впечатлился и в своё приложение тоже module-info.java добавил, прикольно, никогда так не делал.

Исправление Legioner, :

Я вот нынче helidon se пробую. И ты знаешь - офигенная штука. Вообще никакой магии, обычная жава. Вот мой main:

    public static void main(String[] args) {
        LogConfig.configureRuntime();
        log = Logger.getLogger(Main.class.getName());

        var config = Config.create();
        var appConfig = config.get("app");
        var serverConfig = config.get("server");

        var routing = Routing.builder()
                .register("/sync", new SyncService(appConfig))
                .build();

        var webServer = WebServer.builder(routing)
                .config(serverConfig)
                .build();

        webServer.start()
                .thenAccept(ws -> {
                    log.info("Web server is available at http://127.0.0.1:" + ws.port() + "/");
                    getRuntime().addShutdownHook(new Thread(() -> ws.shutdown().await()));
                })
                .exceptionallyAccept(e -> {
                    log.log(SEVERE, "Web server startup failed", e);
                });
    }

Вот мой хэндлер (кусок)


    @Override
    public void update(Routing.Rules rules) {
        rules.post("/{endpoint}/{service}", this::postHandler);
    }

    private void postHandler(ServerRequest request, ServerResponse response) {
        request.headers().contentType().ifPresent(contentType -> {
            if (!contentType.equals(APPLICATION_XML)) {
                throw new HttpException("Unsupported Media Type", UNSUPPORTED_MEDIA_TYPE_415);
            }
        });

        String endpoint = request.path().param("endpoint");
        String service = request.path().param("service");

        EndpointData endpointData = appConfig.get("endpoint." + endpoint).as(EndpointData::fromConfig).orElseThrow(() ->
                new HttpException("endpoint", BAD_REQUEST_400));
        ServiceData serviceData = appConfig.get("service." + service).as(ServiceData::fromConfig).orElseThrow(() ->
                new HttpException("service", BAD_REQUEST_400));

        request.content().as(byte[].class)
                .onError(response::send)
                .flatMapSingle(body -> processRequest(endpointData, serviceData, body))
                .forSingle(responseBody -> {
                    response.headers().contentType(APPLICATION_XML);
                    response.send(responseBody);
                });
    }

Один минус - асинхронное дерьмо. Но с этим ещё долго жить. Впрочем в спринг его тоже умудряются протащить. В остальном только плюсы. Стартует моментально. Память жрёт умеренно, в JVM режиме пустой сервер я запустил на -Xmx6m. В теории компилируется граалем. Под капотом netty, то бишь работает настолько быстро, насколько только возможно. Сам проект самый, что ни на есть, обычный и скучный мавен. Там какие-то плагины есть, но что они делают, я до сих пор не понимаю, по-моему ничего не делают. Единственное - я не по их quickstart-у делал, а ручками, но это мелочи.

Мне пока очень даже нравится. Все строительные блоки есть. Да, там где у спринга будет аннотация, тут я руками две строчки напишу, но мне это больше по душе.

Исправление Legioner, :

Я вот нынче helidon se пробую. И ты знаешь - офигенная штука. Вообще никакой магии, обычная жава. Вот мой main:

    public static void main(String[] args) {
        LogConfig.configureRuntime();
        log = Logger.getLogger(Main.class.getName());

        var config = Config.create();
        var appConfig = config.get("app");
        var serverConfig = config.get("server");

        var routing = Routing.builder()
                .register("/sync", new SyncService(appConfig))
                .build();

        var webServer = WebServer.builder(routing)
                .config(serverConfig)
                .build();

        webServer.start()
                .thenAccept(ws -> {
                    log.info("Web server is available at http://127.0.0.1:" + ws.port() + "/");
                    getRuntime().addShutdownHook(new Thread(() -> ws.shutdown().await()));
                })
                .exceptionallyAccept(e -> {
                    log.log(SEVERE, "Web server startup failed", e);
                });
    }

Вот мой хэндлер (кусок)


    @Override
    public void update(Routing.Rules rules) {
        rules.post("/{endpoint}/{service}", this::postHandler);
    }

    private void postHandler(ServerRequest request, ServerResponse response) {
        request.headers().contentType().ifPresent(contentType -> {
            if (!contentType.equals(APPLICATION_XML)) {
                throw new HttpException("Unsupported Media Type", UNSUPPORTED_MEDIA_TYPE_415);
            }
        });

        String endpoint = request.path().param("endpoint");
        String service = request.path().param("service");

        EndpointData endpointData = appConfig.get("endpoint." + endpoint).as(EndpointData::fromConfig).orElseThrow(() ->
                new HttpException("endpoint", BAD_REQUEST_400));
        ServiceData serviceData = appConfig.get("service." + service).as(ServiceData::fromConfig).orElseThrow(() ->
                new HttpException("service", BAD_REQUEST_400));

        request.content().as(byte[].class)
                .onError(response::send)
                .flatMapSingle(body -> processRequest(endpointData, serviceData, body))
                .forSingle(responseBody -> {
                    response.headers().contentType(APPLICATION_XML);
                    response.send(responseBody);
                });
    }

Один минус - асинхронное дерьмо. Но с этим ещё долго жить. Впрочем в спринг его тоже умудряются протащить. В остальном только плюсы. Стартует моментально. Память жрёт умеренно, в JVM режиме пустой сервер я запустил на -Xmx6m. В теории компилируется граалем. Сам проект самый, что ни на есть, обычный и скучный мавен. Там какие-то плагины есть, но что они делают, я до сих пор не понимаю, по-моему ничего не делают. Единственное - я не по их quickstart-у делал, а ручками, но это мелочи.

Мне пока очень даже нравится. Все строительные блоки есть. Да, там где у спринга будет аннотация, тут я руками две строчки напишу, но мне это больше по душе.

Исходная версия Legioner, :

Я вот нынче helidon se пробую. И ты знаешь - офигенная штука. Вообще никакой магии, обычная жава. Вот мой main:

    public static void main(String[] args) {
        LogConfig.configureRuntime();
        log = Logger.getLogger(Main.class.getName());

        var config = Config.create();
        var appConfig = config.get("app");
        var serverConfig = config.get("server");

        var routing = Routing.builder()
                .register("/sync", new SyncService(appConfig))
                .build();

        var webServer = WebServer.builder(routing)
                .config(serverConfig)
                .build();

        webServer.start()
                .thenAccept(ws -> {
                    log.info("Web server is available at http://127.0.0.1:" + ws.port() + "/");
                    getRuntime().addShutdownHook(new Thread(() -> ws.shutdown().await()));
                })
                .exceptionallyAccept(e -> {
                    log.log(SEVERE, "Web server startup failed", e);
                });
    }

Вот мой хэндлер (кусок)


    @Override
    public void update(Routing.Rules rules) {
        rules.post("/{endpoint}/{service}", this::postHandler);
    }

    private void postHandler(ServerRequest request, ServerResponse response) {
        request.headers().contentType().ifPresent(contentType -> {
            if (!contentType.equals(APPLICATION_XML)) {
                throw new HttpException("Unsupported Media Type", UNSUPPORTED_MEDIA_TYPE_415);
            }
        });

        String endpoint = request.path().param("endpoint");
        String service = request.path().param("service");

        EndpointData endpointData = appConfig.get("endpoint." + endpoint).as(EndpointData::fromConfig).orElseThrow(() ->
                new HttpException("endpoint", BAD_REQUEST_400));
        ServiceData serviceData = appConfig.get("service." + service).as(ServiceData::fromConfig).orElseThrow(() ->
                new HttpException("service", BAD_REQUEST_400));

        request.content().as(byte[].class)
                .onError(response::send)
                .flatMapSingle(body -> processRequest(endpointData, serviceData, body))
                .forSingle(responseBody -> {
                    response.headers().contentType(APPLICATION_XML);
                    response.send(responseBody);
                });
    }

Один минус - асинхронное дерьмо. Но с этим ещё долго жить. Впрочем в спринг его тоже умудряются протащить. В остальном только плюсы. Стартует моментально. В теории компилируется граалем. Сам проект самый, что ни на есть, обычный и скучный мавен. Там какие-то плагины есть, но что они делают, я до сих пор не понимаю, по-моему ничего не делают. Единственное - я не по их quickstart-у делал, а ручками, но это мелочи.

Мне пока очень даже нравится. Все строительные блоки есть. Да, там где у спринга будет аннотация, тут я руками две строчки напишу, но мне это больше по душе.