SOA(Service-Oriented Architecture,面向服务架构)是一种架构模型,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
本文以axis1.4 + ejb2.x 为基础,SOAP由axis完成,ejb完成具体的服务实现,以期对SOA有一个感性的认识。
[color=red]一、EJB的开发:[/color]
[b]1、开构成EJB组件的相关类[/b]
/** * Hello EJB组件的远程接口 * 该接口由容器实现,EJB对象会将客户请求委派给实际的EJB bean类 * @author chenwq */public interface Hello extends EJBObject { public String sayHello(String name) throws RemoteException;}/** * Hello EJB组件的Home接口 * 该对象充当创建EJB对象的工厂 * 在Home接口中,存在create()方法 * @author chenwq */public interface HelloHome extends EJBHome { /** * 创建EJB对象 * @return EJB对象 * @throws CreateException * @throws RemoteException */ Hello create() throws CreateException, RemoteException;}/** * 无状态的会话bean * @author chenwq */public class HelloImpl implements SessionBean { // ** EJB规范定义的方法 ** // public void ejbActivate() throws EJBException, RemoteException { } public void ejbPassivate() throws EJBException, RemoteException { } public void ejbRemove() throws EJBException, RemoteException { } public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException { } public void ejbCreate(){ } //业务方法 public String sayHello(String name){ System.out.println("Hi, " + name); return "Hi, " + name; } }
[b]2、编写部署描述符[/b]
1)ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"><ejb-jar > <enterprise-beans> <session > <ejb-name>Hello</ejb-name> <home>com.ejb2x.HelloHome</home> <remote>com.ejb2x.Hello</remote> <ejb-class>com.ejb2x.HelloImpl</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>
2)jboss.xml
<?xml version="1.0" encoding="UTF-8"?><!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>ejb/Hello</jndi-name> </session> </enterprise-beans></jboss>
[b]3、打包部署[/b]
按以下目录结构打成jar包:
ejb.jar
|- (.class文件)
|- META-INF
|- ejb-jar.xml
|- jboss.xml
将jar拷贝至\deploy目录下,启动JBOSS,进入jmx-console,如果能看见
jboss.management.local
* EJBModule=ejb2x.jar,J2EEApplication=null,J2EEServer=Local,j2eeType=StatelessSessionBean,name=Hello
则表明EJB模块部署成功。
如图:
[img]/upload/attachment/109385/9302a64d-29a9-3445-9143-751628bd7cfc.jpg[/img]
[color=red]二、AXIS[/color]
Axis(Apache eXtensible Interaction System)是一款开源的WebService运行引擎,它是SOAP协议的一个实现,网上有许多关于此的教程,有兴趣的可以上网搜索。这里只是简单介绍如何实现基于EJB+AXIS的SOA,这里采用的版本是Axis1.4。
[b]1、下载axis的发行包:[/b]http://www.apache.org/dyn/closer.cgi/ws/axis/1_4
[b]2、构建axis.war[/b]
可以新建一个web工程,也可以直接使用axis发行包中 \webapps\axis 下的web工程。这里以新建web工程为例讲解。
1)拷贝jar包及相关文件:
将axis-1_4\lib 下的所有jar包拷贝至项目的lib目录下。
另外,还需要activation-1.1.jar和mail-1.4.jar这两个依赖jar包
将\axis-1_4\webapps\axis\ 下的两个jsp文件 index.jsp和i18nlib.jsp 拷贝到WebRoot下
i18n_ja.properties 和 i18n.properties 两个文件拷贝至classpath下
2)配置web.xml:
<listener> <listener-class> org.apache.axis.transport.http.AxisHTTPSessionListener </listener-class> </listener> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>AdminServlet</servlet-name> <servlet-class> org.apache.axis.transport.http.AdminServlet </servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/servlet/AdminServlet</url-pattern> </servlet-mapping>
启动JBOSS,浏览器中键入:http://localhost:8080/axis/ 能看到如下画面,则表明axis已经配置成功。
[img]/upload/attachment/109387/aa258dcf-9de7-3cc6-8eca-9f6bc573f363.jpg[/img]
[b]2、编写WSDD文件[/b]
deploy.wsdd
<?xml version="1.0" encoding="UTF-8"?><deployment name="defaultClientConfig" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="HelloService" provider="java:EJB" style="rpc" use="encoded"> <parameter name="beanJndiName" value="ejb/Hello"/> <!-- EJBBean的JNDI名称 --> <parameter name="homeInterfaceName" value="com.ejb2x.HelloHome"/> <!-- EJB的Home接口类名 --> <parameter name="remoteInterfaceName" value="com.ejb2x.Hello"/> <!-- EJB远程接口类名 --> <parameter name="wsdlSoapActionMode" value="OPERATION"/> </service></deployment>
[b]3、生成server-config.wsdd文件[/b]
打开CMD命令控制台,在 %JBOSS_HOME%\server\default\deploy\axis.war\WEB-INF 下,键入如下命令:
[color=blue]java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd[/color]
说明:参数-D是设置一个系统属性,java.ext.dirs=lib是将JVM的扩展目录路径设为lib目录,以保证JVM可以找到AdminClient类。
执行该程序实际会向 http://{address:port}/axis/services/AdminService 发起请求,所以要保证该命令正确执行,必须满足:
1)jboss处于运行状态
2)web context-root 为 axis,且配置有匹配 /services/AdminService 路径的servlet
调用成功后,会在当前目录下生成server-config.wsdd文件。
[b]4、查看已发布的webservice[/b]
浏览器中键入 http://localhost:8080/axis/servlet/AxisServlet 可以查看已发布的webservice。如下图:
[img]/upload/attachment/109389/e2de5e3b-ca78-38e8-a8f7-c594ff770641.jpg[/img]
[color=red]三、客户端调用[/color]
[b]1、拷贝客户端依赖的jar包[/b]
将axis-1_4\lib 下的所有jar包拷贝至项目的lib目录下。
[b]2、调用:[/b]
public static void main(String[] args) { try { Call call = (Call) new Service().createCall(); String wsdlUrl = "http://localhost:8080/axis/services/HelloService"; call.setTargetEndpointAddress(wsdlUrl); call.setOperationName(new QName(wsdlUrl, "sayHello")); call.invoke(new Object[] { "chenwenquan" }); } catch (ServiceException e) { //process Exception } catch (RemoteException e) { //process Exception } }
后台打印出:INFO [STDOUT] Hi, chenwenquan 则表示调用成功。
以上只是简单演示了EJB2.x+AXIS1.4实现SOA的最基础版本,虽然ejb3.x已经取代了2.x,但我相信,任何新技术都是在已有技术的基础上进行的扩展,万变不离其宗,最本质的东西始终不会变,我们只要理解和掌握了最本质的东西,无论其版本如何变化,我想我们都可以游刃有余。