-
1. Re: Start Windows service with different configuration
rcd Sep 8, 2014 4:45 PM (in response to jcw_at_mjc)I recently had this headache as well. As far as I can tell, the only easy way to change which configuration file is used is to edit bin/standalone.conf.bat (or domain.conf.bat) and add a line like this:
set "SERVER_OPTS=%SERVER_OPTS% -c my-config-file.xml"
If you're more adventurous, you might try mucking with bin/service/service.bat to make it so you can pass arbitrary parameters to standalone.bat/domain.bat, which would then allow you to create multiple services with different configurations.
-
2. Re: Start Windows service with different configuration
jcw_at_mjc Sep 9, 2014 8:18 AM (in response to rcd)Thanks for the reply Rich. From what I can tell service.bat sets a bunch of things then calls wildfly-service.exe with various arguments, and I can't find anything that tells me what I could add to that to change the configuration. Also looking at the service details in the registry there's nothing about parameters being passed. So it looks like for the moment I'm either going to have to replicate everything, or go back to using JavaService as we did for previous versions of JBoss AS.
-
3. Re: Start Windows service with different configuration
rcd Sep 9, 2014 6:31 PM (in response to jcw_at_mjc)1 of 1 people found this helpfulThe WildFly developers implemented the service stuff using Apache Commons Daemon, which is not very good in my experience. You're correct that it stores stuff in the registry, and I think that could be used to pass additional parameters, but not without some major surgery on the service.bat script. The key is the %STARTPARAM% variable. It looks like that ultimately just calls standalone.bat, and you can pass -c=my-config.xml to standalone.bat. So the trick is to be able to add arguments to STARTPARAM, which the current service.bat doesn't allow.
Also, I think even replicating everything would not work unless you change the SHORTNAME at the top of the script. I believe that has to be unique or else each service installation will just overwrite the previous one.
If you don't want to go that route, I'd recommend trying to wrap WildFly using YAJSW. I've used that on a couple projects and found that it works quite well. You may also want to open an enhancement request in JIRA and reference this thread.
-
4. Re: Start Windows service with different configuration
ctomc Sep 10, 2014 7:51 AM (in response to rcd)Rich DiCroce wrote:
Care about sharing what you did, by sending PR for wildfly-core, or contribute wiki page with description how to use it?
-
5. Re: Start Windows service with different configuration
rcd Sep 10, 2014 11:51 AM (in response to ctomc)I guess I should clarify that when I say I've used YAJSW, I mean that I've used it on non-WildFly projects. I have not used YAJSW with WildFly, so I don't have anything to contribute. I might look into it in the future though, as I've gotten a few complaints from various people on my current project about it being too hard to configure WildFly as a Windows service. If I do come up with something, I'll definitely open a JIRA and possibly send a PR. But that won't be for a while, as we've got an important demo coming up soon and I have bigger fish to fry.
-
6. Re: Start Windows service with different configuration
ctomc Sep 10, 2014 4:29 PM (in response to rcd)I was already getting excited that you used it with wildfly already and have working config Oh well...
If you do manage to look into it in the future it would be great.
Also if there are any suggestions what can be done to improve current service stuff, let us know or even send PR
-
7. Re: Start Windows service with different configuration
jcw_at_mjc Sep 15, 2014 6:30 AM (in response to ctomc)Hurrah! It's possible. It's not simple, but I think the full instructions for each service (for each different instance replace 'myapp' by something suitable, and change the port offset) are:
Copy the standalone directory to one called myapp. Copy the standalone.conf.bat file in the bin directory to myapp.conf.bat. Add the following lines to myapp.conf.bat (just above :JAVA_OPTS_SET is a good place)
rem # Set base directory
set "JAVA_OPTS=%JAVA_OPTS% -Djboss.server.base.dir=myapp"Copy the standalone.bat file in the bin directory to myapp.bat. Edit the line in myapp.bat from
set "STANDALONE_CONF=%DIRNAME%standalone.conf.bat"
to
set "STANDALONE_CONF=%DIRNAME%myapp.conf.bat"
Offset the port numbers used so they're distinct - edit the port-offset in the socket-binding-group tag in myapp/configuration/standalone.xml. The value will be added to all ports used, so e.g. to make the web port 58080 use a value of 50000.
Copy service.bat (in bin/service) to service-myapp.bat. In this file change the name and description of the service, e.g.:
set SHORTNAME=Wildfly-myapp
set DISPLAYNAME="Wildfly-myapp"
set DESCRIPTION="Wildfly Application Server (myapp)"
Also edit the lines as follows:
Replace:
set STARTPARAM="/c \"set NOPAUSE=Y ^^^&^^^& standalone.bat\""
with
set STARTPARAM="/c \"set NOPAUSE=Y ^^^&^^^& myapp.bat\""
Replace:
set LOGPATH=%JBOSS_HOME%\standalone\log
with
set LOGPATH=%JBOSS_HOME%\myapp\log
Replace:
set CONTROLLER=localhost:9990
with
set CONTROLLER=localhost:<port_number>
where <port_number> is 9990 + whatever you offset the port number by in standalone.xml.Now, in an administrator command prompt, go to bin/service and run
service-myapp install
. -
8. Re: Start Windows service with different configuration
jcw_at_mjc Sep 15, 2014 10:51 AM (in response to ctomc)Tomaz, in terms of suggestions it would be nice if some of the above could be automated/scripted! I'm not sure what you mean by 'send PR', have you got a link you can give me so I can read up on it and hopefully do something helpful?
-
9. Re: Start Windows service with different configuration
ctomc Sep 15, 2014 11:15 AM (in response to jcw_at_mjc)James Wilson wrote:
Tomaz, in terms of suggestions it would be nice if some of the above could be automated/scripted! I'm not sure what you mean by 'send PR', have you got a link you can give me so I can read up on it and hopefully do something helpful?
By send PR i meant, send pull request against wildfly-core repo that host this scripts https://github.com/wildfly/wildfly-core/tree/master/core-feature-pack/src/main/resources/content/bin
Just for info, there is plan to move more or less all windows related scripts to powershell, as batch files just don't support as much functionality we need.
-
10. Re: Re: Start Windows service with different configuration
rcd Oct 6, 2014 12:40 PM (in response to ctomc)I spent some time tinkering with this and came up with a good solution using YAJSW.
Rename or delete the bin/service directory in your WildFly install, then grab the zip file attached to this post and unzip it in bin. It will create a new service directory containing a slimmed down version of YAJSW (all optional libraries and other unnecessary stuff have been removed). The most important files are wrapper-wfly.conf and wrapper-wfly-app.conf. The former contains the base configuration that must always be present. Don't modify it! Instead, make your changes in wrapper-wfly-app.conf. If you need multiple service configurations, make copies of that file.
In wrapper-wfly-app.conf (or the copy you made of it), there are a couple key things:
- wrapper.java.command specifies the Java executable to use to run the service. I've set the default to be whatever java is in PATH, but you can change it to an absolute path to a particular java.exe if necessary.
- The wrapper.java.additional properties specify additional configuration parameters for the JVM itself. I've pre-set it with the same parameters in standalone.bat and standalone.conf.bat.
- The wrapper.app.parameter properties specify additional arguments to be passed to WildFly. I've included a -c parameter to set the WildFly configuration file to standalone.xml. Change it if you want to use a different config file.
- wrapper.ntservice.name is the Windows service name and must be unique. Change it if you need to have multiple WildFly services installed. You don't have to change the displayname and description properties, but if you have multiple WildFly services installed, you might have trouble telling them apart. :-)
You can test your configuration by opening a command prompt in bin/service and running "java -jar wrapper.jar -c <your conf file>". This will cause YAJSW to start WildFly using the wrapper configuration it will use when you install the service, but in a console so it's easier to debug any issues. Once you're satisfied with your configuration, run the same command again except with -i instead of -c to install the service. Use -r to remove the service. You can also run "java -jar wrapper.jar -?" for a full list of options. Note that service installation/removal must be done using an elevated command prompt. YAJSW will try to elevate automatically if necessary, but that did not work on my machine.
I'm planning to integrate this solution into two of our projects, but I'd love to see it replace the current Commons Daemon wrapper in WildFly 9. The YAJSW solution has a lot of advantages:
- Doesn't involve daisy-chaining a bunch of batch scripts.
- Allows the same WildFly instance to be installed as multiple services. (Well, it should. I have not actually tested this.)
- No need to specify controller, username, or password parameters because it doesn't use the CLI to stop WildFly. Stopping the service is equivalent to pressing Ctrl+C in a console.
- Easy for developers building things on top of WildFly to provide custom service configurations. All they need to do is add their conf file to WildFly and make sure it includes the base wrapper-wfly.conf file.
Of course, there are always some drawbacks:
- The YAJSW libraries are 11MB zipped. I know the WildFly devs have been trying to keep the WildFly download as small as possible, so this could be a problem. Many of the libraries YAJSW uses are already in the WildFly modules directory, but YAJSW does something special to find its libraries, so I'm not sure if it could be pointed to other locations.
- You need to disable or remove the console logger in the WildFly configuration. Leaving it in doesn't cause any errors, but YAJSW captures everything printed to System.out and System.err in its log, so you'll end up with double logging. That's the reason I put the log.console.level parameter in wrapper-wfly-app.conf, so I could use system property substitution to effectively disable the console logger in my WildFly configuration when running as a service.
And there is also some unfinished work:
- The configuration I've provided works for standalone mode, but I have not tried to make it work for domain mode. We don't use domain mode, so that effort should probably be done by someone who understands domain mode better than I do.
- Having to run "java -jar wrapper.jar <parameters>" is a little unfriendly. This could be solved with a PowerShell script that mimics the service.bat currently included in WildFly.
-
service.zip 11.5 MB
-
11. Re: Start Windows service with different configuration
ninjamester Feb 3, 2016 5:42 AM (in response to jcw_at_mjc)There are a comment in service.bat that addresses the issue with having multiple services:
REM If more then one service is needed, copy this file to another name
REM and use unique names for SHORTNAME, DISPLAYNAME, DESCRIPTION
But it's easy to support multiple services with 1 service.bat file:
I made some small changes to service.bat to be able to choose the configuration-file.
I just wanted to run 1 instance with custom configuration so i just added a parameter block like the one that handles /user param
if /I "%1"=="/configuration" (
if not "%2"=="" (
echo param = %2%
set CONFIGURATION_XML=-c %2
) else (
echo ERROR: You need to specify a configuration
goto endBatch
)
shift
shift
goto LoopArgs
)
Then use this param in the line
set STARTPARAM="/c \"set NOPAUSE=Y ^^^&^^^& standalone.bat %CONFIGURATION_XML%\""
So If CONFIGURATION_XML is not empty it will contain "-c xxx.xml" where xxx.xml is the name enteren with command "service install /configuration=xxx.xml"
The excact same can be done for SHORTNAME and DISPLAYNAME which enables multiple servers to be startet with this same .bat file