This page last changed on May 05, 2011 by alitokmen.
As of CARGO 1.0.3, the way CARGO supports remote deployments on the JBoss Application Server has drastically evolved. This document explains how to configure this support.
JBoss 4.0.x and 4.2.x
In JBoss 4.x, the JMX-based remote deployer can accept URLs that point to another machine. For example:
http://10.156.216.147:8080/jmx-console/HtmlAdaptor?action=invokeOpByName&name=jboss.system:service%3DMainDeployer&methodName=deploy&argType=java.net.URL&arg0=http%3A%2F%2F10.156.220.90%3A18080%2Fparuemas-1.0-SNAPSHOT.war
In this case, our JBoss server on 10.156.216.127 will connect to 10.156.220.90 via HTTP and download the paruemas-1.0-SNAPSHOT.war file. Once the file is downloaded, JBoss will automatically deploy it.
The CARGO JBoss container uses this principle to expose your Java EE application to JBoss using an HTTP server that is started on the machine where CARGO is currently running. That HTTP server is controlled using two parameters:
- JBossPropertySet.REMOTEDEPLOY_HOSTNAME (i.e., cargo.jboss.remotedeploy.hostname): sets the hostname that the JBoss server will attempt to connect to. By default, the CARGO JBoss container will automatically resolve the current machine's network name or IP address and fill this accordingly.
- JBossPropertySet.REMOTEDEPLOY_PORT (i.e., cargo.jboss.remotedeploy.port): sets the port number on which the HTTP server will be started on the machine running CARGO. By default, that one is set to 1 + the HTTP port for JBoss. For example, if JBoss is running on HTTP port 8080, then the default for JBossPropertySet.REMOTEDEPLOY_PORT will be 18080.
The obvious limitation you should be aware of is that JBoss needs to have direct access to the machine running CARGO.
JBoss 5.0.x, 5.1.x, 6.0.x and onwards
Starting from JBoss 5.x, JBoss has a Deployment Manager that can be used for deploying things on the JBoss server. If you really want to know how it works under the hood, you can read about this feature on the JBoss Website. If you only want to remotely deploy applications using CARGO to your JBoss server, you can of course ignore that document.
To connect to the JBoss Deployment Manager, CARGO uses JBoss' JMX RMI port; and that's what makes things get a bit complicated. For the connection to succeed, the following JARs need to be in the container classpath or in the current Java Thread's context classloader:
- The CARGO JBoss remote deployer for your version of JBoss
- JBoss deployment manager JARs
- JBoss remoting client JARs
Here is an example code for the users of the Java API:
List<URL> urls = new ArrayList<URL>();
urls.add(new File("cargo-core-tools-jboss-deployer-5.jar")).toURI().toURL());
for (File jar : new File(this.localContainer.getHome(), "lib").listFiles())
{
if (jar.isFile())
{
urls.add(jar.toURI().toURL());
}
}
for (File jar : new File(this.localContainer.getHome(), "common/lib").listFiles())
{
if (jar.isFile())
{
urls.add(jar.toURI().toURL());
}
}
URL[] urlsArray = new URL[urls.size()];
urlsArray = urls.toArray(urlsArray);
URLClassLoader classLoader = new URLClassLoader(urlsArray, Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(classLoader);
...
Here is an example Maven2 plugin configuration:
<repositories>
<repository>
<id>jboss</id>
<url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
</repository>
</repositories>
...
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>${cargo.plugin.version}</version>
<configuration>
<container>
<containerId>jboss51x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.hostname>production27</cargo.hostname>
<cargo.rmi.port>11099</cargo.rmi.port>
</properties>
</configuration>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-core-tools-jboss-deployer-5.1-and-onwards</artifactId>
<version>${cargo.plugin.version}</version>
<dependency>
<dependency>
<groupId>org.jboss.integration</groupId>
<artifactId>jboss-profileservice-spi</artifactId>
<version>5.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-client</artifactId>
<version>5.1.0.GA</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>
Starting from CARGO 1.1.0, it is also possible to remotely deploy to JBoss farms versions 5.x and newer. To do so, use these two properties:
- cargo.jboss.clustered: if true, deployment is done in the farm directory
- cargo.jboss.configuration: JBoss profile name, default name is default
 | On some Linux distributions, remote deployment may fail with an exception like:
Caused by: java.io.IOException: Can not get connection to server.
Problem establishing socket connection for InvokerLocator
[socket:
That is a known bug, documented in http://community.jboss.org/wiki/WhydoIgetasocketconnectionerrorwhenusingremoteJBossAS and the solution presented on that document is to use a cron job as the root user to fix the file when it gets broken.
First, create the correct version of /etc/hosts and save it somewhere, such as /etc/hosts.fixed, and populate it with the following contents (replace myhost with the hostname of your computer, as reported by the hostname command, and the correct IP assignment, as reported by ipconfig):
127.0.0.1 myhost localhost localhost.localdomain
::1 myhost localhost6 localhost6.localdomain6
127.0.1.1 myhost
## (optional entry); update if assigned a new address from DHCP
192.168.1.5 myhost
## The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Next, create a script named /etc/restore-etc-hosts.sh to replace the /etc/hosts file if Network Manager breaks it:
#!/bin/sh
if [ `grep -c NetworkManager /etc/hosts` -eq 1 ]; then
cp /etc/hosts.fixed /etc/hosts
fi
Finally, setup a cron job to run this script as often as you like. We recommend every couple of minutes.
*/3 * * * * /etc/restore-etc-hosts.sh
Once the /etc/hosts file is corrected, restart JBoss AS and run the tests again. Your socket connection error should be gone! |
|