jndi配置mq的理解以及jndi两种公司形式的异同绑定和两种公司形式的异同参数取出的异同

WAS7.0 + MQ 7.0 + JNDI 最简配备和收发示例_读书人
WAS7.0 + MQ 7.0 + JNDI 最简配备和收发示例
&来源:读书人网&【读书人网():综合教育门户网站】
WAS7.0 + MQ 7.0 + JNDI 最简配置和收发示例?2、在WAS上配置JNDI的JMS队列连接工厂,资源――JMS――队列连接工
WAS7.0 + MQ 7.0 + JNDI 最简配置和收发示例 ?2、在WAS上配置JNDI的JMS队列连接工厂,资源――JMS――队列连接工厂???2.1、选择一个作用域?2.2、点击【新建】?2.3、选择 JMS 资源提供程序,这里选?WebSphere MQ messaging provider??2.4、点击【确定】?2.5、填写【名称】和【JNDI名称】???2.6、点击【下一步】??2.7、继续点击【下一步】,输入队列管理器名称???2.8、点击【下一步】,????????? 【传输】选“客户机”????????? 【主机名】写MQ所在主机地址? ? ? ? ? 【端口】写MQ监听器的端口,默认1414????????? 【服务器连接通道】,写连接通道的名字??2.9、点击【测试连接】,并测试成功???2.10、摘要,并点击【完成】???3、配置队列JNDI?3.1、点击【新建】???3.2、选择 JMS 资源提供程序???3.3、点击【下一步】、填写各项??3.4、点击【WebSphere MQ 连接属性】,填写各个属性??3.5、点击【确定】。?4、编写发送方程序?package jmsdemo.import java.io.UnsupportedEncodingEimport java.util.Pimport javax.jms.BytesMimport javax.jms.Cimport javax.jms.ConnectionFimport javax.jms.Dimport javax.jms.JMSEimport javax.jms.MessagePimport javax.jms.Simport javax.naming.Cimport javax.naming.InitialCimport javax.naming.NamingEpublic class JMSClientProducer?{public static void main(String[] args)?{ConnectionFactory connectionFactory =Connection connection =Session session =Destination destination = // 它有两个子接口 TemporaryQueue 和 TemporaryTopic 见《精通MQ》P249MessageProducer messageProducer =try{Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");p.put(Context.SECURITY_AUTHENTICATION, "simple"); ?p.put(Context.SECURITY_PRINCIPAL, "LZC"); ?p.put(Context.SECURITY_CREDENTIALS, "");?p.put(Context.URL_PKG_PREFIXES, "com.ibm.ws.naming");?p.put(Context.PROVIDER_URL, "iiop://127.0.0.1:2813/");?Context context = new InitialContext(p);Object jndi_ConnectionFactory = context.lookup("MQConnectionFactoryDEMO");Object jndi_Destionation = context.lookup("队列DEMO");connectionFactory = (ConnectionFactory) jndi_ConnectionFdestination = (Destination) jndi_Dconnection = connectionFactory.createConnection();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);messageProducer = session.createProducer(destination);messageProducer.setTimeToLive(100000);BytesMessage message = session.createBytesMessage();message.setStringProperty("MsgID", "MsgID_001");message.writeBytes("MESSAGECONTENT".getBytes("GBK"));message.setJMSCorrelationID("CorrelationID_001");messageProducer.send(message);}catch ( NamingException e ){}catch ( JMSException e ){}catch ( UnsupportedEncodingException e ){}finally{if ( connection != null ){if ( messageProducer != null ){try{messageProducer.close();}?catch (JMSException e)?{e.printStackTrace();}}if ( session != null ){try?{session.close();}?catch (JMSException e)?{e.printStackTrace();}}try?{connection.close();}?catch (JMSException e){e.printStackTrace();}}}}}??5、编写接收方程序package jmsdemo.import java.util.Pimport javax.jms.Cimport javax.jms.ConnectionFimport javax.jms.Dimport javax.jms.JMSEimport javax.jms.Mimport javax.jms.MessageCimport javax.jms.Simport javax.jms.TextMimport javax.naming.Cimport javax.naming.InitialCimport javax.naming.NamingEpublic class JMSClientConsumer?{public static void main(String[] args)?{ConnectionFactory connectionFactory =Connection connection =Session session =Destination destination =MessageConsumer messageConsumer =try{Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");p.put(Context.SECURITY_AUTHENTICATION, "simple"); ?p.put(Context.SECURITY_PRINCIPAL, "LZC"); ?p.put(Context.SECURITY_CREDENTIALS, "");?p.put(Context.URL_PKG_PREFIXES, "com.ibm.ws.naming");?p.put(Context.PROVIDER_URL, "iiop://127.0.0.1:2813/");?Context context = new InitialContext(p);Object jndi_ConnectionFactory = context.lookup("MQConnectionFactoryDEMO");Object jndi_Destionation = context.lookup("队列DEMO");connectionFactory = (ConnectionFactory) jndi_ConnectionFdestination = (Destination) jndi_Dconnection = connectionFactory.createConnection();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);messageConsumer = session.createConsumer(destination);connection.start();Message m = messageConsumer.receive(1000 * 1);if ( m instanceof TextMessage ){TextMessage textMessage = (TextMessage)System.out.println(textMessage.getText());}}catch ( NamingException e ){}catch ( JMSException e ){}finally{if ( connection != null ){if ( messageConsumer != null ){try{messageConsumer.close();}?catch (JMSException e)?{e.printStackTrace();}}if ( session != null ){try?{session.close();}?catch (JMSException e)?{e.printStackTrace();}}try?{connection.close();}?catch (JMSException e){e.printStackTrace();}}}?}}此配置文件定义需要在JNDI名字空间中创建的主题;:第一列:主题在JNDI中的名称,用于在程序中l;7.queue.conf配置说明;此配置文件定义需要在JNDI名字空间中创建的队列;需要注意的是实际队列需要在相应的队列管理器中首先;8.脚本运行;1.1.1.5、如何将MQ的队列管理器配置成JN;目前是使用LDAP作为JNDI的容器,但是有些地;将MQ的队列
此配置文件定义需要在JNDI名字空间中创建的主题(Topic)基本属性 每行配置一条记录,每个记录由好几个字段组成,字段之间用TAB键或空格分隔; 各个字段的含义如下
: 第一列: 主题在JNDI中的名称,用于在程序中lookup相应的主题使用 第二列: 实际主题的名称; 不需要手工创建,直接在这里定义即可
7. queue.conf配置说明
此配置文件定义需要在JNDI名字空间中创建的队列(Queue)基本属性 每行配置一条记录,每个记录由好几个字段组成,字段之间用TAB键或空格分隔; 各个字段的含义如下: 第一列: 队列在JNDI中的名称,用于在程序中lookup相应的队列使用 第二列: 实际队列的名称;
需要注意的是实际队列需要在相应的队列管理器中首先创建, 否则lookup会失败
8. 脚本运行
1.1.1.5、 如何将MQ的队列管理器配置成JNDI名字空间容器
目前是使用LDAP作为JNDI的容器,但是有些地方LDAP无法使用,这时候可以考虑将MQ的队列管理器配置成JNDI的容器。 修改好配置文件,直接敲入initJNDI.sh即可按照提示进行操作; [1] Initial MQ JNDI configuration. [2] Clear predefined MQ JNDI configuration. [q] quit Select choice:[q]
输入1,回车,则会提示: Are you sure to init MQ JNDI configuration?[y/N]
输入y或者Y,回车,则开始根据配置文件进行MQ的JNDI配置初始化操作; 输入2,回车,则会提示: Are you sure to clear all MQ JNDI configuration?[y/N]
输入y或者Y,回车,则会删除原先已经定义的所有JNDI配置;
输入q或直接回车,则退出
将MQ的队列管理器配置成JNDI的容器需要以下步骤:
1. 新建一个队列管理器,如名字为QM.JNDI:crtmqm QM.JNDI (注意:在建立这
个JNDI管理器的时候,应该保证其ccsid和其他管理器一致,如其他队列管理器是通过脚本建立的应该是1208,需要手工修改调整QM.JNDI成ccsid 1208)
2. 启动队列管理器:strmqm QM.JNDI
3. 启动队列管理器命令服务中心:strmqcsv QM.JNDI
4. 启动队列管理器监听进程:runmqlsr Cm QM.JNDI Ct tcp Cp 9827 & 配置JMS:
1. 下载me01.zip,并解压里面的mqcontext.jar到/opt/mqm/java/lib目录;
2. 下载ms0b.zip,并解压里面的com.ibm.mq.pcf.jar到/opt/mqm/java/lib目
在IBM的supportPac网站有下载
//如果有这两个jar包,只需要直接放到相应目录即可;
3. 修改mqm用户的环境变量,在CLASSPATH中增加这两个jar包,完成后source
一下新的环境变量:. ~mqm/.profile;
4. 修改/opt/mqm/java/bin目录下面的JMSAdmin.config文件,修改或增加以
注释掉原先的INITIAL_CONTEXT_FACTORY,增加一行:
INITIAL_CONTEXT_FACTORY=com.ibm.mq.jms.context.WMQInitialContextFactory
注释掉原先的PROVIDER_URL,增加一行:
PROVIDER_URL=192.168.1.21:9827/SYSTEM.DEF.SVRCONN
运行JMSAdmin,如果不成功则检查前面的配置,如果成功则根据实际情况定义相应的TCF/QCF/T/Q;
1.1.1.6、 测试JMS是否安装成功
测试相应的p2p或pub/sub侦察功能,从mq_script_4.0.tar软件包中提取mqJMSTest包
1. 修改config.xml配置文件,配置相应ldap参数
2. 运行p2p.sh和ps.sh
在提示符下输入任意字符,能回复相同的字符显示,表示安装成功; [I] Connect to TopicConnectionFactory: MON [I] Subscriber message from topic: cn=IPNetFMEventPublishTopic1 [I] Publish message to topic: cn=IPNetFMEventPublishTopic1
Enter message to publish or type 'quit' to exit& test
[I] Received a text message: test Enter message to publish or type 'quit' to exit& quit Close publisher... Close subscriber... Close pubSession... Close subSession... Close connection...
All resource released, exit!
附录1:监控MQ队列使用情况,是否有淤塞现象
从mq_script_4.0.tar软件包中提取mqMonitor包
查看readme文件,配置相应需要监控的队列
1.1.1.7、 MQ SERVER优化
此处只介绍优化操作方法,详细请参考MQ相关文档
1.修改文件
/var/mqm/qmgrs/QM_BASE/qm.ini,
/var/mqm/qmgrs/QM_DC/qm.ini,
/var/mqm/qmgrs/QM_TOPIC/qm.ini,
/var/mqm/qmgrs/QM_STOPE/qm.ini,
/var/mqm/qmgrs/QM_WATCHDOG/qm.ini.
修改下列内容:
MaxChannels=1000
MaxActiveChannels=1000是最大连接数,最大为9999,可相应的修改)
MCATYPE=THREAD
MaxChannels=1000
MaxActiveChannels=1000
MQIBindType=FASTPATH
PipeLineLength=2
TuningParameters:
DefaultQBufferSize=128000
DefaultQFileSize=
LogPrimaryFiles=3
LogSecondaryFiles=2
LogFilePages=8192
LogType=CIRCULAR
LogBufferPages=512
LogPath=/var/mqm/log/QM_BASE/
LogWriteIntegrity=TripleWrite
Name=AuthorizationService
EntryPoints=10
ServiceComponent:
Service=AuthorizationService
Name=MQSeries.UNIX.auth.service
Module=/opt/mqm/lib/amqzfu
ComponentDataSize=0
2.增加队列的深度定义,依次执行:
runmqsc QM_BASE
alter qlocal(Q_COLLECT_TO_DA_01) maxdepth(100000) alter qlocal(Q_FMCLT_TO_CLT_CENTER) maxdepth(100000) alter qlocal(Q_RMDA_TO_CORE) maxdepth(100000)
alter qlocal(Q_RMPROBE_TO_RM_DA) maxdepth(100000) end
runmqsc QM_STOPE
alter qlocal(Q_DCHART_TO_CLIENT) maxdepth(100000) alter qlocal(Q_DCHART_TO_SRV) maxdepth(100000) alter qlocal(Q_KPICOLLECTOR) maxdepth(100000) alter qlocal(Q_PROBE) maxdepth(100000)
alter qlocal(Q_TWIRLER) maxdepth(100000)
runmqsc QM_WATCHDOG
alter qlocal(Q_TO_SCM_GROUP1) maxdepth(100000) alter qlocal(Q_TO_SCM_GROUP2) maxdepth(100000)
alter qlocal(Q_TO_WATCHDOG_GROUP1) maxdepth(100000) alter qlocal(Q_TO_WATCHDOG_GROUP2) maxdepth(100000) end
3.重新启动所有的队列管理器
endmqm QM_BASE
endmqm QM_STOPE
endmqm QM_SCOPE
endmqm QM_WATCHDOG
strmqm QM_BASE
strmqm QM_STOPE
strmqm QM_SCOPE
包含各类专业文献、专业论文、中学教育、高等教育、行业资料、幼儿教育、小学教育、文学作品欣赏、外语学习资料、51MQ安装IBM MQ等内容。 
 MQ安装_计算机软件及应用_IT/计算机_专业资料。本文主要介绍 WebSphere MQ 7.0...MQ安装IBM MQ 26页 免费 MQ 安装手册 75页 免费 二MQ的安装和配置 33页 ...  基础技能_MQ安装及简单使用_计算机软件及应用_IT/计算机_专业资料。IBM MQ 的简单使用方法 入门级别北京神州泰岳软件股份有限公司 基础技能_MQ 安装及简单使用 北京...  一、 安装 MQ MQ 的安装有一个前提,就是 IBM 自己定制的 Eclipse,版本随 MQ 的版本不一样,以 最终拿到的 MQ 正式版安装包为准,Eclipse 也是集成在该安装包...  MQ(联网版) 2. 安装 MQ(联网版) 安装先决条件 1、硬件环境要求 任何基于 32 位 Intel 处理器 IBM PC 机(或兼容机)。 支持 SNA LU 6.2、TCP/IP、...  IBM WebSphere MQ介绍安装以及配置服务详解_计算机软件及应用_IT/计算机_专业资料。MQ的安装和配置 IBM WebSphere MQ 介绍安装以及配置服务详解首先介绍一下 MQ MQ ...  安装 WMQ 及 WMB 10. 点击左边 WebSphere MQ 安装, 在 MQ 安装界面, 选择语言, 单击 “启动 IBM WebSphere MQ 安装程序” 。 11. 选择“我接受许可协议中...  1、创造MQ用户和用户组,命令如下: groupadd mqm useradd -d /var/mqm -g ...ibm-java2-x86_64-sdk-5.0-5.0.x86_64.rpm MQSeriesSDK-7.0.0-0.x86_...  IBMJava2-SDK-1.4.2-0.0.i386.rpm IBM 的 Java 安装程序。 MQSeriesRuntime-6.0.0-0.i386.rpm MQ 所需的运行时程序。 MQSeriesSDK-6.0.0-0.i386.rpm ...  MQ7安装_计算机软件及应用_IT/计算机_专业资料。第1章 MQ 的安装 1.1 Linux 下 MQ7.0 的安装 1.1.1 软件版本及补丁 ? 软件版本:IBM WebSphere MQ Versio...java(117)
最近写书,写到JNDI,到处查资料,发现所有的中文资料都对JNDI解释一通,配置代码也是copy的,调了半天也没调通,最后到SUN的网站参考了一下他的JNDI tutorial,终于基本上彻底明白了
和多数java服务一样,SUN对JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现:
&&&&&&& private static Object jndiLookup()
throws Exception {&&
&&&&&&&&&&&InitialContext ctx = new InitialContext();&&
&&&&&&&&&&&return ctx.lookup(&java:comp/env/systemStartTime&);&&
&&&&&&&& }&
上述代码在J2EE服务器环境下工作得很好,但是在main()中就会报一个NoInitialContextException,许多文章会说你创建InitialContext的时候还要传一个Hashtable或者Properties,像这样:
&&&&&&&& Hashtable env = new Hashtable();&&
&&&&&&&& env.put(Context.INITIAL_CONTEXT_FACTORY, &weblogic.jndi.WLInitialContextFactory&);&&
&&&&&&&& env.put(Context.PROVIDER_URL,&t3://localhost:7001&);&&
&&&&&&&& InitialContext ctx = new InitialContext(env);&
这个在WebLogic环境下是对的,但是换到JBoss呢?再用JBoss的例子?
其实之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了,不要搞env那么麻烦,搞了env你的代码还无法移植,弄不好管理员设置服务器用的不是标准端口还照样抛异常。
但是在单机环境下,可没有JNDI服务在运行,那就手动启动一个JNDI服务。我在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:
LDAP,CORBA,RMI,DNS。
这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。
现在我们就在main()中启动基于RMI的JNDI服务并且绑一个Date对象到JNDI上:
&&&&&LocateRegistry.createRegistry(1099);&&
&&&& System.setProperty(Context.INITIAL_CONTEXT_FACTORY, &com.sun.jndi.rmi.registry.RegistryContextFactory&);&&
&&&& System.setProperty(Context.PROVIDER_URL, &rmi://localhost:1099&);&&
&&&& InitialContext ctx = new InitialContext();&&
&&&& class RemoteDate extends Date
implements Remote {};&&
&&&& ctx.bind(&java:comp/env/systemStartTime&, new RemoteDate());&&
&&&& ctx.close();&
注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了,否则,你又得写Hashtable env = ...
在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就自己扩展一个。
其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。
在后面的代码中查询就简单了:
&&&& InitialContext ctx = new InitialContext();&&
&&&& Date startTime = (Date) ctx.lookup(&java:comp/env/systemStartTime&);&
在SUN 的JNDI tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory类,但是我死活在JDK 5中没有找到这个类,也就是NoClassDefFoundError,他也不说用的哪个扩展包,我也懒得找了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:428591次
积分:5948
积分:5948
排名:第3392名
原创:106篇
转载:322篇
评论:76条
(1)(1)(1)(2)(1)(1)(1)(1)(11)(5)(12)(22)(43)(53)(29)(10)(21)(2)(15)(1)(9)(2)(31)(8)(4)(1)(1)(13)(10)(2)(1)(5)(50)(41)(1)(1)(1)(2)(1)(1)(2)(8)(3)发布时间: 18:03:55
编辑:www.fx114.net
本篇文章主要介绍了"jndi",主要涉及到jndi方面的内容,对于jndi感兴趣的同学可以参考一下。
作者:ITPUB论坛 来源:IT168   收集 
  当代的企业级应用决不可能是一个个的独立系统。在企业中,一般都会部署多个彼此连接的、相互通过不同集成层次进行交互的企业级应用,同时这些应用又都有可能与其它企业的相关应用连接,从而构成一个结构复杂的、跨越Intranet和Internet的分布式企业应用群集。
&&& 企业级应用是指那些为商业组织、大型企业而创建并部署的解决方案及应用。这些大型企业级应用的结构复杂,涉及的外部资源众多、事务密集、数据量大、用户数多,有较强的安全性考虑。
&&& 当代的企业级应用决不可能是一个个的独立系统。在企业中,一般都会部署多个彼此连接的、相互通过不同集成层次进行交互的企业级应用,同时这些应用又都有可能与其它企业的相关应用连接,从而构成一个结构复杂的、跨越Intranet和Internet的分布式企业应用群集。其中,连接企业内部各种应用的技术称为EAI(Enterprise Application Integration, 企业应用集成),而连接企业间各种应用的技术称为B2BI(Business-To-Business Integration, 企业间集成),采用EAI、B2BI技术及早先的N层体系架构就是当今企业级应用的最大特征。
&&& 此外,作为企业级应用,其不但要有强大的功能,还要能够满足未来业务需求的变化,易于升级和维护。
&&& 企业级应用架构
&&& 下面我们使用一个图示来简单地解析一下企业级应用的架构,见图1。
&&&&&&& 图1 企业级应用的体系架构
&&& 这个体系架构的主体是MVC架构。MVC是Model/View/Control的缩写。Model/View/Control是软件设计的典型结构。在这种设计结构下,一个应用被分为三个部分:Model、View和Controller,每个部分负责不同的功能。Model是指对业务数据/信息的处理模块,包括对业务数据的存取、加工、综合等;View是指用户界面,也就是面向用户的数据表示;Controller则负责View和Model之间的流程控制,也就是完成两个方向的动作:1.将用户界面(View)的操作映射到具体的Model,以完成具体的业务逻辑;2. 将通过Model处理完的业务数据及时反应到用户界面(View)上。
&&& MVC架构使得应用程序的结构更加清晰,通过将代码按照层次划分为业务逻辑/数据、用户界面和应用流程控制这三个层次,增强代码稳定性。我们知道,对于Model、View、Controller这三部分功能来讲,View的实现一般是由界面设计人员和界面程序员来完成,Model则是由业务逻辑程序员来完成,Controller则一般由负责整体控制的程序员来完成。Controller部分的代码比较稳定,一般会实现一个通用的架构;而Model则跟随商务流程的变化而变化;View的更改则是随着用户需求的更改而更改。这种模块功能的划分有利于在代码修改过程中进行模块的隔离,而不需要把具有不同功能的代码混杂在一起造成混乱。对于项目开发而言,有利于在项目小组内按照小组成员各自的擅长进行分工,有利于三个部分并行开发、加快项目进度。
&&& 企业级资源连接
&&& 对于Model部分,也就是业务逻辑的处理部分,一般总是对商务数据进行处理、加工、综合等。对于企业级应用而言,商袷?萦辛街掷丛矗?恢质鞘?菘猓?硪恢衷蚴瞧渌?钠笠导队&孟低场?BR&
&&& 对于数据库而言,这应当是大家熟悉的领域。我们通过使用数据库驱动程序,利用SQL来查询、操纵数据库。而对于其它的企业级应用而言,一般这些应用都会提供API,通过这些API,其它的应用就能够存取访问其中的数据,甚至是触发这些企业级应用中的一些业余流程。
&&& 企业级平台的特征
&&& 企业级应用需要使用优秀的企业级应用体系结构,而优秀的企业级应用体系结构通常来自于优秀的解决方案。应用程序设计开始就要考虑其体系结构的合理性、灵活性、健壮性,从而既可满足企业级应用的复杂需求,也能为今后系统的调整和升级留有余地。体系结构影响了整个应用的生命周期,实际上能够延长整个应用的生命周期,同时增强了用户在多变的商业社会中的适应性,减少了系统维护的开销和难度,从而给用户带来最大的利益。
&&& 一个理想的企业级应用系统平台应该具有如下特征:
&&& ◆ 部署、开发和维护的有效性;
&&& ◆ 系统运行的健壮性和可靠性;
&&& ◆ 具备失败恢复的能力;
&&& ◆ 能够处理海量的数据;
&&& ◆ 能够同时支持数百个用户;
&&& ◆ 具备很高的安全性;
&&& ◆ 数据的高可用性;
&&& ◆ 可以迅速地开发和部署新的应用程序;
&&& ◆ 简化组件重用;
&&& ◆ 直观的编程模型;
&&& ◆ 支持行业标准和通用编程接口;
&&& ◆ 适用与小、中、大各种规模的应用系统;
&&& ◆ 系统费用随系统规模的增长而线性增长;
&&& ◆ 不断进行技术升级,以满足不断涌现的需求。
&&&&&&& 使用J2EE架构企业级应用
&&& 为了满足架构企业级应用的需求,Java的创始人Sun公司在早期的J2SE(Java 2 Platform Standard Edition)基础上,针对企业级应用的各种需求,主导并创造了J2EE(Java 2 Platform Enterprise Edition)。
&&& 那么到底什么是J2EE呢?从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应用过程中的产物。目前,Java平台有三个版本:适用于小型设备和智能卡的J2ME(Java 2 Platform Micro Edition)、适用于桌面系统的J2SE和适用于企业级应用的J2EE。Sun推出J2EE的目的是为了克服传统Client/Server模式的弊病,迎合Browser/Server架构的潮流,为应用Java技术开发服务器端应用提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是一个标准,而不是一个现成的产品。各个平台开发商按照J2EE规范分别开发了不同的J2EE应用服务器,J2EE应用服务器是J2EE企业级应用的部署平台。由于它们都遵循了J2EE规范,因此,使用J2EE技术开发的企业级应用可以部署在各种J2EE应用服务器上。
&&& 为了推广并规范化使用J2EE架构企业级应用的体系架构,Sun同时给出了一个建议性的J2EE应用设计模型:J2EE Blueprints。J2EE Blueprints提供了实施J2EE企业级应用的体系架构、设计模式和相关的代码,通过应用J2EE Blueprints所描述的体系模型,能够部分简化架构企业级应用这项复杂的工作。J2EE Blueprints是开发人员设计和优化J2EE组件的基本原则,同时为围绕开发工作进行职能分工给出了指导性策略,以帮助应用开发设计人员合理地分配技术资源。
&&& 下面我们参照J2EE Blueprints,结合最新版的J2EE规范(J2EE 1.4),从整体上阐述如何使用J2EE架构企业级应用。
&&&&&&& 图2 使用J2EE架构企业级应用的体系架构
&&& 图2给出了使用J2EE架构企业级应用的体系架构。J2EE将组成一个完整企业级应用的不同部分纳入不同的容器(Container),每个容器中都包含若干组件(这些组件是需要部署在相应容器中的),同时各种组件都能使用各种J2EE Service/API。J2EE容器包括:
&&& ◆ Web容器 服务器端容器,包括两种组件JSP和Servlet,JSP和Servlet都是Web服务器的功能扩展,接受Web请求,返回动态的Web页面。Web容器中的组件可使用EJB容器中的组件完成复杂的商务逻辑。
&&& ◆ EJB容器 服务器端容器,包含的组件为EJB(Enterprise JavaBeans),它是J2EE的核心之一,主要用于服务器端的商业逻辑的实现。EJB规范定义了一个开发和部署分布式商业逻辑的框架,以简化企业级应用的开发,使其较容易地具备可伸缩性、可移植性、分布式事务处理、多用户和安全性等。
&&& ◆ Applet容器 客户端容器,包含的组件为Applet。Applet是嵌在浏览器中的一种轻量级客户端,一般而言,仅当使用Web页面无法充分地表现数据或应用界面的时候,才使用它。Applet是一种替代Web页面的手段,我们仅能够使用J2SE开发Applet,Applet无法使用J2EE的各种Service和API,这是为了安全性的考虑。
&&& ◆ Application Client容器 客户端容器,包含的组件为Application Client。Application Client相对Applet而言是一种较重量级的客户端,它能够使用J2EE的大多数Service和API。
&&& 通过这四个容器,J2EE能够灵活地实现前面描述的企业级应用的架构。
&&& 在View部分,J2EE提供了三种手段:Web容器中的JSP(或Servlet)、Applet和Application Client,分别能够实现面向浏览器的数据表现和面向桌面应用的数据表现。Web容器中的Servlet是实现Controller部分业务流程控制的主要手段;而EJB则主要针对Model部分的业务逻辑实现。至于与各种企业资源和企业级应用相连接,则是依靠J2EE的各种服务和API。
&&& 在J2EE的各种服务和API中,JDBC和JCA用于企业资源(各种企业信息系统和数据库等)的连接,JAX-RPC、JAXR和SAAJ则是实现Web Services和Web Services连接的基本支持。
&&& J2EE的各种组件
&&& 我们就J2EE的各种组件、服务和API,进行更加详细的阐述,看看在开发不同类型的企业级应用时,根据各自需求和目标的不同,应当如何灵活使用并组合不同的组件和服务。
&&& & Servlet
&&& Servlet是Java平台上的CGI技术。Servlet在服务器端运行,动态地生成Web页面。与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更容易使用。对于Servlet,重复的请求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问的。
&&& JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术。从这一点来看,非常类似Microsoft ASP、PHP等技术。借助形式上的内容和外观表现的分离,Web页面制作的任务可以比较方便地划分给页面设计人员和程序员,并方便地通过JSP来合成。在运行时态,JSP将会被首先转换成Servlet,并以Servlet的形态编译运行,因此它的效率和功能与Servlet相比没有差别,一样具有很高的效率。
&&& EJB定义了一组可重用的组件:Enterprise Beans。开发人员可以利用这些组件,像搭积木一样建立分布式应用。在装配组件时,所有的Enterprise Beans都需要配置到EJB服务器(一般的Weblogic、WebSphere等J2EE应用服务器都是EJB服务器)中。EJB服务器作为容器和低层平台的桥梁管理着EJB容器,并向该容器提供访问系统服务的能力。所有的EJB实例都运行在EJB容器中。EJB容器提供了系统级的服务,控制了EJB的生命周期。EJB容器为它的开发人员代管了诸如安全性、远程连接、生命周期管理及事务管理等技术环节,简化了商业逻辑的开发。EJB中定义了三种Enterprise Beans:
&&& ◆ Session Beans
&&& ◆ Entity Beans
&&& ◆ Message-driven Beans
&&& & JDBC
&&& JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据库开发人员能够用标准Java API编写数据库应用程序。JDBC API主要用来连接数据库和直接调用SQL命令执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句及带IN和OUT参数的存储过程。Java中的JDBC相当与Microsoft平台中的ODBC(Open Database Connectivity)。
&&& JMS(Java Message Service,Java消息服务)是一组Java应用接口,它提供创建、发送、接收、读取消息的服务。JMS API定义了一组公共的应用程序接口和相应语法,使得Java应用能够和各种消息中间件进行通信,这些消息中间件包括IBM MQ-Series、Microsoft MSMQ及纯Java的SonicMQ。通过使用JMS API,开发人员无需掌握不同消息产品的使用方法,也可以使用统一的JMS API来操纵各种消息中间件。通过使用JMS,能够最大限度地提升消息应用的可移植性。 JMS既支持点对点的消息通信,也支持发布/订阅式的消息通信。
&&& & JNDI
&&& 由于J2EE应用程序组件一般分布在不同的机器上,所以需要一种机制以便于组件客户使用者查找和引用组件及资源。在J2EE体系中,使用JNDI(Java Naming and Directory Interface)定位各种对象,这些对象包括EJB、数据库驱动、JDBC数据源及消息连接等。JNDI API为应用程序提供了一个统一的接口来完成标准的目录操作,如通过对象属性来查找和定位该对象。由于JNDI是独立于目录协议的,应用还可以使用JNDI访问各种特定的目录服务,如LDAP、NDS和DNS等。
&&& JTA(Java Transaction API)提供了J2EE中处理事务的标准接口,它支持事务的开始、回滚和提交。同时在一般的J2EE平台上,总提供一个JTS(Java Transaction Service)作为标准的事务处理服务,开发人员可以使用JTA来使用JTS。
&&& JCA(J2EE Connector Architecture)是J2EE体系架构的一部分,为开发人员提供了一套连接各种企业信息系统(EIS,包括ERP、SCM、CRM等)的体系架构,对于EIS开发商而言,它们只需要开发一套基于JCA的EIS连接适配器,开发人员就能够在任何的J2EE应用服务器中连接并使用它。基于JCA的连接适配器的实现,需要涉及J2EE中的事务管理、安全管理及连接管理等服务组件。
&&& JMX(Java Management Extensions)的前身是JMAPI。JMX致力于解决分布式系统管理的问题。JMX是一种应用编程接口、可扩展对象和方法的集合体,可以跨越各种异构操作系统平台、系统体系结构和网络传输协议,开发无缝集成的面向系统、网络和服务的管理应用。JMX是一个完整的网络管理应用程序开发环境,它同时提供了厂商需要收集的完整的特性清单、可生成资源清单表格、图形化的用户接口;访问SNMP的网络API;主机间远程过程调用;数据库访问方法等。
&&& & JAAS
&&& JAAS(Java Authentication and Authorization Service)实现了一个Java版本的标准Pluggable Authentication Module(PAM)的框架。JAAS可用来进行用户身份的鉴定,从而能够可靠并安全地确定谁在执行Java代码。同时JAAS还能通过对用户进行授权,实现基于用户的访问控制。
&&& & JACC
&&& JACC(Java Authorization Service Provider Contract for Containers)在J2EE应用服务器和特定的授权认证服务器之间定义了一个连接的协约,以便将各种授权认证服务器插入到J2EE产品中去。
&&& & JAX-RPC
&&& 通过使用JAX-RPC(Java API for XML-based RPC),已有的Java类或Java应用都能够被重新包装,并以Web Services的形式发布。JAX-RPC提供了将RPC参数(in/out)编码和解码的API,使开发人员可以方便地使用SOAP消息来完成RPC调用。同样,对于那些使用EJB(Enterprise JavaBeans)的商业应用而言,同样可以使用JAX-RPC来包装成Web服务,而这个Web Servoce的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部署和实现,对Web服务的开发人员而言,SOAP/WSDL变得透明,这有利于加速Web服务的开发周期。
&&& & JAXR
&&& JAXR(Java API for XML Registries)提供了与多种类型注册服务进行交互的API。JAXR运行客户端访问与JAXR规范相兼容的Web Servcices,这里的Web Services即为注册服务。一般来说,注册服务总是以Web Services的形式运行的。JAXR支持三种注册服务类型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。
&&& & SAAJ
&&& SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一个增强,为进行低层次的SOAP消息操纵提供了支持。
&&& 企业级应用示例
&&& 下面我们通过假设一个企业应用的J2EE实现,来了解各种组件和服务的应用。假设应用对象是计算机产品的生产商/零售商的销售系统,这个销售系统能够通过自己的网站发布产品信息,同时也能将产品目录传送给计算机产品交易市场。销售系统能够在线接受订单(来自自己的Web网站或者来自计算机产品交易市场),并随后转入内部企业管理系统进行相关的后续处理。
&&& 参见图3,这个企业应用可以这种方式架构。该企业应用的核心是产品目录管理和产品定购管理这两个业务逻辑,使用EJB加以实现,并部署在EJB容器中。由于产品目录和定购信息都需要持久化,因此使用JDBC连接数据库,并使用JTA来完成数据库存取事务。
&&&&&&& 图3 J2EE应用示例
&&& 然后使用JSP/Servlet来实现应用的Web表现:在线产品目录浏览和在线定购。为了将产品目录发送给特定的交易市场,使用JMS实现异步的基于消息的产品目录传输。为了使得更多的其它外部交易市场能够集成产品目录和定购业务,需要使用Web Services技术包装商业逻辑的实现。由于产品定购管理需要由公司内部雇员进行处理,因此需要集成公司内部的用户系统和访问控制服务以方便雇员的使用,使用JACC集成内部的访问控制服务,使用JNDI集成内部的用户目录,并使用JAAS进行访问控制。由于产品订购事务会触发后续的企业ERP系统的相关操作(包括仓储、财务、生产等),需要使用JCA连接企业ERP。
&&& 最后为了将这个应用纳入到企业整体的系统管理体系中去,使用Application Client架构了一个管理客户端(与其它企业应用管理应用部署在一台机器上),并通过JMX管理这个企业应用。
本文标题:
本页链接:}

我要回帖

更多关于 activemq jndi 配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信