I tried the Andy's suggestion and it works as expected. It launches the openEJB in a separate runtime and communicates through the admin port to shutdown.
I am wondering whether it would be a better idea if we tightly integrate openejb with the JSL service main class, without launching it in a separate process. which means that openEJB main is called from the JSL service wrapper?.. I don't know the internals of the openEJB so I am not sure how big task this would be. Thanks /selvan rtselvan wrote: > > 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-tp26471759p26817122.html Sent from the OpenEJB User mailing list archive at Nabble.com.
