Hi all,
On Tue, Nov 4, 2014 at 10:31 AM, Bridger Dyson-Smith bdysonsmith@gmail.com wrote:
My apologies -- I accidentally clicked 'send'. :/
On Tue, Nov 4, 2014 at 10:12 AM, Bridger Dyson-Smith < bdysonsmith@gmail.com> wrote:
Hi all,
I know that there aren't many Tomcat users on this list, and that I'm echoing previous emails to the list but I wanted to see if anyone here had encountered this issue. Some pieces of this may be steps forward to solving problems that others on the list have mentioned; I've cc'd you in the hopes that the information is helpful.
Tomcat can be configured to multiple services, on varying ports, in the $TOMCAT_HOME/conf/server.xml file; e.g. [1]. I have two nearly-identical WARs in the following directory structure:
`--> tree -L 1 apache-tomcat-7.0.53 apache-tomcat-7.0.53 ├── LICENSE ├── NOTICE ├── RELEASE-NOTES ├── RUNNING.txt ├── bin ├── conf ├── lib ├── logs ├── logs2 ├── temp ├── webapps ├── webapps2 └── work
`--> tree -L 1 webapps webapps ├── BaseX79 ├── BaseX79.war ├── ROOT ├── docs ├── examples ├── fop ├── fop.war ├── host-manager ├── imagemanip ├── imagemanip.war ├── lukeall-1.0.1.jar ├── manager ├── retailer ├── retailer.war ├── saxon ├── saxon.war ├── spc ├── spc.war ├── static ├── utk-xtf ├── utk-xtf-frameless ├── utk-xtf-frameless.war └── utk-xtf.war
`--> tree -L 1 webapps2 webapps2 ├── ROOT ├── bX79 ├── bX79.war ├── docs ├── examples ├── host-manager └── manager
Now, the problem is that I get a port conflict message from Tomcat [2] and only the first WAR ($TOMCAT_HOME/webapps/BaseX79) loads. E.g. there are some minor textual changes between the two restxq.xqm files.
I've tried to add a .basex file (webapps2/bX79/.basex) that specifies a different port, and I've also tried adding that information in webapps2/bX79/WEB-INF/web.xml as <context-params> [3].
I'm planning to email the Tomcat-users list to see if someone there can shed more light on this; i.e. is this a problem with the way that server.xml is configured, etc. However I was also curious if anyone here had any thoughts or suggestions on this setup. Am I missing a step; e.g. should I be incorporating a compilation step - generating a WAR file - or something else?
I apologize for the breadth of the questions - I've jumped into the middle of a problem and now I'm trying to work my back out to the start. Thank you for your time & trouble.
Best, Bridger
[1] example server.xml:
<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/>
</GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="125" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" acceptCount="100"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host> </Engine> </Service> <Service name="Catalina2"> <Connector port="18080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443"/> <Connector port="18009" protocol="AJP/1.3" redirectPort="18443"/> <Engine name="Catalina2" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps2" unpackWARS="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs2" prefix="localhost_Cat2_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b"/> </Host> </Engine> </Service> </Server>
[2] $TOMCAT_HOME/logs/catalina.out: INFO: Starting service Catalina2 Nov 03, 2014 9:08:30 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.53 Nov 03, 2014 9:08:30 PM org.apache.catalina.startup.HostConfig deployWAR INFO: Deploying web application archive /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/bX79.war Nov 03, 2014 9:08:31 PM org.apache.catalina.core.StandardContext loadOnStartup *SEVERE: Servlet /bX79 threw load() exception* java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at java.net.ServerSocket.bind(ServerSocket.java:376) at java.net.ServerSocket.bind(ServerSocket.java:330) at org.basex.BaseXServer.<init>(BaseXServer.java:110) at org.basex.http.HTTPContext.init(HTTPContext.java:379) at org.basex.http.BaseXServlet.init(BaseXServlet.java:34) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/examples Nov 03, 2014 9:08:31 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Nov 03, 2014 9:08:31 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Nov 03, 2014 9:08:31 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@5f0f8770') Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/docs Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/ROOT Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/manager Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/host-manager Nov 03, 2014 9:08:31 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-18080"] Nov 03, 2014 9:08:31 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-bio-18009"] Nov 03, 2014 9:08:31 PM org.apache.catalina.startup.Catalina start INFO: Server startup in 7893 ms
[3] $TOMCAT_HOME/webapps2/bX79/WEB-INF/web.xml
<context-param> <param-name>org.basex.port</param-name> <param-value>8984</param-value> </context-param> <context-param> <param-name>org.basex.serverport</param-name> <param-value>8984</param-value> </context-param>
After poking at this some more, I'm pretty much stumped. I have
$webapp/WEB-INF/web.xml files that specify different ports for everything that isn't configured in $CATALINA_HOME/conf/server.xml, including org.basex.stopport. But no matter what, I get the same error when Tomcat starts to load the second .war:
INFO: Starting service Catalina2
Nov 06, 2014 9:50:03 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.53 Nov 06, 2014 9:50:03 PM org.apache.catalina.startup.HostConfig deployWAR INFO: Deploying web application archive /usr/home/bridger/src/apache-tomcat-7.0.53/webapps2/second.war Nov 06, 2014 9:50:04 PM org.apache.catalina.core.StandardContext loadOnStartup SEVERE: Servlet /second threw load() exception java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at java.net.ServerSocket.bind(ServerSocket.java:376) at java.net.ServerSocket.bind(ServerSocket.java:330) at org.basex.BaseXServer.<init>(BaseXServer.java:107) at org.basex.http.HTTPContext.init(HTTPContext.java:379) at org.basex.http.BaseXServlet.init(BaseXServlet.java:34) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
I've looked at the source, but I know even less about Java than I do about XQuery (e.g. next to nothing) so I'm not sure what else to try. If the list has any suggestions about following this further, I'd be delighted to try them -- there's something about this behavior that doesn't seem quite right. I can think of potential use cases where mutliple .wars serving different needs could be very handy.
This behavior doesn't appear to be limited to Tomcat, either. I just tested both $webapps in the 20141103 jetty distribution and got a very similar error. I've linked to a PasteBin [1] for the full error log.
Cheers, Bridger