Set netty timeout options in Play
As you may or may not know, the Playframework runs on top of Netty. This means that when you're configuring the server aspects of your application, at some point you're going to want to set the options on Netty itself. The documentation for production configuration is fairly useful in this, providing a few examples of the properties you can set, and even detailing how to pass any option to the server underneath.
The one thing it doesn't do is tell you how to get the options to the
server in the first place. Unless you're in the business of passing along
options to your applications you might not realize that every new option
to netty needs to be passed on startup via a -D
parameter. Keeping track
of this is a pain, after all, what about when you have multiple environments
and you need to tweak each one?
While looking around, I found a smart guy who might not have read the documentation page I linked above. And this blog post goes out to him on a simpler way to set Netty options. First off you need to recognize two things.
-
Using the
dist
command will create a startup script -
Hidden in this startup script is a way to add configuration easily
If you look into the file named after your application in the dist's bin directory you'll find the following piece of bash script:
declare -r script_conf_file="/etc/default/yourappnamehere" ... # if configuration files exist, prepend their contents to $@ so it can be processed by this runner [[ -f "$script_conf_file" ]] && set -- $(loadConfigFile "$script_conf_file") "$@"
The loadConfigFile
is fairly simple:
# Loads a configuration file full of default command line options for this script. loadConfigFile() { cat "$1" | sed '/^\#/d' }
In essence, whatever you put into the config file will be appended to your
startup. So if you were to say, add -Dhttp.netty.option.child.connectTimeoutMillis=600000
you'd endup setting the timeout to 10 minutes for your netty server running
your play application. Useful right? If you're Yevgeniy Brikman this one line:
-Dhttp.netty.option.backlog
in an /etc/default/myapp
file would have saved you a lot of trouble.
Since play doesn't write the Netty configuration to a logfile for you
on startup, verifying that the settings are in place required me to
check the JVM itself. This was easily done by using VisualVM to connect
to my Docker container. If you want instructions on how to do that,
you can check my previous post here. Then check the ServerBootstrap
class instance on the heap and look in the options HashMap: