История изменений
Исправление
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-у делал, а ручками, но это мелочи.
Мне пока очень даже нравится. Все строительные блоки есть. Да, там где у спринга будет аннотация, тут я руками две строчки напишу, но мне это больше по душе.