J2EE的异步动静机制(上)
当前位置:以往代写 > JAVA 教程 >J2EE的异步动静机制(上)
2019-06-14

J2EE的异步动静机制(上)

J2EE的异步动静机制(上)

副标题#e#

在漫衍式企业级应用措施中,异步动静机制用于有效地协调各个部门的事情。

J2EE为我们提供了JMS和动静驱动豆(Message-Driven Bean),用来实现应用措施各个部件之间的异步动静通报。

一.什么是动静系统?

凡是一个动静系统答允分隔的未耦合的应用措施之间靠得住地异步通信。在企业应用时,需要一种异步的,非阻塞的动静通报。好比,一个客户端大概但愿给一个处事器发送一个请求后,不在乎是否顿时能获得回应。这样,客户端没有来由必需期待处事器处理惩罚请求。客户端应用措施在递交一个请求之后,只需确保请求达随处事器端后,就可以处理惩罚其他任务。凡是,这是很高效的。动静系统提供了很多其他漫衍式工具计较模子没有的利益。它勉励在动静发生者和利用者之间的"松耦合",在它们之间有很高水平的事务处理惩罚。对付利用者,它不在乎谁发生了动静,发生者是否仍在网络上以及动静是什么时候发生的。这就答允成立动态的,靠得住的和机动的系统。整个的子系统能被修改而不会影响系统的其他部门。

别的的利益包罗:系统的高度可扩展性,容易与其他系统举办集成,以及高度的靠得住性。由于靠得住性和可扩展性,使得它们用于办理很多贸易和科学计较问题。好比,动静系统是很多应用措施的基本,这些应用措施可以是事情流,网络打点,通信处事或供给链打点措施。在JAVA技能中,处理惩罚异步动静的本领是通过JMS来实现的。JMS最初设计是为了给传统的动静工具中间件提供一个尺度的JAVA接口。而这些产物是在一个企业级应用措施中必需的。此刻呈现了很多支持JMS的纯JAVA的产物。

动静系统范例

凡是有两种动静范例。

1.宣布/订阅(publish/subscribe)

宣布/订阅动静系统支持一个事件驱动模子,动静发生者和利用者都参加动静的通报。发生者宣布事件,而利用者订阅感乐趣的事件,并利用事件。发生者将动静和一个特定的主题(Topic)连在一起,动静系统按照利用者注册的乐趣,将动静传给利用者。

2.点对点(Peer to peer)

在点对点的动静系统中,动静分发给一个单独的利用者。它维持一个"进入"动静行列。动静应用措施发送动静到一个特定的行列,而客户端从一个行列中获得动静。


#p#副标题#e#

二.JMS简介

JMS的目标是提供应动静系统客户一个牢靠的接口,并且与底层的动静提供者无关。这样,客户端的应用措施可以在差异的呆板和操纵系统中移植,并且能在差异的动静系统产物之间转移。JMS客户端都是成立在JAVA技能上的,从而也能利用其他JAVAAPI,如JDBC数据库毗连,利用JAVABEAN组件模子,JDNI名字处事,JTA客户端事务处理惩罚节制以及J2SE和J2EE API来实现企业级应用处事措施。

1.JMS工具模子

J2EE的异步消息机制(上)

图1显示了JMS工具,用于提供JMS客户端与JMS处事提供者相连的工具。

ConnectionFactory是一个客户端用来建设一个Connection的打点工具。由于在Connection建设时有授权和通信成立进程,因此这个工具是较量大的。

Destination工具将一个动静的目标和处事提供者有关的地点及设置信息包装起来。

Session是JMS实体,用来支持事务处理惩罚和异步动静消费。JMS并不需要客户端的代码用于异步动静消费或能处理惩罚多个并动员静。凡是,事务的巨大性都由一个Session来封装。

一个Session是一个原子单元的事情,与数据库的事务一样,要实现多线程事务较量坚苦。Session提供了在一个线程编程模式下的并发的利益。

MessageProducer和MessageConsumer工具由Session工具建设。用于发送和接管动静。为了确保动静的通报,JMS处事提供者处理惩罚的动静都要处于PERSISTENT模式。PERSISTENT模式使得JMS提供者出问题后,也能让动静生存下来。

Session,MessageProducer和MessageConsumer都不支持并发,而ConnectionFactory,Destination和Connection都支持并发。

2.JMS应用措施开拓

JMS中的动静

在动静系统中,应用措施之间通信的要害是动静。因此利用JMS必需要先领略动静。

在JMS中,动静由三部门构成:

MESSAGE HEADER用于识别动静,好比用于判定一个给定的动静是否是一个"订阅者"

PROPERITIES用于与应用措施相关的,提供者相关的和可选项的信息

BODY是动静的内容,支持几种名目,包罗TextMessage(对String一个简朴的封装)和ObjectMessage(对任意工具的封装,但必需支持序列化),也支持其他名目。

TextMessage

一个TextMessage是一个String工具的封装。在只有文本工具通报时,是很有用的。它假设很多动静系统是成立在XML上的。从而TextMessage就可以成为包装它们的容器。

建设一个TextMessage工具很简朴,如下面的代码:

TextMessage message=session.createMessage();

message.setText("Hello, world!");

ObjectMessage

#p#分页标题#e#

如名字所示,它是对一个JAVA工具的封装的动静。任何可序列化的JAVA工具都能用于ObjectMessage,假如必需将多个工具封装在一个动静里通报,可以利用Collection工具,来包罗多个序列化工具。

下面是建设一个ObjectMessage

ObjectMessage message=session.createObjectMessage();

message.setObject(myObject);

#p#副标题#e#

建设一个JMS客户端措施

一个典范的JMS客户端由下面的几个根基步调来建设:

建设一个到动静系统提供者的毗连(Connection)

建设一个Session,用于吸收和发送动静

建设MessageProducer和MessageConsumer来建设和吸收动静

当完成了上述步调后,一个动静发生者客户端将建设并宣布动静到一个主题,而动静利用者客户端会吸收与一个主题相关的动静。

1.建设一个Connection

一个Connection提供客户端对底层的动静系统的会见。并实现资源的分派和打点。通过利用一个ConnectionFactory来建设一个Connection,凡是用JDNI来指定:

Connection message=new initialContext();
TopicConnectionFactory topicConnectionFactory=(TopicConnectionFactory);
topic = (Topic) jndiContext.lookup(topicName);
topicConnection =topicConnectionFactory.createTopicConnection();

2.建设一个Session

Session是一个较量大的JMS工具,他提供了出产和消费动静的手段。用于建设动静利用者和动静发生者。

topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);

两个参数用于节制事务和动静确认。

3.定位一个Topic

用JDNI来定位一个Topic,Topic用于识别发送或吸收的动静,在宣布/订阅系统中。订阅者订阅一个给定的Topic,而宣布者将它宣布的动静与一个Topic相连。

下面是建设一个Topic "WeatherReport"

Topic weatherTopic=messaging.lookup("WeatherReport");

4.启动Connection

在上面的初始化步调之后,动静流是克制的,用于防备在初始化时产生不行预料的行为。一旦初始化竣事,必需让Connection启动动静系统。

topicConnection.start();

5.建设一个动静发生者

在宣布/订阅里,一个发生者宣布动静到一个指定的Topic。下面的代码显示建设一个发生者,以及后续的成立和宣布一个简朴文本动静。

TopicPublisher publisher=session.createPublisher(weatherTopic);

TexeMessage message=session.createMessage();

message.setText("ssss");

publisher.publish(message);

下面是一个动静利用者的代码

topicConnection =topicConnectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
topicSubscriber = topicSession.createSubscriber(topic);
topicListener = new MsgListener();
topicSubscriber.setMessageListener(topicListener);
topicConnection.start();

    关键字:

在线提交作业