当前位置:编程学习 > JAVA >>

回顾经典--EJB3.0 中

3.JTS--Java Transaction Service即java事务服务,应用服务器通过其实现事务管理器,应用程序无需直接调用JTS方法而只需面向JTA编程即可,开发者采用与事务管理器无关的方式开始,
   提交或回滚事务,由JTA调用底层的JTS进行处理,通过调用javax.transaction.UserTransaction接口的begin,commit.rollback等方法来使用JTA的事务控制功能;
4.JNDI--Java Naming Directory Interface即Java命名目录接口规范,应用程序通过其提供的API[javax.naming]访问命名目录服务,允许java程序通过JNDI名称访问真正的java对象;
目录服务即保存名称和对象之间的关联又保存对象的各种属性且允许程序对保存的对象属性执行CRUD操作,应用服务器WebLogic,JBOSS等都提供了JNDI支持;
5.JMS--Java Message Service即java消息服务,是J2EE面向消息通信机制提供的JMS规范,并且提供了面向JMS编程的API,J2EE还提供了MDB(Message Driven Bean)消息驱动Bean和JMS
   结合使用:应用程序组件通过JMS将消息发送到目的组件,MDB负责监听指定的消息目的,当消息抵达目的时MDB就被自动触发接收和处理消息;消息是不同应用之间或同一应用的不同组件 
   之间的通信方法,JMS主要用于分布式应用的各组件之间通信,其优势在于三点:A.采用异步处理机制,生产者发送消息后无需等待客户端回应即可向下执行;B.持久保存消息提高系统的
   可靠性;C.一条消息允许同时发给多个接收者而提高效率;JMS允许完全解耦的不同组件之间互相调用,当一个应用程序或一个组件[生产者]将消息发送到指定目的之后,消息可以被一个或
   多个组件[消费者]读取并处理,对于面向消息的架构而言,生产者和消费者之间完全隔离,需要消息服务器的支持,类似邮件服务器,消息中间件减少了开发跨平台应用的复杂性,在要求可靠
   传输的系统中可利用消息中间件作为通信平台向应用程序提供可靠传输功能传输消息和文件;
   (1)JMS API--JMS1.1相比与JMS1.0.2允许客户端编写相同的代码操作PTP和Pub-Sub两种模型,二者的区别:PTP的消息生产者发送到消息队列后即使消费者离线但只要消息在有效期
       内,消费者总可以从消息队列中提取消息;Pub-Sub的消息生产者将消息发布到某个主题后若某个已订阅的消费者离线,其将无法收到消息而永远错过此消息,若要求
   Pub-Sub的消费者即使离线也不允许错过任何消息,就要使用可靠的JMS订阅:客户端必须提供一个唯一标识让服务器知道其何时重新连接服务器以把错过的消息重新传送
   给它;
   可靠的JMS连接--JMS连接提供了setClientID(String id)方法为客户端设置唯一标识且在JMS会话中提供了Session.createDurableSubscriber方法创建一个
     可靠的消息订阅者,执行这两个方法后订阅者连同自身的ID将被添加到JMS服务器,此后该消息主题上任何未传递的消息都会传递给此订阅者,另外使用
 Session.unsubscribe可以删除消费者订阅的消息,这样JMS服务器就不会再为其保存消息了;
   (2)JMS消息系统--JMS提供了基本的API操作消息系统,此系统中包含如下对象,
      <1>连接工厂--由服务器管理员创建且绑定到JNDI树上,客户端使用JNDI查找,定位连接工厂创建JMS连接;
  <2>JMS连接--表示客户端与服务器之间的活动连接,每个客户端使用单独的连接且每个连接可以连接多个JMS目的;
  <3>JMS会话--表示客户端与服务器之间的通信状态,会话建立在连接之上,其定义了消息顺序且进行事务性的消息处理;
  <4>消息目的、生产者、消费者;
   (3)点对点PTP模型--生产者发送消息到消息服务器,消息服务器使用消息队列保存消息,消费者通过消息队列依次读取每条消息,JMS把每条消息传递给一个消费者且保证传递给消费者,
       消息不会同时被多个消费者接收,其自动将消息保存到永久存储介质[database/file]上而避免消费者不在连接范围之内时消息的丢失,直到消费者进入连接就自动
   送达,要配置PTP的JMS服务器,首先要在应用服务器中配置消息队列[Queue]类型的消息目的让程序能通过JNDI查找获取;
   <1>在WebLogic中配置PTP的JMS服务器--每个WebLogic实例可配置多个JMS服务器,配置JMS服务器之前要先配置'持久化存储',因为程序可能需要持久化保存JMS
    消息,可采用基于数据库或文件的方式保存,
    A.配置持久化存储:mydomain->service->持久化存储->新建;
B.配置JMS服务器:mydomain->service->消息传递->JMS服务器->新建; 
C.配置JMS消息系统:主要是JMS连接工厂,消息目的等的配置,WebLogic11的JMS连接工厂,消息目的是基于JMS消息模块之上的,故需要先配置JMS模块;
a.配置JSM消息模块:mydomain->service->消息传递->JMS模块->新建;
b.向JMS模块中添加资源:JMS模块采用子布署管理内部资源,需要先为JMS模块配置子布署:查看JMS模块列表->子布署->新建;接着
向JMS模块增加资源:查看JMS模块内的资源列表->新建,可以配置连接工厂和消息目的[消息队列];
   <2>在JBOSS中配置PTP的JMS服务器--Resources->JMS Destinations->Queues->Add a new resource;
   <3>实现PTP消息发送--PTP和Pub-Sub的生产者发送消息的步骤类似如下示,当创建了JMS连接工厂和消息目的之后就可以编程向消息队列发送消息了,
         A.通过JMS查找获取JMS连接工厂;
 B.通过JNDI查找获取JMS消息目的;
     C.使用JMS连接工厂创建JMS连接;
     D.使用JMS连接创建JMS会话;
     E.使用JMS会话创建消息生产者和空的JMS消息内容;
     F.JMS调用自身方法填充JMS消息内容;      
     G.消息生产者将消息发送到JMS消息目的;
     H.关闭JMS资源;
 JMS会话创建时需要指明会话是否具有事务性和消息的确认方式,即javax.jms.Connection.createSession方法中必须设置两个参数,
 javax.jms.Session createSession(boolean transacted,int acknowledgeMode)--消息的确认方式是消费者接收到消息且处理
 之后回送一个确认信息,对于非事务性会话,创建会话时应该指定三种确认方式中的一种,
 Session.AUTO_ACKNOWLEDGE--同步消费者,调用reveive方法返回且无异常抛出时对收到的消息自动确认;异步消费者,调用onMessage
     方法返回且无异常抛出时对收到的消息自动确认;
 Session.CLENT_ACKNOWLEDGE--要求客户端调用javax.jms.Message.acknowledge方法完成确认;
 Session.OK_ACKNOWLEDGE--允许客户端不必急于确认收到的消息,允许在收到多个消息后一次完成确认,与AUTO_ACKNOWLEDGE相比因为
   没有确认,当系统崩溃或网络故障时消息可以被重新传递;
   <4>实现PTP消息接收--PTP和Pub-Sub的消费者接收消息的步骤类似如下示,
    A.通过JMS查找获取JMS连接工厂;
 B.通过JNDI查找获取JMS消息目的;
     C.使用JMS连接工厂创建JMS连接;
     D.使用JMS连接创建JMS会话;
     E.使用JMS会话根据指定的JMS消息目的创建消息消费者接收消息内容;
 F.关闭JMS资源;
 JMS接收消息有同步和异步两种,
 同步接收--同步接收策略中消费者调用reveive方法接收消息,此方法有两个重载版本,[JMS01]
  Message receive()--读取下一条JMS消息,如果没有收到消息此方法会一直阻塞线程;
  Message receive(long timeout)--读取下一条JMS消息,若没有收到消息此方法会阻塞线程timeout毫秒,若经过timeout
    毫秒依然没有收到消息,此方法会返回null;
  Message receiveNoWait()--此方法不会阻塞线程,尝试从JMS队列中读取JMS消息,若有消息就返回,若无就返回null;
    同步接收消息不是好策略,因为每次调用receive方法只能读取一条消息,在消费者没有收到消息时会阻塞线程一直等待,一旦收到
  消息就返回这条消息而程序也将退出,除非使用循环多次接收;
 异步接收--类似AWT事件程序,消费者不主动调用receive方法接收消息而是采用监听器的机制监听消息目的,当有消息到达目的时触发监听器
    的监听方法,异步不会阻塞线程且不必等待消息的到来,当多条消息到达目的时监听器的监听方法会被对应的自动触发多次,若程序
  无其它事可做且没有收到消息时将会退出;JMS为异步消费者提供了一个标准的事件监听器接口MessageLintener,实现此接口的
  类必须实现其onMessage方法,为消费者绑定一个消息监听器以监听消息目的,当消息抵达地监听器的onMessage方法就会自动被
  触发,[JMS02];
   (4)发布/订阅Pub-Sub模型--生产者将消息发送到消息服务器的指定主题[消息目的],消息服务器会将消息副本转发到订阅该主题的每个消费者,在WebLogic中配置此类型消息服务器的
      方式与PTP类似,只需在JMS模块中增加Pub-Sub类型的消息资源即可;在JBOSS中配置此类型消息服务器只需配置一个消息主题[Topics]即可;    
   (5)消息--JMS消息机制使用Message接口代表消息,实际应用中使用其子接口代表不同类型的消息,如下示:
   <1>StreamMessage--消息内容由序列化的对象流组成,读取消息时从对象流中读取对象;
   <2>MapMessage--消息内容由多个'key-value'对组成的类似HashMap的无序数据,要求每个'key-value'对中的key是唯一的;
   <3>TextMessage--消息内容是普通字符串,WebLogic对其进行了扩展为XMLMessage类型使用XML类型的消息;
   <4>ObjectMessage--消息内容是序列化的对象;
   <5>BytesMessage--消息内容是原始字节流,只有当客户端需要完全控制原始消息格式时才使用这种类型;
   消息元数据--JMS中的消息头,消息属性本质是一系列描述消息的'key-value'对,统称为消息的元数据,消息头和消息属性的区别在于JMS消息头的所有key都是标准固定的,
     JMS的消息属性是允许用户自定义的'key-value'对,通过调用Message.setXxxProperty(propertyName,propertyValue)方法可以为JMS消息增加任意多
 个属性,消费者调用Message.getXxxProperty方法获取消息属性;
   重用消息对象--生产者调用send方法发送消息之前JMS会把创建的消息对象复制到内部缓冲中,一旦send方法调用完成还可以使用此消息对象再次发送消息以实现复用;
   消息传递模式--JMS支持两种消息传递模式:DeliveryMode.NON_PERSISTENT[无须持久化保存],DeliveryMode.PERSISTENT[持久化保存],使用持久化保存模式发送消息
       时JMS服务器在发送消息前会先把消息保存到数据库或文件中之后才会发送消息,即先保存后发送;对于非持久化保存的消息只保存在内存中,若服务器崩溃将会
   丢失,前者可靠性好,后者性能高;
   有效期--使用持久化保存模式发送的消息会先保存到数据库或文件中但不意味着会永远有效,可以设置消息的有效期让JMS服务器在有效期过之后删除消息;
   优先级--JMS服务器会先传递优先级高的消息,有0~9这10个优先级,0~4是普通优先级,5~9是高优先级,默认优先级是4;
   确认方式--JMS服务器在消费者回送一个确认信号之前会一直保存着每个消息,对于事务性会话,当一个事务对收到的消息进行了适当的处理且事务提交之后会回送确认消息给
    生产者,对于非事务性会话,可以在创建JMS会话时指定确认方式,JMS规范中定义了三种会话确认方式如下示:
    AUTO_ACKNOWLEDGE--自动确认,同步消息者调用reveive方法收到消息且无异常抛出时系统会回送确认消息,异步消费者在onMessage方法执行后无异常抛出时
  系统会自动回送确认消息;
CLIENT_ACKNOWLEDGE--客户端确认,要求开发者使用javax.jms.Message.acknowledge方法确认,此方式不要求消费者对每条消息进行确认,一旦调用此方法
将会对当前和之前收到的任何消息进行确认;
DUPS_OK_ACKNOWLEDGE--延迟确认,不要求消费者对收到的消息立即进行确认;
   消息选择器--对消息进行过滤,只将消费者需要的消息传递给消费者,其对消息头或消息属性进行过滤,对消息体不做任何过滤,消费者需把过滤表达式提供给服务器,不符合要求
     的消息依然保存到消息目的,在创建消费者时可以为每个消费者指定一个消息选择器;
   队列浏览器--JMS提供的QueueBrowser接口用于浏览指定消息队列中的所有消息,调用Session.createBrowsser方法可以创建且指定需要浏览的消息队列的类型,默认所有
      类型,也可指定应用了消息选择器的队列;
   (6)JMS事务--JMS提供了局部Session和JTA全局两种类型事务控制方式,若应用服务器支持JTA全局事务,使用JTA事务比使用局部Session事务更优秀,
      局部Session事务--使用此类型事务之后,可通过Session.commit和Session.rollback方法显式地提交或回滚事务,生产者和消费者都可以使用Session事务,生产者
  使用事务性Session后,它发送的消息会先被缓存,在事务提交之前消费者不会收到任何未提交的消息,在事务提交之后生产者发送的所有消息才会'整
  体性'的传递给消费者,若事务回滚,JMS服务器会丢弃所有缓存的消息而不会传递给消费者;消费者使用事务性Session时,可让程序控制消息的确认
  方式,如使用CLIENT_ACKNOWLEDGE确认方式一样,消费者收到且处理消息成功后提交事务,此时才向生产者确认之前收到的所有消息,若事务回滚,JMS
  服务器会把所有消息退还给相关的消息队列或消息主题;
      全局JTA事务--与使用JDBC事务类似,先通过JNDI查找到JTA服务器的引用后显式地打开事务,当所有的JMS,JDBC,EJB操作执行完成后,应用程序提交或回滚JTA事务,JTA
     把JMS,JDBC,EJB等操作视为一个整体,要么全部生效,要么全部失效;
   (7)异常监听--只有JMS服务器正常运行时消费者才能接收和处理消息,若JMS服务器异常将无法得到异常信息,JMS提供了在JMS服务器上绑定异常监听器的异常监听机制让客户端能够知道
       服务器上出现的异常信息,当实现了javax.jms.ExceptionListener接口及其onException(JMSException exception)方法后,通过调用
   Connection.setExceptionListener(ExceptionListener listener)方法在服务器上绑定异常监听器,如此当服务器抛出异常时onException方法会被触发,客户
   端就可以通过onException方法的形参访问JMS服务器上的异常对象以了解异常信息; EJB3.0 
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,