zoukankan      html  css  js  c++  java
  • 消息驱动bean(MDB)实例

    到眼下为止前面介绍的有关JavaEE的东西都是同步的。也就是说调用者调用某个方法。那么这种方法必须马上运行并返回运行结果。

    用官方一些的语言来说就是“client通过业务接口调用一个方法,在将控制权返回给client之前,server完毕该方法调用”。对于我们接触到的大多数操作而言这是最自然也是最easy实现的方法。然而,有些情况下client并不须要等待server响应。而仅仅须要告诉server应该做什么就能够了。在完毕“告知”任务之后client能够继续工作,而server则默默的在一旁处理client的请求(一般会是非常多client,非常多请求)。

    JavaEE中对于消息的处理有其自身的解决的方法——消息驱动beanMessage-Driven BeanMDB)。它是JavaEE中用于异步消息传递的EJB组件。使用消息驱动bean能够实现上文中所说的client在请求server之后还能够继续正常的工作。client利用消息(JMS?)向server发出请求,当然这些请求终于是要交付给MDB来处理的。每当server收到请求时。将调用MDB的业务接口(这里有点儿相似于会话bean,可是这里的接口并非开发者加入的),进而对应的实现者会做对应的处理。

    就像前面博文中说的那样。当使用一个会话bean时。开发者一般会创建一个业务接口,并在bean类中实现它(虽然你全然能够採用无接口的方式调用会话bean)。可是对于消息驱动bean来说,它须要实现一个特定于MDB所基于的消息系统的接口。这句话有些拗口,简而言之就是用哪种类型的消息机制就须要实现其对应的接口。这里以JMS为样例,当然JMS也是最常见的情况,(须要注意的是其它基于Java连接器体系结构(Java ConnectorArchitecture,简称JCA)的消息传递系统也是能够实现消息传递的)。

    对于JMS消息驱动bean来说。他的业务接口是javax.jms.MessageListener,当中定义了单一方法:onMessage()。

    以下代码演示样例显示了一个消息驱动bean(採用JMS方式)的基本结构。

    @MessageDriven(
        mappedName="destinationQueue",
        activationConfig = {
            @ActivationConfigProperty(propertyName="destinationType",
                                      propertyValue="javax.jms.Queue"),
            @ActivationConfigProperty(propertyName="messageSelector",
                                      propertyValue="RECIPIENT='ReportProcessor'")
    })
    public class ReportProcessorBean implements javax.jms.MessageListener {
        public void onMessage(javax.jms.Message message) {
            try {
                System.out.println("Processing message: " + ((TextMessage) message).getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    在本例中对于上面的消息驱动bean他的消息产生是来源于一个Servlet(核心代码例如以下)

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            printHtmlHeader(out);
    
            
            // if there was info submitted, send the message
            String messageText = request.getParameter("message");
            if (messageText != null) {
                try {
                    QueueConnectionFactory factory = (QueueConnectionFactory)
                        new InitialContext().lookup("java:comp/env/jms/MyQueueConnectionFactory");
                    Queue destinationQueue = (Queue)
                        new InitialContext().lookup("java:comp/env/jms/MyQueue");
                    QueueConnection connection = factory.createQueueConnection();
                    QueueSession session = connection.createQueueSession(false,
                                                Session.AUTO_ACKNOWLEDGE);
            
                    QueueSender sender = session.createSender(null);
                    Message message = session.createTextMessage(messageText);
                    message.setStringProperty("RECIPIENT", "ReportProcessor");
                    sender.send(destinationQueue, message);
                    connection.close();
        
                    // print a response to the html stream
                    out.println("Message "" + messageText + "" sent! See the console " +
                                "or the log file at <EXAMPLES_HOME>/glassfish/domains/domain1/logs/server.log.");
                } catch (Exception e) {
                    throw new ServletException(e);
                }
            }
            
            printHtmlFooter(out);
        }

    @MessageDriven注解把类标记为一个MDB

    @ActivationConfigProperty注解所定义的激活配置属性,将通知server该消息传递系统的类型(以Queue的方式)以及该系统所须要的不论什么配置的具体信息。

    在这样的情况下,仅仅有当JMS消息有一个名为RECIPIENT的属性,且其值为ReprotProcessor时。才会调用MDB

    这个样例中须要在server中做JMS的配置。对应的每当server接受一个消息时,它将把消息作为參数调用onMessage()方法。由于与client没有不论什么同步连接,所以onMessage()方法不会返回不论什么内容。

    对于消息驱动bean来说仅仅须要知道他的两个标签就可以:异步,消息。

  • 相关阅读:
    Js默认参数(多参数情况)
    用clipboard.js实现纯JS复制文本到剪切板
    C# 获取当前方法的名称空间、类名和方法名称
    C# 爬虫 Jumony-html解析
    C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说
    C# Split 字符文本中的字符太多
    jQuery的ajax跨域 Jsonp原理
    C# 未能加载文件或程序集“xxx”或它的某一个依赖项。参数错误。(异常来自 HRESULT:0x80070057 (E_INVALIDARG))
    美化博客园 添加网易云音乐及生成文章目录
    SQLAlchemy详细教程
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7135793.html
Copyright © 2011-2022 走看看