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

导读

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

环境

MyEclipse10
JBOSS7
JDK1.8.0

准备

MyEclipse10中配置JBOSS7

了解JBOSS目录结果

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

      【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第1张图片

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

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

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

standalone: 结构和 Domain 文件夹相同

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

配置JBOSS

   【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第2张图片

配置JDK

   【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第3张图片

运行JBOSS

  

开发EJB

创建EJB Project

   

编写接口和实现

          【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第4张图片

接口

package com.tgb.ejb;

public interface FirstEjb {

    String saySomething(String name);
}

实现

package com.tgb.ejb;

import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote
public class FirstEjbBean implements FirstEjb {

    @Override
    public String saySomething(String name) {
        // TODO Auto-generated method stub
        return "你好"+name;
    }

}

加入注解

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

部署到JBOSS中并运行

      【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第5张图片

开发客户端

新建一个JavaProject

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

打包接口

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

     【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第6张图片

将打包好的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-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default 

remote.connection.default.host=127.0.0.1 
remote.connection.default.port = 4448
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false


remote.connection.default.username=sa
remote.connection.default.password=sa

运行客户端

     【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第7张图片

总结

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。
【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用_第8张图片

在这个过程中发现自己对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”。

你可能感兴趣的:(jboss,ejb)