消息驱动bean(MDB)实例
到眼下为止前面介绍的有关JavaEE的东西都是同步的。也就是说调用者调用某个方法。那么这种方法必须马上运行并返回运行结果。
用官方一些的语言来说就是“client通过业务接口调用一个方法,在将控制权返回给client之前,server完毕该方法调用”。对于我们接触到的大多数操作而言这是最自然也是最easy实现的方法。然而,有些情况下client并不须要等待server响应。而仅仅须要告诉server应该做什么就能够了。在完毕“告知”任务之后client能够继续工作,而server则默默的在一旁处理client的请求(一般会是非常多client,非常多请求)。
在JavaEE中对于消息的处理有其自身的解决的方法——消息驱动bean(Message-Driven Bean,MDB)。它是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来说仅仅须要知道他的两个标签就可以:异步,消息。
消息驱动bean(MDB)实例的更多相关文章
- JMS和消息驱动Bean(MDB)
一.说明 本示例使用的ActiveMQ作为消息中间件,服务器为Glassfish,使用JMS发送消息,在MDB接收到消息之后做打印输出. 二.ActiveMQ安装配置 1.安装console war包 ...
- EJB_开发消息驱动bean
开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...
- EJB3.0 EJB开发消息驱动bean
(7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个 ...
- 消息驱动Bean
消息驱动bean是专门用来处理基于消息请求的组件.MDB负责处理消息,而EJB容器则负责处理服务(事务,安全,并发,消息确认等),使Bean的开发者集中精力在处理消息的业务逻辑上. 消息驱动Bean. ...
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
- 菜鸟调错(二)——EJB3.0部署消息驱动Bean抛javax.naming.NameNotFoundException异常
在部署EJB的消息驱动Bean时遇到了如下的错误: ERROR [org.jboss.resource.adapter.jms.inflow.JmsActivation] (WorkManager(2 ...
- 3.开发Java消息驱动bean实例代码
java消息服务(JMS)是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互.应用程序A发送一条消息到消息服务器的某个目的地(Destination),然后消 ...
- EJB_消息驱动发展bean
消息驱动发展bean Java信息服务(Java MessageService) Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API ...
- jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5
上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss ...
随机推荐
- day21-4 菱形继承问题(类的查找顺序)
目录 菱形继承问题 经典类(了解) 新式类 mro方法 菱形继承问题 在Python中子类可以同时继承多个父类,如A(B,C,D) 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这条分 ...
- Flask框架 之上下文、请求钩子与Flask_Script
一.上下文 请求上下文:request与session 应用上下文:current_app与g:一次请求多个函数可以用它传参 @app.route("/") def index() ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- java中属性命名get字母大小写问题
java文件 company.java private int sTime; public void setSTime (int sTime) { this.sTime = sTime; ...
- C#解析单层html的中的文本,然后拼接起来
匹配单层html的小demo,应该能匹配大多数html字符串.多层(嵌套)html标签解析不出来.可能有小bug,我抛砖引玉下,哈哈. using System; using System.Colle ...
- webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu
按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...
- 利用jQuery对li标签操作
<ul class="con" id="products"> <li i=" class=""> < ...
- [笔记] APIO 2018 Day1
计算折纸 computaional origami 全息算法(???) margulis napkin problem 素数里有任意长的等差数列 xor gate Σxi or gate(exact ...
- Git的入门
Git的基本介绍: Git:是一个版本控制工具. Github:是非常有名的在线版本管理网站(速度比较慢). Oschina:中国版本的github,(旗下的的码云地址:gitee.com,速度快) ...
- Spring 实现 IoC
理解 “ 控制反转(IoC)” 控制反转(IoC):用白话来讲,就是由 Spring 容器控制程序中类与类之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓 “控制反转” 的概念所在:控 ...