Java and Python are both excellent tools, and even though programmers usually like nothing better
than debating which language, framework, or editor is best, that is not the goal of this post. Each
language has strengths and weaknesses, but what I consider interesting is that Java and Python
complement each other so well. However, systems using multiple languages face increased
complexity in deployment, maintenance, testing, integration, and interoperability.
This post aims to answer two main questions through a set of practical hands-on
experiments.
Continue reading →
SDKMAN! is as powerful tool to install and manage software development kits (SDKs) and tools, like Java, Groovy, Gradle, Maven, Spring Boot and Quarkus. If you want to see if a new version of a SDK or tool is available, you can use the sdk upgrade
command. This command will list all outdated SDKs and tools. The installed version and the latest version are shown for each SDK and tool. To see if a single SDK or tool is outdated, you can use the name of the SDK or tool as argument to the sdk upgrade
command.
Continue reading →
In production the log level should be INFO. However, in many cases it is set to DEBUG because otherwise critical message are missed.
This is unfortunate, because it usually leads to a lot of log file pollution.
And it should not have been needed, had the developers followed the following rules.
Continue reading →
When you enable the /observe
endpoints you can configure them to be served on a different port than the application. By default the endpoints are available on the same port as the application. But you can define an extra named socket with another port number in the configuration of the WebServer
instance. And in the configuration of the ObserveFeature
instance you can define the socket name that should be used for the observe endpoints.
Continue reading →
In a previous post you learned how to add information to the /observe/info
endpoint. You can also add Git information to the endpoint. For example you can add the Git commit id so you can see check, when the application is running in a production environment, which Git commit for the code was deployed. In order to achieve this you must first generate a properties file with all Git information. The next step is to process this file in your Helidon SE application and add the properties to the /observe/info
endpoint.
Continue reading →
It is possible to add an endpoint to Helidon SE that can show information about the application. You can add custom information to this endpoint. In order to enable the endpoint you need to add the dependency io.helidon.webserver.observe:helidon-webserver-observe-info
to your pom.xml
file. This will add the endpoint /observe/info
to your application. You can add key-value pairs to your configuration or code that will be exposed in the endpoint.
Continue reading →
You can configure a memory health check in Helidon SE. A memory health check will return a status of UP
if the memory usage is below a certain threshold percentage and DOWN
if the memory usage is above the threshold percentage. The default threshold percentage is 98%
. To add the memory health check you need to add the dependency io.helidon.health:helidon-health-checks
to your pom.xml
file. This dependency contains three health checks: disk space usage, memory usage and dead lock detection.
To configure the memory health check you need to set the configuration property server.features.observe.observers.health.helidon.health.memory.thresholdPercent
to the threshold percentage. Alternatively you can set the threshold percentage in your application code.
Continue reading →
Suppose you want to return a response based on the Accept
header of the request. If the Accept
header is application/json
you want to return a JSON response and if the Accept
header is application/xml
you want to return an XML response. You can use the isAccepted(MediaType)
of the ServerRequestHeaders
class to check if the value of the request header Accept
is equal to the specified media type. The method returns true
if the media type is defined for the request header Accept
and false
if not.
In order to convert an object to XML you need to add the dependency com.fasterxml.jackson.dataformat:jackson-dataformat-xml
to your pom.xml
file:
Continue reading →
You can write an implementation of the interface EnvironmentPostProcessor
to customize the Environment
of a Spring Boot application. For example you can read an external configuration file and add its properties to the Environment
. If you want to add some logging statement to the class then you need to make sure you pass a DeferredLogFactory
to the constructor of the class. From this factory you can use the getLogger
method to get a Log
instance. This is needed, because the implementation of the interface EnvironmentPostProcessor
is created before the logging system is initialized. By using the Log
instances created from DeferredLogFactory
Spring Boot will make sure the log messages are written when the logging system is initialized.
Continue reading →
In Helidon SE you can enable a health check for the disk space usage. If the disk space usage is above a certain threshold then the health check will fail. To enable the disk space health check you need to add the dependency io.helidon.health:helidon-health-checks
to your pom.xml
file. The dependency contains three health checks: disk space usage, memory usage and dead lock detection.
To configure the disk space health check you need to set the configuration property server.features.observe.observers.health.helidon.health.diskSpace.thresholdPercent
to the threshold percentage. Or programmatically set the value in your application code. The default value is 99.999
, which means that in real life the health check will not fail. You need to set a lower percentage in order to see the health check fail. For example when you set the value to 95.0
then the health check will fail when the disk space usage is above 95% or less than 5% of the disk space is available. You can also configure the path to check for disk space usage. The default path is the current working directory, but it can be set to another path. You need to set the configuration property server.features.observe.observers.health.helidon.health.diskSpace.path
to change the path.
Continue reading →