David, I haven't got around doing this yet, but I will have an update by end of this week.
/selvan David Blevins wrote: > > Thanks, Andy, for the tip. Selvan, I'm curious how this worked out > for you. > > I wonder if this is something we can incorporate into the build. > Seems an out-of-the-box windows service version of OpenEJB standalone > would be useful to a fair number of people. Not being much of a > windows guy I'm not too sure what it would take to make that a reality. > > The doors are open if anyone would like to take a whack at it. > > -David > > On Nov 23, 2009, at 7:28 PM, rtselvan wrote: > >> >> Thanks Andy. This information is useful, I will try it out. >> >> Yeah, I know what you are talking about the Java Service Wrapper >> project. >> >> Thanks >> >> >> >> Andy Gumbrecht wrote: >>> >>> Hi Selvan, >>> >>> The Java Service Wrapper is no longer free, so I went on the hunt - >>> Its >>> a shame really, because it was developed largely by the community. >>> >>> It is not rocket science to actually dig into the Java.c from Sun and >>> get a basic service running yourself - It is a little more hard to >>> cater >>> for everyone though, and that is where the JSW finds it's commercial >>> strength. >>> >>> Anyway, I used this project 'http://jslwin.sourceforge.net/' (Thanks >>> Michael) to get OpenEJB running as a service using: >>> >>> 1. A simple controller... >>> >>> public class ServiceController { >>> >>> private final static Log log = >>> LogFactory.getLog(ServiceController.class); >>> >>> private static Server _server; >>> >>> public ServiceController() { >>> } >>> >>> public static void main(String[] args) { >>> >>> final File dir; >>> >>> try { >>> dir = new >>> File(System.getProperty("standalone.server.dir")); >>> >>> if (!dir.exists()) { >>> log.fatal(String.format("System property >>> 'standalone.server.dir' is invalid: %s", dir)); >>> throw new RuntimeException("System property >>> 'standalone.server.dir' is invalid"); >>> } >>> } catch (Exception e) { >>> log.fatal("System property 'standalone.server.dir' not >>> found"); >>> throw new RuntimeException("System property >>> 'standalone.server.dir' not found!"); >>> } >>> >>> log.info(String.format("Configuring server at: %s", dir)); >>> >>> _server = new ServerOpenEJB(dir.getAbsolutePath()); >>> >>> Thread t = new Thread() { >>> public void run() { >>> ServiceController.start(); >>> >>> while (true) { //System.exit >>> try { >>> Thread.sleep(Integer.MAX_VALUE); >>> } catch (InterruptedException e) { >>> //Ignore >>> log.debug("Service was interrupted"); >>> } >>> } >>> } >>> }; >>> >>> t.start(); >>> >>> try { >>> t.join(); >>> } catch (InterruptedException e) { >>> log.debug("InterruptedException:", e); >>> } >>> } >>> >>> public static void start() { >>> log.info("Starting service"); >>> resume(); >>> log.info("Started service"); >>> } >>> >>> public static void stop() { >>> >>> log.info("Stopping service"); >>> pause(); >>> log.info("Stopped service"); >>> LogFactory.releaseAll(); >>> >>> Thread.yield(); >>> >>> System.exit(0); >>> } >>> >>> public static void pause() { >>> log.info("Pausing service"); >>> if (null != _server) { >>> _server.stop(); >>> } >>> } >>> >>> public static void resume() { >>> if (null != _server) { >>> if (!_server.isStarted()) { >>> log.info("Resuming service"); >>> _server.restart(); >>> } >>> } >>> } >>> } >>> >>> 2. A server wrapper (Modified the existing OpenEJB invoker code, so >>> thank you OpenEJB team) >>> >>> public class ServerOpenEJB implements Server { >>> >>> private static final Log log = >>> LogFactory.getLog(ServerOpenEJB.class); >>> private final String _path; >>> >>> public ServerOpenEJB(String path) { >>> >>> if (!path.endsWith(File.separator)) { >>> path += File.separator; >>> } >>> >>> _path = path; >>> } >>> >>> @Override >>> public boolean isStarted() { >>> return connect(); >>> } >>> >>> @Override >>> public boolean restart() { >>> if (stop()) { >>> return start(); >>> } >>> >>> return false; >>> } >>> >>> public boolean start() { >>> >>> if (!connect()) { >>> >>> forkServerProcess("start"); >>> return connect(10, "localhost", 4201); >>> >>> } else { >>> log.debug(":: Remote OpenEJB already started ::"); >>> return true; >>> } >>> } >>> >>> @Override >>> public boolean stop() { >>> >>> if (connect()) { >>> >>> OutputStream out = null; >>> Socket socket = null; >>> >>> try { >>> socket = new Socket("localhost", 4200); >>> out = socket.getOutputStream(); >>> out.write("Stop".getBytes()); >>> } catch (Exception e) { >>> //Ignore >>> } finally { >>> try { >>> out.close(); >>> } catch (IOException e) { >>> //Ignore >>> } >>> try { >>> socket.close(); >>> } catch (IOException e) { >>> //Ignore >>> } >>> } >>> >>> return disconnect(10, "localhost", 4201); >>> >>> } else { >>> log.debug(":: Remote OpenEJB is not running ::"); >>> return true; >>> } >>> } >>> >>> public static boolean connect() { >>> return connect(1, "localhost", 4201); >>> } >>> >>> private void forkServerProcess(final String option) { >>> >>> try { >>> >>> ArrayList<String> cmd = new ArrayList<String>(); >>> String s = java.io.File.separator; >>> String java = System.getProperty("java.home") + s + >>> "bin" + >>> s + "java"; >>> >>> cmd.add(java); >>> addSystemProperties(cmd); >>> cmd.add("-classpath"); >>> //cmd.add(getClasspath()); >>> cmd.add(_path + "lib"); >>> //cmd.add("org.apache.openejb.server.Main"); >>> cmd.add("-jar"); >>> >>> //Find the core jar. >>> final File[] libs = new File(_path + "lib").listFiles(); >>> File core = null; >>> >>> for(File f : libs){ >>> if(f.getName().toLowerCase().indexOf("openejb- >>> core") > >>> -1){ >>> core = f; >>> } >>> } >>> >>> if(null == core){ >>> throw new Exception("Did not find core library"); >>> } >>> >>> cmd.add(core.getAbsolutePath()); >>> cmd.add(option); >>> >>> String[] command = (String[]) cmd.toArray(new String[0]); >>> >>> Runtime runtime = Runtime.getRuntime(); >>> Process server = runtime.exec(command, null, new >>> File(_path)); >>> >>> Thread serverOut = new Thread(new >>> Pipe(server.getInputStream(), System.out)); >>> serverOut.setDaemon(true); >>> serverOut.start(); >>> >>> Thread serverErr = new Thread(new >>> Pipe(server.getErrorStream(), System.err)); >>> serverErr.setDaemon(true); >>> serverErr.start(); >>> >>> } catch (Exception e) { >>> throw new RuntimeException("Cannot start the OpenEJB >>> server.",e); >>> } >>> >>> } >>> >>> private void addSystemProperties(ArrayList<String> cmd) { >>> >>> Set set = System.getProperties().entrySet(); >>> >>> for (Iterator iter = set.iterator(); iter.hasNext();) { >>> >>> Map.Entry entry = (Map.Entry) iter.next(); >>> String key = (String) entry.getKey(); >>> String value = (String) entry.getValue(); >>> >>> if (key.matches("^-X.*")) { >>> cmd.add(key + value); >>> } else if >>> (!key.matches("^(java|javax|os|sun|user|file|awt|line|path)\\..*")) { >>> cmd.add("-D" + key + "=" + value); >>> } >>> } >>> >>> } >>> >>> public static boolean connect(int tries, String host, int port) { >>> >>> Socket s = null; >>> >>> try { >>> >>> s = new Socket(host, port); >>> s.getOutputStream().close(); >>> >>> } catch (Exception e) { >>> >>> if (tries < 2) { >>> return false; >>> } else { >>> >>> try { >>> Thread.sleep(2000); >>> } catch (Exception e2) { >>> e.printStackTrace(); >>> } >>> >>> return connect(--tries, host, port); >>> } >>> } finally { >>> try { >>> s.close(); >>> } catch (Exception e) { >>> } >>> } >>> >>> return true; >>> } >>> >>> public static boolean disconnect(int tries, String host, int >>> port) { >>> >>> Socket s = null; >>> >>> try { >>> >>> s = new Socket(host, port); >>> s.getOutputStream().close(); >>> >>> try { >>> s.close(); >>> } catch (Exception e) { >>> } >>> >>> if (tries < 2) { >>> return false; >>> } else { >>> >>> try { >>> Thread.sleep(2000); >>> } catch (Exception e2) { >>> } >>> >>> return disconnect(--tries, host, port); >>> } >>> >>> } catch (Exception e) { >>> >>> } finally { >>> try { >>> s.close(); >>> } catch (Exception e) { >>> } >>> } >>> >>> return true; >>> } >>> >>> private static final class Pipe implements Runnable { >>> >>> private final InputStream is; >>> private final OutputStream out; >>> >>> private Pipe(InputStream is, OutputStream out) { >>> super(); >>> this.is = is; >>> this.out = out; >>> } >>> >>> public void run() { >>> >>> try { >>> >>> int i = is.read(); >>> out.write(i); >>> >>> while (i != -1) { >>> i = is.read(); >>> out.write(i); >>> } >>> >>> } catch (Exception e) { >>> e.printStackTrace(); >>> } >>> >>> } >>> >>> } >>> } >>> >>> The JSL service configuration is well documented and I am sure the >>> above >>> code can be tweaked to your needs. >>> >>> Best regards, >>> >>> Andy. >>> >>> On 23.11.2009 03:04, rtselvan wrote: >>>> It could be that I missed the documentation on it. >>>> >>>> Is there a wrapper integration to run openEJB as standalone windows >>>> service? >>>> openejb.bat doesn't have any option to install the open ejb as >>>> windows >>>> service (like tomcat). >>>> >>>> Thanks >>>> /selvan >>>> >>> >>> >> >> -- >> View this message in context: >> http://old.nabble.com/Running-standalone-server-as-a-windows-service-tp26471759p26483456.html >> Sent from the OpenEJB User mailing list archive at Nabble.com. >> >> > > > -- View this message in context: http://old.nabble.com/Running-standalone-server-as-a-windows-service-tp26471759p26705848.html Sent from the OpenEJB User mailing list archive at Nabble.com.
