zoukankan      html  css  js  c++  java
  • EJB(三)细说message-driven bean

     

     

    EJBMessage-driven bean基于JMS来实现的。在说明Message-driven bean之前需要来了解一下jms

     

    JMS

    java-message-servicejava程序和企业级应用交互的一套规范,定义一组用于创建、发送、以及接受消息的API。发送者不需要知道接受者的任何内容,接受者也是同样。对于双方都是一种透明的方式来进行异步交互。J2ee1.3版本开始支持JMS,而JMS主要提供了一种标准的底层消息通信的规范。JMS有两种消息模型,p2p以及popsub模型。点对点主要通过消息队列的方式来消息传递,而发布订阅通过主题来实现订阅消息。

     

    P2p

    点对点的消息模型。发送者将消息发送到消息队列,接受者通过队列取得消息;适合单个接收者的消费者。类似于QQ的好友之间的即时通信。


    结构


    计算机生成了可选文字:OUeUeCOnSUm6SSendSAcknowI6dges



    Reciver


    接受者从队列中接收消息,接受成功后应答结果


    队列


    消息发送到队列之后,会一直保留知道接受者接受成功该消息;

    另外队列对于发送者和接受者来讲都是脱离工作的,接受者是否接受信息对于发送者发送消息到队列是没有影响的;

    队列中的消息的是顺序存储的。


    Sender


    发送者发送消息到队列,消息将在队列中保存,直到被接收或者超时。


    这样一个过程是异步处理的,接受者并不依赖发送者。发送者也不依赖与接受者。


     

    pubsub模型

     

    类似于QQ的群聊,多个发布者将消息发送到指定主题,订阅者通过订阅该主题后能够接受到来自发布者的消息。主题负责将消息保存和分发。


    结构



    计算机生成了可选文字:SUbSCriIVerSPUbllsheSDe!iVe怡日

     

     

    两种模型的API


     

    计算机生成了可选文字:JMSParentPTPOOmainPUbISUbOomainConnectionFactoryoueueConnectionFactoryTopicConnectionFactoryConnedionQUeUeC0nnedionTopiCConnectionDestinationQUeUeTOpiCSeSSionQUeUeseSSionTopicsessionMessageProducerOUeUesenderTopicPublisherMessageConsumerOUeUeReCeiVerTopicsubscriber

     

     


    和点对点模型不同的是,消息会使所有订阅者接收。并且只有当订阅者处于线上状态时才能接收到消息。

     

     

    message-driven bean

     

    JMS也是属于J2EE的规范之一。所以如果要支持JMS,就需要来按照jms定义jms中的一系列概念。

    上面讲了JMS中的两种模型,EJB中的MDB就是这样一个异步的监听消息服务。

     

    模型

     

     

    JMSj2ee的规范之一,定义了一些规范,如果要支持JMS就需要定义这样一系列的概念。如图所示连接工厂,会话等。

     

    Connection factory


    这个很好来理解,类似jdbc的数据源创建工厂;在创建数据源时需要一个创建工厂,这里也是同样的道理。需要一个连接创建工厂用来创建来创建呢?通过jndi查找来获得。JMSAPI定义两种连接工厂创建对象,分别是QueueConnectionFactory TopicConnectionFactory对应着p2ppsub两种消息传递模式。


    connection


    通过connectionfactory就可以创建connectionconnection是什么,具体也不太清楚,是对TCPIP协议的一个简单包装。对应的也有两种QueueConnectionTopicConnection。


    session


    用来生产消息的生产者、消息消费者、消息;还有对于这些消息的事务封装。

    QueenSession TopicSession


    messageProjducer


    消息的生产者。由session创建,通过sendpublish来发送消息到Destination


    MessageConsumer


    消息消费者。由session创建,通过receiveOnMessage来获取消息。


     

    sessionbean的区别

     

    无论是有状态的消息bean还是无状态的消息bean。在客户端调用服务器的bean时,都需要在客户端来引用服务器的接口。而MDB就不存在这个依赖的关系,唔需要关系接口。但是在某种程度上也算是需要一些依赖,比如说在服务器上mdb发送的一个是user对象,在客户端也需要针对这个消息进行user对象的处理。但是不存在接口之间的依赖。

     

    第一个MDB

     

    代码

     MDB

    <span style="font-family:FangSong_GB2312;">package com.cfl.ejb;
    
    import javax.ejb.ActivationConfigProperty;
    import javax.ejb.MessageDriven;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    
    @MessageDriven(activationConfig = {  
            @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),  
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myqueue")}
    )  
    public class MyQueueBean implements MessageListener {
    
    	@Override
    	public void onMessage(Message arg0) {
    		// TODO Auto-generated method stub
    		TextMessage textMessage=(TextMessage)arg0;
    		try {
    			System.out.print("TextMessage="+textMessage.getText());
    		} catch (JMSException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    </span>

    client


    <span style="font-family:FangSong_GB2312;">package com.cfl.ejbclient;
    
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    
    
    public class MyQueueClient {
    	public static void main(String args[])throws Exception{
    		
    		//
    		InitialContext context=new InitialContext();	
    		//創建connectionfactory對象 
    		QueueConnectionFactory acf=(QueueConnectionFactory)context.lookup("ConnectionFactory");
    		//創建connection
    		QueueConnection connection =(QueueConnection) acf.createConnection();
    		//创建session
    		QueueSession qs=(QueueSession) connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    		//创建destination
    		Queue queue=(Queue) context.lookup("queue/myqueue");
    		//创建消息
    		TextMessage text=qs.createTextMessage("helloworld");
    		//创建发送者
    		QueueSender sender=qs.createSender(queue);
    		//发送消息
    		sender.send(text);
    		//关闭会话
    		qs.close();
    		connection.close();
    		
    		System.out.print("message is done");
    		
    	}
    }
    </span>


    总结


    应该是MDBJMS规范的一种实现方式,通过规范定义的API来书写这个流程即可。大致有这样几个步骤。


    1)得到ConnectionFactory对象;

    2)用ConnectionFactory创建Connection 对象;

    4)用Connection对象创建一个或多个JMS Session;

    5)JNDI创建destination

    6)创建消息发送者、消息

     

     

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/guziming/p/4232665.html
Copyright © 2011-2022 走看看