For this, we will reuse the code and artifacts of the Fractals sample, since it already implements JPPF tasks for the Mandelbrot computations, along with the code to submit the corresponding JPPF jobs. The movie file itself is created using the Monte Media Library.
Additionally, we will also generate a specific node distribution, with the following extensions and customizations:
- the node will run in offline mode: it will disconnect from the server to execute the job, then reconnect to send the results back
- the node will run in idle mode: it will start when the computer is idle (no user activity) and stop when the user wakes it up
- it will embed a modified version of the JPPF default screensaver, which will display a preview of the image being computed by the node. This relies on task notifications emitted for each point of the image. The screen saver will look like this screenshot.
- Since the node is offline, and to reduce network traffic, all required libraries and classes will be part of the node's local classpath
For information on how to set up a server, please refer to the JPPF documentation.
Once you have a server running, you can build the node distribution by typing ant build from a command or shell prompt.
This will produce two files "JPPF-node.zip" and "JPPF-node.tar.gz". Use the file appropriate for the platform where the node is deployed (the .tar.gz includes execute permission for the startNode.sh script).
If you wish to modify the node settings before this, you can edit the configuration files in FractalMovieGenerator/config/node.
once you have a node running, you can launch the sample by typing:
<run> -i data/mandelbrot.csv -o data/mandelbrot.avi -f 30 -t 30
where <run> is replaced with "run.bat" on Windows platforms or "./run.sh" on Linux/Unix platforms.
The command lines arguments can be obtained by typing <run> -h
, which displays:
usage: Windows: run.bat [option, ...] Linux: ./run.sh [option, ...] There are two possible sets of options: 1. <run_cmd> -h|? display this screen and exit 2. <run_cmd> -i <input_file> -o <output_file> -f <frame_rate> -t <trans_time> where: input_file: a csv record file produced by the mandelbrot fractal sample output_file: path to the generated movie file the .avi extension is added if needed frame_rate: number of frames per second trans_time: the duration (in seconds) of a transition between 2 records in the input file note: the total number of frames in the generated movie is equal to (nb_input_records-1) * frame_rate * trans_time
It is also possible to specify how many jobs can be sent concurrently by the application, by setting the following in config/jppf.properties:
# max number of jobs that can be concurrently submitted # if > 1, it also requires setting a connection pool jppf.fractals.concurrent.jobs = 4
This mechanism limits the memory consumption of the application, as the generated images can be huge and lead to OutOfMemoryError if too many are generated in parallel. For instance, to have up to 4 images generated in parallel, you would set the following:
jppf.fractals.concurrent.jobs = 4 jppf.pool.size = 4
Lastly, you can also configure a job dispatch timeout and maximum allowed timeouts in the client configuration. These 2 properties are used to prevent jobs from getting stuck forever, in case a node never completes the execution of a job. This is done as follows:
# maximum allowed time for a job to execute in a node, before it is resubmitted # or cancelled; defaults to 15000 ms jppf.fractals.dispatch.timeout = 15000 # maximum number of allowed timeouts before a job is cancelled; defaults to 1 jppf.fractals.dispatch.max.timeouts = 1The following was generated as an image size of 640x360 (360p definition), using a frame rate of 30 fps, and based on the input file "FractalMovieGenerator/data/mandelbrot.csv". Note that uploading it to Youtube required an additonal encoding step using the H.264 codec to generate a .mp4 video file.
<iframe width="640" height="360" src="http://www.youtube.com/embed/JDVBQHkEsMM?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>
If you need more insight into the code of this demo, you can consult the source, or have a look at the API documentation.
In addition, There are 2 privileged places you can go to: