- 浏览: 939085 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (453)
- Windows phone 7 (0)
- Andriod (47)
- iPhone (1)
- Web (30)
- J2EE (34)
- stucts 2学习笔记 (34)
- 开发项目 (3)
- spring学习笔记 (24)
- EJB学习笔记 (6)
- Hibernate学习笔记 (15)
- JPA学习笔记 (8)
- Jsp (11)
- ajax (7)
- 异常收集模块 (1)
- jquery (2)
- phoneGap (2)
- jquery Mobile (0)
- java面试总结 (5)
- Object-C (0)
- javascript (6)
- Eclipse (5)
- 支付集成 (2)
- Weblogic (1)
- Dubbox (5)
- Redis (10)
- linux (21)
- Codis (2)
- React Native (0)
- Mysql (6)
- Docker (3)
- 自动化部署 (1)
- 项目Bug管理平台 (2)
- 负载均衡 (1)
- Mycat (2)
- Java基础知识 (16)
- 数据库 (7)
- Maven (17)
- Kafka (21)
- logs (2)
- 大并发 (2)
- 消息中间件 (2)
- 分布式锁 (3)
- 算法 (4)
- 数字证书原理,公钥私钥 (0)
- 数字证书原理 (1)
- 公钥私钥 (1)
- zookeeper (4)
- Hbase (9)
- Hadoop (2)
- storm (2)
- 通信协议 (1)
- Hive (3)
- git (1)
- JVM (2)
- 大数据相关算法 (1)
- idea (5)
- 将博客搬至CSDN (1)
- 设计模式 (2)
- 表达式 (1)
- 代码审查工具 (0)
- 开源项目 (1)
- PyCharm (0)
- python (6)
- Kubernetes (1)
- swagger (1)
- Maven中mirrors和repository的关系 (0)
- RabbitMQ (3)
- redisson (1)
- k8s (2)
- Mac (1)
最新评论
-
misisipi101:
假设库已经分为32个,那么要扩展到64个,怎样做呢
订单分库分表实践总结以及关键步骤 -
mfkxk298:
简单明了的例子,解决了问题,谢谢啦!
关于ListView中notifyDataSetChanged()刷新数据不更新原因 -
whbwang:
" target="_blank" ...
java web开发 高并发处理 -
suguoqian:
...
java web开发 高并发处理 -
xiangnanyujing:
Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建
接下来对Ejb中的消息驱动bean做一个简单使用总结:
首先我们需要对消息的目标地址在jboss中做一个配置(资料)
开始JMS编程前,我们需要先配置消息到达的目标地址(Destination),因为只有目标地址存在了,我们才能发送消息到这个地址。由于每个应用服务器关于目标地址的配置方式都有所不同,下面以jboss为例,配置一个queue类型的目标地址。
-黑色字体配置不用修改
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code=“org.jboss.mq.server.jmx.Queue”
//foshanshop是目标地址名称 name="jboss.mq.destination:service=Queue,name=foshanshop">
// queue/foshanshop指定 foshanshop的JNDI名称
<attribute name="JNDIName">queue/foshanshop</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
Jboss使用一个XML文件配置队列地址,文件的取名格式应遵守*-service.xml
<attribute name="JNDIName">属性指定了该目标地址的全局JNDI名称。如果你不指定JNDIName属性,jboss会为你生成一个默认的全局JNDI,其名称由“queue”+“/”+目标地址名称组成。另外在任何队列或主题被部署之前,应用服务器必须先部署Destination Manager Mbean,所以我们通过<depends>节点声明这一依赖。
配置如下:
文件取名:jms-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=testQueue">
<attribute name="JNDIName">queue/testQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=testTopic">
<attribute name="JNDIName">topic/testTopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
然后发布到jboss 目录\jboss-4.2.3.GA\server\default\deploy
接下来编写消息发送端:
1、TopicSender.java(使用topic)
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//得到一个JNDI初始化上下文(Context)
InitialContext context=new InitialContext();
// 根据上下文查找一个连接工厂 TopicConnectionFactory 。
//该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它
TopicConnectionFactory factory=(TopicConnectionFactory)context.lookup("TopicConnectionFactory");
//从连接工厂得到一个连接 QueueConnection
TopicConnection connection=factory.createTopicConnection();
//QueueSession.AUTO_ACKNOWLEDGE消息确认类型 ---〉自动确认 建立不需要事务的并且能自动确认消息已接收的会话。
TopicSession session=connection.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
//查找目标地址:
Destination destination=(Destination)context.lookup("topic/testTopic");
//根据session创建消息生产者和消息
MessageProducer producer=session.createProducer(destination);
TextMessage message=session.createTextMessage("这是Topic发送消息");
//发送消息
producer.send(message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2、使用queue
QueueSender.java
try {
//得到一个JNDI初始化上下文(Context)
InitialContext context=new InitialContext();
// 根据上下文查找一个连接工厂 QueueConnectionFactory 。
//该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它
QueueConnectionFactory factory=(QueueConnectionFactory )context.lookup("QueueConnectionFactory");
//从连接工厂得到一个连接 QueueConnection
QueueConnection connection=factory.createQueueConnection();
//QueueSession.AUTO_ACKNOWLEDGE消息确认类型 ---〉自动确认 建立不需要事务的并且能自动确认消息已接收的会话。
QueueSession session=connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
//查找目标地址:
Destination destination=(Destination)context.lookup("queue/testQueue");
//根据session创建消息生产者和消息
MessageProducer producer=session.createProducer(destination);
TextMessage message=session.createTextMessage("这是queue发送消息");
//发送消息
producer.send(message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
再接下来是编写消息接受端:
1、topic接收端
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="topic/testTopic"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})
public class TopicMDB implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage msg=(TextMessage)message;
try {
System.out.println("Topic:"+msg.getText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、queue接受端:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/testQueue"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})
public class QueueMDB implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage msg=(TextMessage)message;
try {
System.out.println(msg.getText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后打包、编译 使用build.xml 在项目路径下新建build.xml
<?xml version="1.0"?>
<!-- ======================================================================= -->
<!-- EJB3 HelloWorld build file -->
<!-- ======================================================================= -->
<project name="EjbJMSBean" default="ejbjar" basedir="..">
<property environment="env" />
<property name="app.dir" value="${basedir}\EjbJMSBean" /><!--EjbJMSBean是项目名称-->
<property name="src.dir" value="${app.dir}\src" />
<property name="jboss.home" value="${env.JBOSS_HOME}" />
<property name="jboss.server.config" value="default" />
<property name="build.dir" value="${app.dir}\build" />
<property name="build.classes.dir" value="${build.dir}\classes" />
<!-- Build classpath -->
<path id="build.classpath">
<fileset dir="${jboss.home}\client">
<include name="*.jar" />
</fileset>
<pathelement location="${build.classes.dir}" />
</path>
<!-- =================================================================== -->
<!-- Prepares the build directory -->
<!-- =================================================================== -->
<target name="prepare" depends="clean">
<mkdir dir="${build.dir}" />
<mkdir dir="${build.classes.dir}" />
</target>
<!-- =================================================================== -->
<!-- Compiles the source code -->
<!-- =================================================================== -->
<target name="compile" depends="prepare" description="编绎">
<!--includes筛选哪些包下的类被编译-->
<javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on" optimize="off" includes="com/**">
<classpath refid="build.classpath" />
</javac>
</target>
<target name="ejbjar" depends="compile" description="创建EJB发布包">
<jar jarfile="${app.dir}\EjbJMSBean.jar">
<fileset dir="${build.classes.dir}">
<include name="com/**/*.class" />
</fileset>
<!--包含这个persistence.xml文件-->
<!--<metainf dir="${src.dir}\META-INF"></metainf>-->
</jar>
</target>
<target name="deploy" depends="ejbjar">
<copy file="${app.dir}\EjbJMSBean.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy" />
</target>
<!-- =================================================================== -->
<!-- Cleans up generated stuff -->
<!-- =================================================================== -->
<target name="clean">
<delete dir="${build.dir}" />
<delete file="${jboss.home}\server\${jboss.server.config}\deploy\EjbJMSBean.jar" />
</target>
</project>
然后打包、编译 执行TopicSender和QueueSender
参考资料:
消息传递系统的中心就是消息。一条 Message 由三个部分组成:
头(header),属性(property)和主体(body)。
消息有下面几种类型,他们都是派生自 Message 接口。
StreamMessage:一种主体中包含 Java 基元值流的消息。其填充和读取均按顺序进行。
MapMessage:一种主体中包含一组名-值对的消息。没有定义条目顺序。
TextMessage:一种主体中包含 Java 字符串的消息(例如,XML 消息)。
ObjectMessage:一种主体中包含序列化 Java 对象的消息。
BytesMessage:一种主体中包含连续字节流的消息。
JMS 支持两种消息传递模型:点对点(point-to-point,简称 PTP)和发布/订阅(publish/subscribe,简称 pub/sub)。这两种消息传递模型非常相似,但有以下区别:
PTP 消息传递模型规定了一条消息只能传递给一个接收方。 采用javax.jms.Queue 表示。
Pub/sub 消息传递模型允许一条消息传递给多个接收方。采用javax.jms.Topic表示
这两种模型都通过扩展公用基类来实现。例如:javax.jms.Queue 和javax.jms.Topic 都扩展自javax.jms.Destination 类。
消息发送:
一般发送消息有以下步骤:
(1) 得到一个JNDI初始化上下文(Context)
InitialContext ctx = new InitialContext();
(2) 根据上下文查找一个连接工厂 QueueConnectionFactory 。该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它;
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
(3) 从连接工厂得到一个连接 QueueConnection
conn = factory.createQueueConnection();
(4) 通过连接来建立一个会话(Session);
session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不需要事务的并且能自动确认消息已接收的会话。
(5) 查找目标地址:
例子对应代码:Destination destination = (Destination ) ctx.lookup("queue/foshanshop");
(6) 根据会话以及目标地址来建立消息生产者MessageProducer (QueueSender和TopicPublisher都扩展自MessageProducer接口)
例子对应代码:
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("您好,这是我的第一个消息驱动Bean");
producer.send(msg);
producer.close();
session.close();
con.close();
采用消息驱动Bean (Message Driven Bean)接收消息:
消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。它和无状态Session Bean一样也使用了实例池技术,容器可以使用一定数量的bean实例并发处理成百上千个JMS消息。正因为MDB具有处理大量并发消息的能力,所以非常适合应用在一些消息网关产品。如果一个业务执行的时间很长,而执行结果无需实时向用户反馈时,也很适合使用MDB。如订单成功后给用户发送一封电子邮件或发送一条短信等。
一个MDB通常要实现MessageListener接口,该接口定义了onMessage()方法。Bean通过它来处理收到的JMS消息。
package javax.jms;
public interface MessageListener {
public void onMessage(Message message);
}
当容器检测到bean守候的目标地址有消息到达时,容器调用onMessage()方法,将消息作为参数传入MDB。MDB在onMessage()中决定如何处理该消息。你可以使用注释指定MDB监听哪一个目标地址(Destination)。当MDB部署时,容器将读取其中的配置信息。
发表评论
-
重庆APP开发 重庆Android 重庆Ios 爬虫科技 重庆爬虫科技
2014-10-06 12:03 9<!--[if gte mso 9]><x ... -
使用会话Bean+实体bean+数据源
2012-10-08 20:34 868下面接着总结Ejb使用会话Bean+实体bean+数据源开发流 ... -
jboss数据源配置
2012-10-07 23:45 1021在JBoss安装目录\jboss-4.2.3.GA\docs\ ... -
一个Ejb调用另一个Ejb
2012-10-07 23:40 1067一个Ejb调用另一个Ejb有两种方法: 第一是同个JNDI ... -
EJB使用build.xml来打包编译
2012-10-06 23:10 1076模板: <?xml version="1.0 ... -
EJB3.x第一个Helloworld
2012-10-06 22:11 4940下面我们一起来学习Ejb ...
相关推荐
EJB(Enterprise JavaBeans)..."EJB消息驱动bean Demo"为你提供了一个实际操作的例子,通过它你可以学习如何设置和使用MDB,以及如何利用JMS进行通信。理解并熟练掌握这些概念对于开发企业级的Java应用程序至关重要。
在本例中,我们将探讨如何使用EJB消息驱动Bean处理Queue和Topic。 1. **消息驱动Bean的基本概念**: - **MDB的角色**:MDB充当JMS(Java Message Service)客户端,它监听特定的消息源,接收到消息后自动调用Bean...
【标题】:“ejb2.0消息驱动bean的开发(JBOSS4.0.4.GA 环境)” 在Java企业版(Java EE)的早期版本中,EJB(Enterprise JavaBeans)2.0是核心组件之一,用于构建分布式、事务处理和面向服务的业务应用程序。消息...
### EJB2与EJB3消息驱动Bean:深入解析与应用 #### 一、EJB2消息驱动Bean ##### 1. **理解消息驱动Bean(MDB)** 消息驱动Bean是Java EE中用于处理异步消息的一种特殊类型的EJB。在EJB2中,MDB主要用于接收来自消息...
**消息驱动Bean (Message Driven Bean, MDB) 是企业级JavaBeans (Enterprise JavaBeans, EJB) 3.0 规范中引入的一种组件模型,主要用于处理异步消息通信。在分布式应用程序中,MDB 提供了一种高效且解耦的方式来处理...
### Java EE 5 学习笔记06:EJB之消息驱动Bean总结 #### EJB 消息驱动 Bean (Message Driven Bean, MDB) 在Java EE 5中,消息驱动Bean(MDB)是一种特殊的EJB组件,它主要用于处理异步消息。MDB能够接收并处理由...
2. **实体Bean**:实体Bean是EJB的三大类型之一(另外两种是会话Bean和消息驱动Bean)。实体Bean通常用于表示数据库中的实体,它们有持久化状态,并且可以通过其唯一的键(主键)进行识别。在购物车应用中,可能包含...
消息驱动Bean(Message Driven Bean,MDB)是Java EE(Enterprise Edition)平台中的一种特殊类型的Enterprise JavaBean(EJB),主要用于处理消息队列中的消息。MDBs是异步的,这意味着它们不会直接与客户端交互,...
本篇主要关注Jboss服务器下的EJB开发,特别是消息驱动Bean(Message Driven Bean, MDB)的应用。消息驱动Bean是EJB的一种类型,它专门用于处理异步消息,通常是通过Java Message Service (JMS) API来实现的。 首先...
消息驱动bean(Message driven bean,MDB)专门用于处理JMS消息。每个MDB都有自己的实例池。当JMS客户端发送消息时,EJB容器会从池中选取一个实例来处理消息。处理完成后,实例返回池中等待下一次消息。这种机制确保...
本篇文章将深入探讨EJB实体Bean的概念、其在Eclipse集成开发环境中的使用,以及与MySQL数据库的集成。 ### 一、EJB实体Bean概述 EJB实体Bean是Java EE应用服务器管理的对象,它们负责处理数据存储和检索。实体Bean...
在JBoss这样的应用服务器中,EJB提供了三种主要的bean类型:实体Bean(Entity Bean)、会话Bean(Session Bean)和消息驱动Bean(Message-Driven Bean)。下面将详细探讨这三种bean的开发模式。 1. 实体Bean...
在实践中,EJB2 SessionBean通常与EntityBean(持久化实体)和Message Driven Bean(消息驱动bean)配合使用,构建完整的Java EE应用程序。EntityBean处理数据库操作,SessionBean执行业务逻辑,而Message Driven ...
本讲将深入探讨EJB 3.0中的消息驱动Bean(Message Driven Bean,MDB),这是一种特殊类型的EJB,专门设计用于处理JMS(Java Message Service)消息。 消息驱动Bean的主要功能是异步接收和处理消息。这使得应用程序...
消息驱动Bean(Message Driven Bean...通过以上步骤和知识点,我们可以理解如何在WebLogic服务器上配置和使用消息驱动Bean,实现高效、可靠的异步消息处理。实践中,应根据具体需求进行调整,确保系统的稳定性和效率。
在Java 2企业版(J2EE)框架中,EJB(Enterprise JavaBeans)是服务器端的组件模型,主要分为三种类型:实体Bean(Entity Beans)、会话Bean(Session Beans)和消息驱动Bean(Message-Driven Beans)。实体Bean代表...
- **注解驱动**:EJB3.0引入了注解,使得开发者无需编写XML配置文件,可以直接在类和方法上添加注解来定义Bean的行为。例如,`@Stateless` 注解用于声明一个类为无状态SessionBean。 - **依赖注入**:通过`@EJB`...
许多初学者拜求的EJB知识点: @MessageDriven( activationConfig ={ @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"), @ActivationConfigProperty(property...