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

来源:互联网 发布:淘宝五年老店怎么计算 编辑:程序博客网 时间:2024/05/29 09:58

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

 

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

 

关于ejb3其他更多的知识点,欢迎来传智播客聆听~~~

原创粉丝点击