EJB远程接口调用

一.EJB简介

EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)

二.EJB与DUBBO的区别

Dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架。(必须依赖于Spring框架,必须启动Zookeeper服务,用于注册接口),与EJB一样,都可以实现接口与实现类的远程类调用,实现接口,可以将核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。

三.EJB在同项目中的应用(只有一个实现类)

1、定义接口(加@Local注解,代表本地接口)

@Local
public interface Iejb {
    String sayHelloWord(String userName);
}

2、编写实现类(加注解@Stateless,无状态bean)

@Stateless
@Local
public class EjbBean implements Iejb {

    @Override
    public String sayHelloWord(String userName) {
        return userName+":HelloWord!";
    }
}

3.客户端调用

@Stateless
public class HelloWorldLocalController extends HttpServlet {
    @EJB
    private Iejb iejb;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter pw = response.getWriter();
        String s = JSON.toJSONString(helloWorld.sayHello("wangping"));
        pw.write(s);
        pw.close();
    }

}

四.EJB在同项目中的应用(一个接口对应多个实现类)

1、定义接口(加@Local注解,代表本地接口)

@Local
public interface Iejb2 {
    String sayHelloWord(String userName);
}

2、编写实现类

  1(加注解@Alternative,代表取消自动注入)

@Stateless
@Alternative
public class IejbBean implements Iejb2 {
    @Override
    public String sayHello(String userName) {
        return userName+":Hello";
    }
}

  2(加注解@Alternative,代表取消自动注入)

@Stateless
@Alternative
public class NewIejbBean implements Iejb2 {

    @Override
    public String sayHello(String userName) {
        return userName+":HelloWorld";
    }
}

  3 编写bean.xml指定接口的实现类(指定实现类为NewIejbBean)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">

    <alternatives>
        <class>com.phhc.ejb_eg2.NewIejbBean</class>
    </alternatives>

</beans>

3、编写客户端(加注解@Inject表示注入)

public class DemoServlet2 extends HttpServlet {

    @Inject
    private Iejb2 iejb;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) {
        try {
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            PrintWriter pw = response.getWriter();
            String s = JSON.toJSONString(iejb.sayHello("wangping"));
            pw.write(s);
            pw.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

五.EJB在同类容器不同项目中的远程调用

1.编写接口(加@Remote,代表远程调用接口)

@Remote
public interface HelloWordRemote extends Serializable {
    Model sayHello(String world);
}

2、编写实现类(加@Stateless表示无状态的bean)

@Stateless(name = "HelloWorldBeanEJB")
@Remote(HelloWordRemote.class)
@Local(HelloWordLocal.class)
public class HelloWorldBean implements HelloWordRemote,HelloWordLocal {

    @Override
    public String sayHello(String world) {
        return "HelloWorld:"+world;
    }
}

3、在项目根目录下创建META-INF目录,下面添加ejb-jar.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
         version="3.1">
    <enterprise-beans>
        <session>
            <ejb-name>HelloWorldBeanEJB</ejb-name>
            <remote>com.phhc.ejb.servcices.HelloWordRemote</remote>
            <local>com.phhc.ejb.servcices.HelloWordLocal</local>
            <ejb-class>com.phhc.ejb.servcices.impl.HelloWorldBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
        </session>
    </enterprise-beans>

</ejb-jar>

4、创建客户端程序(加EJB注解,表示EJB远程调用)

public class HelloWordController extends HttpServlet {
    @EJB(name = "ejb/HelloWorldBeanEJB")
    private HelloWordRemote helloWord;

5、部署EJB程序和客户端程序,访问客户端程序

六.不同Glassfish之间的EJB远程调用

1、编写接口项目

@Remote
public interface HelloWordRemote extends Serializable {
    Model sayHello(String world);
}

2、编写实现类

@Stateless(name = "HelloWorldBeanEJB")
public class HelloWorldBean implements HelloWordRemote {
    public HelloWorldBean() {
    }

    @Override
    public Model sayHello(String world) {
        Model model = new Model();
        model.setName(world);
        model.setSex("男");
        model.setHobby("女");
        return model;
    }
}

3、编写配置

<?xml version="1.0" encoding="UTF-8" ?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
         version="3.1">
    <enterprise-beans>
        <session>
            <ejb-name>HelloWorldBeanEJB</ejb-name>
            <remote>com.phhc.ejb.servcices.HelloWordRemote</remote>
            <ejb-class>com.phhc.ejb.servcices.impl.HelloWorldBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
        </session>
    </enterprise-beans>

</ejb-jar>

4、编写客户端

public class HelloWordController extends HttpServlet {
    @EJB(name = "ejb/HelloWorldBeanEJB")
    private HelloWordRemote helloWord;
   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter pw = response.getWriter();
        String s = JSON.toJSONString(helloWord.sayHello("wanping"));
        pw.write(s);
        pw.close();
    }
}

5、客户端配置(jndi)

?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-web-app PUBLIC ‘-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7.0 Servlet 2.3//EN‘
        ‘http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd‘>
<sun-web-app>
    <ejb-ref>
            <ejb-ref-name>com.phhc.controller.HelloWordController/helloWorld</ejb-ref-name>
    </ejb-ref>
<jsp-config/>
</sun-web-app>

6、结构目录

时间: 2024-08-02 06:16:03

EJB远程接口调用的相关文章

SmartRoute之远程接口调用和负载

基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口调用功能.基于SmartRoute的基础特性,在这基础上扩展的接口调用会变得更简单灵活,其特别点如下:并不需要知道服务地址,只需要明确接口和方法即可以实现远程服务调用:无需任何配置即可实现负载和故障迁移.而这一系列的更利功能都归攻于SmartRoute基础建设! SmartRoute的远程接口调用是

远程接口调用

1.1          第二部分:远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端. 1.1.1         Httpclient简介 1.1.1.1     什么是httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.实现了所有 HTTP

springBoot使用feign实现远程接口调用和错误熔断

1.第一步,新建两个简单的springboot项目并创建rest接口 demo系统的rest接口 plus系统的调用接口 2.在项目pom文件里导入feign和hystrix的pom依赖包 <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <!

java之远程接口调用

1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

以前写的一段aop,远程接口调用的日志。

using System;using System.Collections.Generic;using System.Linq;using System.Text; using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.InterceptionExtension; namespace VirtualRemote.log4net{ public class LogHandler : ICallHandler { /// <s

[go]grpc远程接口调用实现

// grpc序列化/反序列化成对应语言的对象 // 1.写idl(数据类型+方法) // 2.生成对应语言的序列化/反序列化代码 // 3.方法需要自己实现 // 环境(将gopath/bin加入path) //安装grpc引擎 go get -u google.golang.org/grpc //安装grpc-go插件(适配go语言) go get -u github.com/golang/protobuf/protoc-gen-go //helloworld.proto // The re

dubbo_远程同步调用原理

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. Dubbo缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互. 连接个数:单连接 连接方式:长连接 传输协议:TCP 传输方式:NIO异步传输 序列化:Hessian二进制序列化 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串

JBOSS EAP 6.2 -EJB远程调用-客户端的配置

EJB访问方式分为远程客户端访问.本地客户端访问和WebService客户端. 所谓的EJB的远程调用是说客户端与服务端的EJB对象不在同一个JVM进程中. 本地客户端是说客户端与服务端的EJB对象在同一个JVM进程中. WebService客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为@WebMethod的时候,webService客户端才可以访问到. 远程调用 在没有远程调用的时候,我们需要用到别人的数据了,就直接把别人的接口和实现都拿过来了,接着打到自己的包中,这样做一

JBOSS系列 -EJB远程调用-客户端的配置

EJB访问方式分为远程客户端访问.本地客户端访问和WebService客户端. 所谓的EJB的远程调用是说客户端与服务端的EJB对象不在同一个JVM进程中. 本地客户端是说客户端与服务端的EJB对象在同一个JVM进程中. WebService客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为@WebMethod的时候,webService客户端才可以访问到. 远程调用 在没有远程调用的时候,我们需要用到别人的数据了,就直接把别人的接口和实现都拿过来了,接着打到自己的包中,这样做一