<?xml version="1.0" encoding="iso-8859-1"?> | |
<!-- | |
~ Licensed to the Apache Software Foundation (ASF) under one | |
~ or more contributor license agreements. See the NOTICE file | |
~ distributed with this work for additional information | |
~ regarding copyright ownership. The ASF licenses this file | |
~ to you under the Apache License, Version 2.0 (the | |
~ "License"); you may not use this file except in compliance | |
~ with the License. You may obtain a copy of the License at | |
~ | |
~ http://www.apache.org/licenses/LICENSE-2.0 | |
~ | |
~ Unless required by applicable law or agreed to in writing, | |
~ software distributed under the License is distributed on an | |
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
~ KIND, either express or implied. See the License for the | |
~ specific language governing permissions and limitations | |
~ under the License. | |
--> | |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" | |
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml"> | |
<head> | |
<meta name="generator" content= | |
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" /> | |
<meta http-equiv="content-type" content= | |
"text/html; charset=us-ascii" /> | |
<title>Guide to using EJB Provider for Axis2</title> | |
<meta name="generator" content= | |
"amaya 9.2.1, see http://www.w3.org/Amaya/" /> | |
</head> | |
<body xml:lang="en"> | |
<h1>Guide to using EJB Provider for Axis2</h1> | |
<p>The EJB message receiver allows one to access stateless session | |
EJBs (Enterprise JavaBeans) through Web services. The example used | |
in this guide illustrates how to use the EJB provider that ships | |
with Axis2 to access EJBs deployed on a J2EE server such as | |
Geronimo or JBoss.</p> | |
<p>This example explains how to use Geronimo 1.1 and JBoss 4.0.4.GA | |
as application server.</p> | |
<p>The following steps will take you through the example through | |
which we will explain how to use an EJB provider in Axis2</p> | |
<h2>1. Creating a Simple Stateless Session EJB</h2> | |
<p>First we need to create a stateless session EJB. Use the | |
following files to make an EJB for testing:</p> | |
<pre> | |
Remote interface (Hello.java) | |
package my.ejb; | |
import javax.ejb.EJBObject; | |
public interface Hello extends EJBObject, HelloBusiness { | |
} | |
</pre> | |
<p>The following interface defines the business methods available | |
in</p> | |
<p><code>1.</code>HelloBusiness.java</p> | |
<pre> | |
package my.ejb; | |
import java.rmi.RemoteException; | |
public interface HelloBusiness { | |
public String sayHello(String name) throws RemoteException; | |
} | |
</pre> | |
<p>2, Remote home interface - HelloHome.java</p> | |
<pre> | |
package my.ejb; | |
import javax.ejb.EJBHome; | |
import javax.ejb.CreateException; | |
import java.rmi.RemoteException; | |
public interface HelloHome extends EJBHome { | |
public Hello create() throws CreateException, RemoteException; | |
} | |
</pre> | |
<p>3. Bean class - HelloBean.java</p> | |
<pre> | |
package my.ejb; | |
import javax.ejb.SessionBean; | |
import javax.ejb.SessionContext; | |
import javax.ejb.EJBException; | |
import javax.ejb.CreateException; | |
public class HelloBean implements SessionBean { | |
public void setSessionContext(SessionContext sessionContext) throws | |
EJBException {} | |
public void ejbRemove() throws EJBException {} | |
public void ejbActivate() throws EJBException {} | |
public void ejbPassivate() throws EJBException {} | |
public void ejbCreate() throws CreateException {} | |
public String sayHello(String name) { | |
return "Hello " + name + ", Have a nice day!"; | |
} | |
} | |
</pre> | |
<p>4. Deployment descriptor - ejb-jar.xml</p> | |
<pre> | |
<?xml version="1.0" encoding="UTF-8"?> | |
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee | |
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" | |
version="2.1"> | |
<enterprise-beans> | |
<session> | |
<ejb-name>Hello</ejb-name> | |
<home>my.ejb.HelloHome</home> | |
<remote>my.ejb.Hello</remote> | |
<ejb-class>my.ejb.HelloBean</ejb-class> | |
<session-type>Stateless</session-type> | |
<transaction-type>Bean</transaction-type> | |
</session> | |
</enterprise-beans> | |
<assembly-descriptor> | |
<container-transaction> | |
<method> | |
<ejb-name>Hello</ejb-name> | |
<method-name>*</method-name> | |
</method> | |
<trans-attribute>Required</trans-attribute> | |
</container-transaction> | |
</assembly-descriptor> | |
</ejb-jar> | |
</pre> | |
<p>Now we have to write application server specific deployment | |
descriptor(s) for the Hello EJB. The following listing shows an | |
example Geronimo/OpenEJB deployment descriptor | |
(openejb-jar.xml)</p> | |
<pre> | |
<?xml version="1.0" encoding="UTF-8"?> | |
<openejb-jar | |
xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1" | |
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1" | |
xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1" | |
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1" | |
xmlns:pkgen="http://www.openejb.org/xml/ns/pkgen-2.0"> | |
<enterprise-beans> | |
<session> | |
<ejb-name>Hello</ejb-name> | |
<jndi-name>my/ejb/HelloBean</jndi-name> | |
</session> | |
</enterprise-beans> | |
</openejb-jar> | |
</pre> | |
<p>If you want to test on JBoss, use the following JBoss deployment | |
descriptor (jboss.xml)</p> | |
<pre> | |
<?xml version="1.0"?> | |
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" | |
"http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd"> | |
<jboss> | |
<enterprise-beans> | |
<session> | |
<ejb-name>Hello</ejb-name> | |
<jndi-name>my/ejb/HelloBean</jndi-name> | |
</session> | |
</enterprise-beans> | |
</jboss> | |
</pre> | |
<p>Compile the above java classes and bundle the compiled classes | |
and the XML files into a jar file (HelloEJB.jar) as shown | |
below.</p> | |
<pre> | |
HelloEJB.jar | |
| | |
+--META-INF | |
| +--ejb-jar.xml | |
| +--jboss.xml [If you want to deploy on Jboss] | |
| +--openejb-jar.xml [If you want to deploy on Geronimo/Openejb] | |
| | |
+--my | |
+--ejb | |
| | |
+--Hello.class | |
+--HelloBean.class | |
+--HelloBusiness.class | |
+--HelloHome.class | |
</pre> | |
<p>Next, deploy the HelloEJB.jar file onto the appropriate J2EE | |
application server.</p> | |
<h2>Creating the Axis2 Service Archive</h2> | |
<p>Now we need to make the services.xml file.</p> | |
<pre> | |
<serviceGroup> | |
<service name="HelloBeanService"> | |
<description>Hello! web service</description> | |
<messageReceivers> | |
<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" | |
class="org.apache.axis2.rpc.receivers.ejb.EJBInOnlyMessageReceiver"/> | |
<messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" | |
class="org.apache.axis2.rpc.receivers.ejb.EJBMessageReceiver"/> | |
</messageReceivers> | |
<parameter name="ServiceClass">my.ejb.HelloBusiness</parameter> | |
<parameter name="remoteInterfaceName">my.ejb.Hello</parameter> | |
<parameter name="homeInterfaceName">my.ejb.HelloHome</parameter> | |
<parameter name="beanJndiName">my/ejb/HelloBean</parameter> | |
<parameter name="providerUrl">[URL]</parameter> | |
<parameter name="jndiContextClass">[Context Factory Class | |
Name]</parameter> | |
</service> | |
</serviceGroup> | |
</pre> | |
<p>In the above services.xml file, replace the [URL] and [Context | |
Factory Class Name] with valid values as follows:</p> | |
<p><strong>i.e. If the EJB is deployed on Geronimo:</strong></p> | |
<p>Replace [URL] by 127.0.0.1:4201</p> | |
<p>Replace [Context Factory Class Name] by | |
org.openejb.client.JNDIContext</p> | |
<p><strong>For Jboss:</strong></p> | |
<p>Replace [URL] by jnp://localhost:1099</p> | |
<p>Replace [Context Factory Class Name] by | |
org.jnp.interfaces.NamingContextFactory</p> | |
<p>Bundle the HelloBeanService.wsdl, services.xml, remote interface | |
class and home interface class as illustrated below:</p> | |
<pre> | |
HelloBeanService.aar | |
| | |
+--META-INF | |
| +--services.xml | |
| | |
+--lib | |
| +--[jars used by the ejb client eg.initial context factory classes] | |
| | |
+--my | |
+--ejb | |
+--Hello.class | |
+--HelloBusiness.class | |
+--HelloHome.class | |
</pre> | |
<p>The lib directory of HelloBeanService.aar must contain all the | |
libraries needed to access the EJB. If the EJB is deployed on | |
<strong>Geronimo</strong>, add the following jar files to the lib | |
directory.</p> | |
<ul> | |
<li>cglib-nodep-2.1_3.jar</li> | |
<li>geronimo-ejb_2.1_spec-1.0.1.jar</li> | |
<li>geronimo-j2ee-jacc_1.0_spec-1.0.1.jar</li> | |
<li>geronimo-kernel-1.1.jar</li> | |
<li>geronimo-security-1.1.jar</li> | |
<li>openejb-core-2.1.jar</li> | |
</ul> | |
<p>For <strong>JBoss</strong> add the following jar files.</p> | |
<ul> | |
<li>jnp-client.jar</li> | |
<li>jboss-client.jar</li> | |
<li>jboss-common-client.jar</li> | |
<li>jboss-remoting.jar</li> | |
<li>jboss-serialization.jar</li> | |
<li>jboss-transaction-client.jar</li> | |
<li>concurrent.jar</li> | |
<li>jbosssx-client.jar</li> | |
<li>jboss-j2ee.jar</li> | |
</ul> | |
<p>Deploy HelloBeanService.aar on an Axis2 server.</p> | |
<p>Now you can access the Hello EJB through Web services. Since our | |
EJB message receivers extend RPC message receivers, | |
org.apache.axis2.rpc.client.RPCServiceClient can be used to invoke | |
the service as illustrated in the following code fragment.</p> | |
<pre> | |
... | |
RPCServiceClient serviceClient = new RPCServiceClient(); | |
Options options = serviceClient.getOptions(); | |
EndpointReference targetEPR = new | |
EndpointReference("http://localhost:8080/axis2/services/HelloBeanService"); | |
options.setTo(targetEPR); | |
QName hello = new QName("http://ejb.my/xsd", "sayHello"); | |
Object[] helloArgs = new Object[] {"John"}; | |
System.out.println(serviceClient.invokeBlocking(hello, | |
helloArgs).getFirstElement().getText()); | |
... | |
</pre> | |
</body> | |
</html> |