在上一篇如何在EJB3中JNDI调用SessionBean(一)文章中我们解决了测试环境中统一调用JNDI的问题,但是当EJB组件开发完成后,正式部署到正式环境中,客户端调用EJB组件怎样去调用呢?现在我们分析这其中出现的问题。

1、 客户端不在同一个JVM环境中,应该怎样处理?
2、 SessionBean对于客户端是隐藏的,开发客户端的程序员怎么能非常方便的获得SessionBean的绑定名?怎么能方便的得到JNDI上下文呢?
3、 各EJB组件分别部署在不同的服务器上,我们怎么能方便的调用?
4、 各EJB组件如果运行在不同的EJB容器中,我们怎么能方便的得到对应的JNDI上下文环境?
针对这些问题,我们逐步的去分析解决。
客户端不在同一个JVM中这是普遍出现的情况,我们可能将web客户端运行在Tomcat上,而EJB运行在JBoss容器中,对于这种情况,我们如果采用上面介绍的第一种情况来获得JNDI上下文就非常不可行,因为EJB的环境的变化会导致太多程序代码的改动,为日后的维护埋下了隐患。所以只能采用第二种方式,将JNDI上下文信息配置在属性文件中,即使以后EJB的环境更换,也可以通过修改配置文件来实现这种改变。
 通过JNDI的方式来调用EJBSessionBean,必然少不了为SessionBean绑定JNDI名。默认的情况下(JBoss),容器会以实现类的类名作为JNDI名。比如getIntialContext().lookup(“LoginBean/remote”); LoginBean就是Login接口的实现类的名字。
@Stateless
@Remote(Login.class)
public class LoginBean implements Login{}
如果这样去做的话,我们开发客户端的程序员就必须要知道这个SessionBean接口的实现类是什么名字,这不是一种好的方式,违背了我们隐藏实现的编程思想。才开始大家建议,约定SessionBean的命名格式为接口+Bean后缀,这是一个比较可行的解决方案。但是一个约定好的命名格式,只能给我们的是一个已知的字符串,我们利用这个字符串所能做的事情太少了。我们利用@Stateless中的name属性,可以为Session Bean起个别名,这个东西应该很好的利用起来。我们再一次讨论,对于客户端来说,什么是透明的呢?无疑是接口,我们能不能把接口的名字作为SessionBean的别名呢。这个主意不错,大家一致通过,看了网上的一些例子,好多人也是采用这种方式。但是也有不好的方面,如果一个SessionBean实现多个接口就不是很好处理了。我们只能再次约定,一个SessionBean只能对应着一个远程接口。这样我们只知道接口就能方便的调用EJB了。
但问题又接踵而至,我们使用EJB作为组件开发技术,很大程度上是利用它强大的分布式计算的能力,这就要求每个EJB组件有可能运行在不同的服务器上,我们调用这些EJB组件,只采用一套上下文配置的方式是非常不可行的。我们需要为每个组件配置各自的JNDI上下文环境。怎么去做呢?在客户端我们为每个组件建立一个Properties文件,里面包含了该组件的JNDI配置。我们调用不同的组件时,我们就去获取该组件的JNDI配置,这已经很好的解决了相关的问题,完全可以适应EJB分布式的环境,但是有没有更好的方法让用户不再去选择每个组件的配置,让他们感觉和本地调用一样简单呢。于是我们在Session Bean接口上做了一些文章,通过自定义annotation的方式,来为每个接口标志相关的组件信息,通过程序解析annotation来获得组件的信息来进行相关的处理。我们定义一个@ComponentInfo的元数据来标注组件的相关信息。
@Target( { TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ComponentInfo {
 String name();
 String description() default "";
}
 name属性为组件的名字,description顾名思义就是组件的描述,通过作用在每个接口上的这个annotation,我们就可以获得组件名称。我们约定客户端的JNDI配置的属性文件的文件名要和这里的组件名称对应,这样我们就可以自动找到该组件需要的JNDI配置。
为了方便EJB组件的开发,我们可以为每个EJB组件做一个全局的接口。将该annotation作用在最上层父类的TYPE上,而该组件所有的SessionBean接口都继承这个接口。
问题都解决了吗?我们不断地寻找问题。
现在问题来了,不同的容器存在自己特有的lookup实现方式,太郁闷了,这样就要将EJB组件和容器绑死了,这为以后EJB组件的移植设置了巨大的障碍。
那么我们该如何解决呢?
请看下一篇:如何在EJB3中JNDI调用SessionBean(三)

转载于:https://www.cnblogs.com/posoft/articles/1526887.html

如何在EJB3中JNDI调用SessionBean(二)相关推荐

  1. 函数调用关系图如何画_程序是如何在 CPU 中运行的(二)

    笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~ 前言 在上一篇文章中<程序是如何在 CPU 中运行的(一)>笔者讲述了程序中一条一条指令以及一条一条 ...

  2. AngularJS如何在filter中相互调用filter

    调用方式如下: app.filter('filter2', function( $filter ) {return function( input) {return $filter('filter1' ...

  3. 如何在QII中直接调用ModelSim

    转载自http://lt981917.blog.163.com/blog/static/4745880420108133330898/ 折腾了一下午,终于把ModelSim仿真QII给搞定了,以下内容 ...

  4. php php_dbase.dll,php – 如何在Windows中解决“调用未定义函数dbase_open()”错误

    嗨,我想加载DBF文件到 mysql,使用xampp,php版本5.5.6 我写了下面的代码, 但我得到错误- Fatal error: Call to undefined function dbas ...

  5. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  6. 如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock...

    如何在App中实现朋友圈功能 之二 快速实现用户信息的自定义 自我关联社交元素: anSocial中很多的社交元素API,如帖子(Post).相册(Album).文件(File)等,这些API的可选参 ...

  7. 让一个图片填满一个控件_如何在Android中实现一个全景图控件(二)

    一.背景 在 如何在Android中实现一个全景图控件(一)中,介绍了项目的一些基本情况(有 demo 演示),如果项目对你有帮助,希望文章赏个赞,项目 star 一下. 项目地址:https://g ...

  8. linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

    今日锦囊 特征锦囊:如何在Python中处理不平衡数据 ? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何 ...

  9. 在html页面上引用脚本文件,如何在html中调用JS文件

    一.JavaScript脚本语言的特性 JavaScript脚本语言是一种面向浏览器的网页脚本编程语言.脚本语言有以下几个特性: 1.在客户端执行.完全在用户的计算机上运行,无须经过服务器. 2.面向 ...

最新文章

  1. 清华旷视让全连接层“内卷”,卷出MLP性能新高度
  2. svn switch 导致个别文件switch失败
  3. 前端学习(2455):layout处理
  4. cocos2d对动画的各种操作
  5. 【算法系列之八】删除链表的倒数第N个节点
  6. map/vector erase
  7. oracle 函数 abs,Oracle 函数(八)
  8. purcell的emacs配置中的自动补全功能开启
  9. Kubectl merge kubeconfig.yml 文件
  10. 【python数据分析】分组聚合操作
  11. mysql 存储过程 if !=_mysql 存储过程 if !=
  12. IT6801FN图像质量调优
  13. 刷宝短视频Auto.js挂机源码讲解
  14. TOM、腾讯、网易|你了解大厂企业邮箱的登陆入口吗?
  15. samba 设置 netbios
  16. 架构师知识体系(5)--建立自己的知识体系吧
  17. 微信公众号nodejs版
  18. STM32使用HAL库驱动SDRAM
  19. Nacos 在 Apache APISIX API 网关中的服务发现实践
  20. yum的方式安装mysql_CentOS 通过yum方式快速安装MySQL

热门文章

  1. 转载《OpenGIS: Open Geodata Interoperation Specification》中文翻译
  2. 2020-09-08 Win7-Win10内部版本号
  3. Android 中关于Cursor类的介绍
  4. 大学计算机相关理论,大学计算机理论基础 大学计算机基础理论题.doc
  5. python怎么把变量付给数组_使用Python将数组的元素导出到变量中(unpacking)
  6. 【数据结构的魅力】002.单向、双向链表栈和队列递归
  7. mysql union 不同字段_mysql中union和union all的区别和注意点
  8. hadoop与mysql的区别_数据库与hadoop与分布式文件系统的区别和联系
  9. java遍历hashmapk v_Java HashMap 遍历方式探讨
  10. classnotfoundexception是什么异常_大佬说“异常信息”是优秀程序员编写代码的宝贵财富,这是真的吗...