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.

Reply via email to