Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 May 2002 12:24:41 -0700
From:      Helmut Hissen <helmut@zeebar.com>
To:        freebsd-java@freebsd.org
Subject:   java program as service
Message-ID:  <20020504122441.A1230@zeebar.com>

next in thread | raw e-mail | index | archive | help

going from a run-once-inside-test-environment to persistent
server brings up a number of issues, especially if you are
beating up the JVM.  

I used to run Java chat servers with hunders/thousands of 
IRC and HTTP connections, and every single time we switched JVMs, 
some other totally bizarre and obscure thing happened, never right 
away tho, but only after running for 6 hours and only at 2am 
and especially on holidays :-).  
 
starting through rc.d is fine, but consider this...


- get the user/group and file protections right, especially 
  if you are planning to access or create files incl log files
  in various places, and think about how you are planning to 
  clean them up

- if you write your own service and its open to the world, 
  make sure you dont open the flood gates to hackers.  most 
  existing network services out there have had the benefit 
  of having been hacked-into and fixed a few times (and being
  hardened as a result).  

- get you path, and CLASSPATH right.  you wont be able to 
  rely on your .{c,ba}shrc you tested with, but its nice to
  make that stuff explicit anyways

- you may discover that you forgot to close a file somewhere
  in the code and/or that you are hanging on to more objects 
  than you realize.  this is where good logging and debugging
  hooks comes in handy.

- if you are keeping the Java process around, and you are
  giving it an ongoing good workout, you may join the league 
  of people who get to deal with the ever-evolving JVM 
  bug-du-jour.  

- depending on the OS and system kernel parameters, you may run
  into process limits (max # of open files)

- the JVM may well die after a while, depending on which one
  and what you are doing to it.  best to assume that will hapen
  and run your service from a non-Java wrapper script, (csh, sh, 
  tclsh, perl) that goes something like this:

       set path/classpath
       set per-process limits
       while (true) {
           save previous logfile
           java ......  >& logfile
           if (being shutdown)
              exit
           email cause-of-death to cell phone / pager
       }

- keep a backup copy of the JDK and OS so that if you need to
  reinstall you wont be hostage to JVM-bug-du-jour on the new
  JVM/OS combination

- we used to run a watchdog thread whose only job was to wake up
  at a scheduled time.  it would then look at the clock and if it
  woke up late, it would send out a warning.  The freequency of
  these warnings turned out to be one of the best indicators for
  impending user-visible trouble.

I alluded to "obscure problems" you are more likely to run into
in a persistent server... here are two particular annoying examples 
of ther kind of things I have run into in the past:

- JVM did not properly close sockets if the connection was 
  terminated by certain errors (even though our application code
  released the associated objects), causing process to run out 
  of file descriptors after a few days..

- forking image utilities as subprocess from Java server
  (specifically, exit of the spawned process) caused a completely
  unrelated thread to wake up from a sleep, but only after a couple
  of hours of server uptime when things got really busy and during 
  garbage collection.

seems like every JVM we tried had some such quirk, no matter what 
color threads, and you would only run into this only on a fullmoon 
and you're about to go out to have dinner with someone special.  

sorry for ranting a bit ... I hope you wont run into anything 
particularly annoying.   chances are you wont.  may your special 
dinners be uninterrupted.

cheers

Helmut Hissen
helmut@dialabc.com


>hello!
>
>if i want to run a java program as a service, how is this done in the
>best way? can i do as an ordinary service that i start through a script
>in rc.d, or is there something special i have to think about?
>
>br
>.z


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-java" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020504122441.A1230>