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

理解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();
}
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值