传智播客-ejb3(4)-MDB机制

来源:互联网 发布:80端口备案 编辑:程序博客网 时间:2024/06/05 08:38

理解MDB机制:
1、底层使用的是RPC协议,就像RMI,不过RMI是同步的消息,而RPC是异步的。
2、客户端不会直接调用MDB,它是由发送到服务器的消息触发的。典型的消息服务器有:IBM websphere MQ等。
3、MDB直接处理消息,消息涉及到在两个不同的进程间通信,他们通常位于不同的机器上。Java EE通过在发送者和接受者之间添加中间件(Message Oriented Middleware,MOM)使得消息服务更加健壮--消息两端不需要同时使用,系统组件中间进行松耦合。在java EE系统中,消息中间件成为Destination。Java EE通过JMS API对消息服务进行标准化。
4、MDB和SLSB一样,也使用了实例池技术,容器可以使用一定数量的bean实例处理成百上千的JMS消息。
5、注意:应用时,session context不能注入MDB,MD context也不能注入session bean。
6、MDB通常要实现MessageListener接口,该接口定义了onMessage()方法。MDB通过它来处理收到的JMS消息。
7、当容器检测到bean守候的目标地址有消息到达时,容器调用onMessage方法将消息作为参数传入MDB。MDB在该方法中决定如何处理该消息。可以使用注解指定MDB监听哪一个目标地址(destination).当MDB部署时,容器将读取其中的配置信息。

JMS(Java Message Service):
1、jms支持两种消息传递模型
(1)点对点模式(Point to Point,PTP):来自一个消息生产者(Producer)的消息只发送给一个消息的消费者(Customer)。PTP消息模式的destination又称为队列(Queue)。如果消费者不在线的话,消息会驻留在MOM内,发送几次就保存几次,等到消费者上线后全部送出(例如QQ留言)。


(2)发布-订阅模式(Publish-Subscribe,pub-sub):类似于新闻组。一个消息生产者生产的消息可以有多个消费者消费。发布订阅模式的destination称为主题(Topic)。此种模式典型应用于跨系统的信息广播。如果消费者不在线,生产者发送的消息不会送达该消费者,消费者上线后也不会收到。

2、jms中的消息
一条message一般由三部分组成:头(head)、属性(property)和主体(body)。
消息有几种类型,均派生自Message接口:StreamMessage、MapMessage、TextMessage、ObjectMessage和ByteMessage。

3、在java类中发送消息的步骤的示例代码:
发送端:
public class JMSApp { //如果是Topic,下面的QueueConnectionFactory换成TopicConnectionFactory
public static void main(String[] args) {
try {
//0. 得到一个JNDI初始化上下文
InitialContext ctx = new InitialContext();
//1. 获得服务器上的队列连接工厂,该连接工厂是由JMS提供的,不需要我们自己创建。
//每个供应商都为它绑定了一个全局JNDI,例如下文引号里的QueueConnectionFactory。
QueueConnectionFactory qcf = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
//2. 通过连接工厂创建队列连接
QueueConnection qconn = qcf.createQueueConnection();
//3. 通过连接创建队列的会话,参数含义为(该会话需不需要事务,消息接收确认模式)
QueueSession qs = qconn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 获得服务器上的队列
Queue queue = (Queue)ctx.lookup("queue/testQueue");
//5. 通过回话,创建该列队的消息的生产者
MessageProducer mp = qs.createProducer(queue);
//6. 通过回话创建文本消息
TextMessage txt = qs.createTextMessage();
txt.setText("你好吗?");
mp.send(txt);
//7. 释放资源
qs.close();
qconn.close();
System.out.println("消息发送完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收端:
@MessageDriven(activationConfig={@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/testQueue")})
public class MyQueueMDB implements MessageListener {
public void onMessage(Message arg0) {
try {
if(arg0 instanceof TextMessage){
TextMessage txt = (TextMessage)arg0;
System.out.println("MyQueueMDB 收到消息 : " + txt.getText());
System.out.println("我很好!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

下面是徐培成老师提供的课外知识:)
在一些数据量超大的应用中,例如移动、联通、某些银行业务等,有的可以说是直接用存储过程开发程序。因为当数据量大到一定程度的时候,应用程序本身就是瓶颈之一:因为这些应用程序要从数据库提取数据,就会占用网络流量;还要实例化对象放到内存里,但有些数据并不需要挨个查看,这些都降低了总程序的效率--以前认识一开发的小孩,问他上班干嘛,答曰:写存储过程,而且成百上千行地写。。。。。。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 骑魔头车没驾照车祸保险拒赔怎么办 行驶证过了两个多月没年检怎么办 驾照没满一年扣了3分怎么办 6年免检但是行驶证到期怎么办 驾驶证和行驶证一起丢了怎么办 身份证驾驶证行驶证一起丢了怎么办 在银行柜圆机取款时忘了取卡怎么办 中国建设银银行取款密码忘了怎么办 买到证件不全的二手电动车怎么办 光大乐惠金卡信用卡还了怎么办 增驾期间被扣3分怎么办 a2驾驶证被扣12分后怎么办 我手机换号码了驾驶证档案怎么办 手机号码换了查不到驾照分了怎么办 金牛区源泉幼儿园摇不到号怎么办 b2驾驶证被扣12分后怎么办 福建省超过一年驾照未年审要怎么办 为缓解交通拥堵现状人们应该怎么办 告对方不知道对方出身日期怎么办 上海业余围棋4进3老不过怎么办 孩子想上学但又怕同学议论怎么办 在菲律宾黑了博彩老板的钱怎么办 九阴真经3d先遣服更新失败怎么办 公司核名通过不想用了怎么办 公司核名下来了不想注册了怎么办 家人受到小贷公司催款威胁怎么办 商标抽签资料提交上去有问题怎么办 花椒直播助手苹果版下载不了怎么办 在香港酒店住把床单弄上血了怎么办 综英美我能怎么办我也很绝望百度云 护照的名字中间有个空格怎么办 开车不小心压死黄鼠狼了怎么办 三户联保贷款一方不还怎么办 因为隔断中介违约…我该怎么办 上海居住证没下来换住址了怎么办 工商注册后大股东不注资怎么办 公司不给去办理变更股东信息怎么办 滴滴车主注册没有自己的车型怎么办 代办用虚假地址注册的公司怎么办? 写字楼注册公司租户不租了怎么办 租户没把公司迁出我该怎么办