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)创建消息发送者、消息

     

     

  • 相关阅读:
    luogu_1168: 中位数
    luogu_4762: [CERC2014]Virus synthesis
    luogu_4287:双倍回文
    回文自动机学习笔记
    luogu_3645: 雅加达的摩天楼
    python爬今日头条(ajax分析)
    Python多进程multiprocessing.Pool()
    Python爬微博(ajax+mongo)
    python实用函数之join()
    python之tuple与list
  • 原文地址:https://www.cnblogs.com/guziming/p/4232665.html
Copyright © 2011-2022 走看看