`
java-mans
  • 浏览: 11388961 次
文章分类
社区版块
存档分类
最新评论

EJB分布式远程调用的小例子的简单实现。[附源码]

 
阅读更多

EJB分布式远程调用的小例子的简单实现[附源码,欢迎学习研究。]

说起远程分布式应用大家可能都会联想到现在的云计算。基于分布式的架构。

翻出以前的代码,贴在这里,和大家一起学习关于分布式的几点见解。

可惜EJB这种分布式用的不多,不是一些大的项目,大的企业几乎少有人会用到EJB。一般人用RMI或WebService就能完成的东东,没有企业会付出太高的代价。当然还有更简单的基于HTTPURLCOnnection实现的。总之不管哪种都是远程调用的一种实现,这里说下EJB分布式的远程调用。

EBJ是基于接口的编程,所有它一定会有相应的接口级实现类。调用者无须关心如何实现。只用相应接口接收即可。

首先,使用创建一个EBJ项目。[服务端]

定义一个远程接口。用注解@Remote标注。[@Local表示本地。]

package com.tudou.t1Test;

import java.util.List;

import javax.ejb.Remote;

@Remote
public interface StudentDao {
	public List<Student> queryStudents();

	public boolean addStu(Student student);
}

以及它的实现类[@stateless表示的是无状态会话bean,@statefull表示的是有状态会话bean,区别是前者比后者效率高,但是不能保留后者那种在会话中的数据]:

package com.tudou.t1Test;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class StudentDaoBean implements StudentDao {
	// 动态生成entityManager
	@PersistenceContext
	public EntityManager em;

	public boolean addStu(Student student) {
		try {
			em.persist(student);
		} catch (Exception e) {
			return false;
		}
		return true;
	}

	@SuppressWarnings("unchecked")
	public List<Student> queryStudents() {
		Query query = em.createQuery("select s from Student as s");
		return query.getResultList();
	}

}

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

	<persistence-unit name="StudentPu" transaction-type="JTA">
		<jta-data-source>java:/MySqlDS</jta-data-source>
		<properties>
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
		</properties>
	</persistence-unit>

</persistence>

以上的配置文件persistence.xml文件来自JBOSS目录jboss/docs/examples/jca下的mysql-ds.Xml中,JNDI必须保持一致。[注:tomcat不支持分布式,JBOSS和WEBLOGIC可以实现]

附:mysql-ds.xml

<datasources>

  <local-tx-datasource>

    <jndi-name>MySqlDS</jndi-name>

    <connection-url>jdbc:mysql://10.3.34.83:3306/test</connection-url>

    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <user-name>root</user-name>

    <password>root</password>



最后将以上java文件打包成jar包。


编写测试类,进行测试。新建一个java项目[客户端]。导入刚才打包的jar。

package com.tudou.test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.TimeZone;

import javax.naming.Context;
import javax.naming.InitialContext;

import org.junit.BeforeClass;
import org.junit.Test;

import com.tudou.t1Test.Student;
import com.tudou.t1Test.StudentDao;

public class TestStu {
	private static StudentDao studentDao;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		Properties p = new Properties();
		// weblogic值为weblogic.jndi.WLInitialContextFactory
		// JBOSS为org.jnp.interfaces.NamingContextFactory
		p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		// Weblogic为 t3://localhost:7001
		p.setProperty(Context.PROVIDER_URL, "localhost");
		InitialContext init = new InitialContext(p);
		// weblogic为LoginBean#后面是实现类的全路径,包括包名
		// 此时接口中必须配置为:@Stateless(mappedName="LoginBean")
		studentDao = (StudentDao) init.lookup("StudentDaoBean/remote");
	}

	@Test
	public void loginTest() {
		TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		sdf.setTimeZone(timeZone);
		String times = sdf.format(new Date());
		 Student s1 = new Student("scce005", "tudou", times);
		 Student s2 = new Student("scce002", "doudou", times);
		 Student s3 = new Student("scce003", "qq", times);
		 Student s4 = new Student("scce004", "yaerfeng", times);
		boolean flag1 = studentDao.addStu(s1);
		boolean flag2 = studentDao.addStu(s2);
		boolean flag3 = studentDao.addStu(s3);
		boolean flag4 = studentDao.addStu(s4);
		if (flag1 == true) {
			System.out.println("用户1添加成功!!!");
		} else {
			System.out.println("添加失败!!!");
		}
		if (flag2 == true) {
			System.out.println("用户2添加成功!!!");
		} else {
			System.out.println("添加失败!!!");
		}
		if (flag3 == true) {
			System.out.println("用户3添加成功!!!");
		} else {
			System.out.println("添加失败!!!");
		}
		if (flag4 == true) {
			System.out.println("用户4添加成功!!!");
		} else {
			System.out.println("添加失败!!!");
		}
		List<Student> lists = studentDao.queryStudents();
		if (lists != null) {
			System.out.println("学号\t\t姓名\t\t入学日期");
			for (Student s : lists) {
				System.out.println(s.getStuNo() + "\t" + s.getStuName() + "\t\t"
						+ s.getCreateDate());
			}
		} else {
			System.out.println("里面是空的");
		}
	}

}

在测试之下。服务端必须先启动,可以开多个客户端进行测试。注释中有写jboss和weblogic使用的不同。

源码地址:点击打开链接
分享到:
评论

相关推荐

    EJB分布式远程调用的小例子的简单实现

    EJB分布式远程调用的小例子的简单实现。[附源码]

    JNDI调用分布式EJB3 通用接口

    NULL 博文链接:https://gukeming888.iteye.com/blog/1714402

    JAVA上百实例源码以及开源项目源代码

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    JAVA上百实例源码以及开源项目

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    J2EE应用与BEA.WebLogic.Server第2版.pdf

    第六章 远程方法调用和分布式命名 第七章 使用 Java 消息服务进行企业消息传递 第八章 使用会话企业 JavaBean 第九章 实体 EJB 第十章 使用消息驱动 EJB 第十一章 使用 WebLogic Server JavaMail 连接 Internet 邮件...

    java 面试题 总结

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    超级有影响力霸气的Java面试题大全文档

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

    Java数据库编程宝典3

    12.2.1 创建一个简单的servlet 12.3 创建和配置Lo9in servlet 12.3.1 实现会员Web站点 12.3.2 创建Login页面 12.3.3 创建servlet 12.3.4 部署 12.4 使用JSP 12.4.1 在JSP中使用JavaBean 12.4.2 自动类型...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

    二十三种设计模式【PDF版】

    关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...

Global site tag (gtag.js) - Google Analytics