【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用

来源:互联网 发布:淘宝层级上升流量下降 编辑:程序博客网 时间:2024/04/29 22:19

导读

  在本篇文章中你将了解到如何使用JBOSS7开发出一个简单的EJB应用以及在这个过程中遇到的问题。

环境

MyEclipse10
JBOSS7
JDK1.8.0

准备

MyEclipse10中配置JBOSS7

了解JBOSS目录结果

首先了解一下JBOSS7的目录结构,和之前的版本不一样
在 JBoss 7 中,文件系统分为两部分:
1. 独立服务器standalone
2. 域服务器domain (这是 JBoss 7 首次引入的) — 用于统一的管理多个实例

      这里写图片描述

bin: 包含启动的脚本,用来启动独立服务器(如果使用独立实例的话)或者域(使用域服务器)

docs: 包含服务器文档,有两个子目录,分别是 licenses (licenses.xml 和相关内容) 和 Schema (配置所使用的 .xsd 文件)

domain: 包含域结构,有子目录组成:configuration (包含域的配置文件), data (包含已发布模块的内容文件夹), lib(用于支持 Java EE 扩展) tmp (临时目录).

standalone: 结构和 Domain 文件夹相同

modules: 因为 JBoss 7 是一个模块化的服务器,应用服务器的模块对应这里的一个子目录。

配置JBOSS

   这里写图片描述

配置JDK

   这里写图片描述

运行JBOSS

  这里写图片描述

开发EJB

创建EJB Project

   这里写图片描述

编写接口和实现

          这里写图片描述

接口

package com.tgb.ejb;public interface FirstEjb {    String saySomething(String name);}

实现

package com.tgb.ejb;import javax.ejb.Remote;import javax.ejb.Stateless;@Stateless@Remotepublic class FirstEjbBean implements FirstEjb {    @Override    public String saySomething(String name) {        // TODO Auto-generated method stub        return "你好"+name;    }}

加入注解

上面的注解表示是无状态的会话Bean(@Stateless)以及要通过远程方式调用(@Remote)。

部署到JBOSS中并运行

      这里写图片描述

开发客户端

新建一个JavaProject

将客户端和要调用的EJB建立联系

打包接口

在FirstEjb上右击,选择Export,并打包到ejb_01_client项目中

     这里写图片描述

将打包好的jar包配置到客户端

     这里写图片描述

添加调用EJB需要依赖的jar包到客户端

jar包在jboss安装路径下的bin\client中jboss-client.jar

编写客户端

package com.tgb.ejb;import java.util.Hashtable;import javax.naming.Context;import javax.naming.InitialContext;public class FirstEjbClient {    public static void main(String[] args)throws Exception{        //JBOSS6,7之前        /*InitialContext context=new InitialContext();        FirstEjb firstEjb=(FirstEjb)context.lookup("FirstEjbBean/remote");        String s=firstEjb.saySomething("许晨阳");        System.out.println(s);*/        final Hashtable jndiProperties = new Hashtable();        jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");//让JNDI API知道是由谁来管理我们用来查找JNDI 名字的命名空间的。        final Context context = new InitialContext(jndiProperties);        //appName 和 moduleName分别就打包的格式而定        //如果是.ear就是appName,其它的是moduleName(.jar,.war)        final String appName = "";        final String moduleName = "ejb_01";        final String distinctName = "";        //实现类名        final String beanName = "FirstEjbBean";        System.out.println(beanName);        //接口类名        final String viewClassName = FirstEjb.class.getName();        System.out.println(viewClassName);        String jndi = "ejb:" + appName + "/" + moduleName + "/"                + distinctName + "/" + beanName + "!" + viewClassName;        System.out.println(jndi);        FirstEjb firstEjb = (FirstEjb) context.lookup(jndi);        String s= firstEjb.saySomething("许晨阳");        System.out.println(s);    }}

编写配置文件jboss-ejb-client.properties

告诉客户端EJB在哪

endpoint.name=client-endpointremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=falseremote.connections=default remote.connection.default.host=127.0.0.1 remote.connection.default.port = 4448remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=falseremote.connection.default.username=saremote.connection.default.password=sa

运行客户端

     这里写图片描述

总结

1.在jboss-ejb-client.properties中配置host和port

remote.connection.default.host=127.0.0.1 remote.connection.default.port = 4448

开始host的配的是“localhost”,结果运行客户端报错:
WARN: Could not register a EJB receiver for connection to remote:localhost
所以改成了“127.0.0.1”;

端口号要根据JBOSS的standalone.xml文件中的配置,默认是4447,我的改成了4448。
这里写图片描述

在这个过程中发现自己对standalone中的一些配置不是很清楚。可参考一下JBoss配置指南(三)

2.客户端代码中appName等的含义

appName:如果部署到服务器的是一个.ear包,那么app-name就为除去后缀.ear之后的包名。如果部署的是.war包或普通的.jar包,那么appName留空即可,我自己这个工程是以.jar包部署的,所以appName为空。

moduleName:此处就是部署到服务器上.war包或.jar包的名字,注意,moduleName不能为空。

distinctName:这是一个可选的用于指定在JBoss AS7上具体的部署配置的一个参数名,不需要使用的话,留空即可,此处我们留空。

beanName:这是我们要使用lookup查找获取的Bean,这个项目中为FirstEjbBean,即FirstEjb的实现Bean,无需全限定类名,beanName不能为空。

最后我们拼接处的路径是
ejb:/ejb_01//FirstEjbBean!com.tgb.ejb.FirstEjb
如果是有状态的EJB,那么拼接的字符串后面还要加上“?stateful”。

2 0