Message Driver Bean

本文介绍了Java消息服务(JMS)的基本概念及其编程模型,并探讨了消息驱动Bean(MDB)作为消息监听器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=brown][b]
Message Driven Bean(MDB):[/b][/color] 消息驱动Bean,基于JMS
[color=brown][b]1.JMS介绍[/b][/color]
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS支持两种消息模型,Point-toPoint(P2P)和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型
[color=red][b]运行的状态:[/b][/color]当然,为了缓和这种严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
[color=red][b]消息的消费:[/b][/color]在JMS中,消息的产生和消费是异步的。对于消息来说,JMS的消费者可以通过两种方式 来消费消息。
[color=red]同步[/color]:订阅者或接受者调用receive方法来接受消息,receive方法在能够接收到消息之前(超时之前)将一直阻塞
[color=red] 异步[/color]:订阅者或接受者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法
[b][color=brown]2.JMS编程模型[/color][/b]
[color=red] [b]Connection Factory[/b][/color]
创建Cooection对象的工厂,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory的对象。
[color=red][b]Destination[/b][/color]
Destination的意思是消息生产者的消息发送目标或者说是消息消费者的消息来源,对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic),对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象——Queue,Topic。可以通过JNDI来查找Destination
[color=red][b]Conneciton[/b][/color]
Connection表示客户端和JMS系统之间建立的链接(对TCP/IP socket 的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种QueueConnection和TopicConnection。
[color=red][b]Session[/b][/color]
Session使我们操作消息的接口,可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接受多个消息时,可以将这些发送/接受动作放到一个事务中。同样,也分QueueSession和 TopicSession。
[color=red][b]消息消费者[/b][/color]
消息消费者由Session创建。用于接受被发送到Destination的消息,QueueReceiver和TopicSubscriber,可分别通过session的createReceiver(queue)或createSubscriber(topic)来创建,当然,也可以通过 session的createDurableSubscriber方法来创建持久化的订阅者。
[color=red][b]MessageListener[/b][/color]
消息监听器,如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message Driver Bean)就是一种MessageListener。
[color=brown][b]3.MDB介绍[/b][/color]
对于客户端来说,message-driven bean 就是异步消息的消费者。当消息到达之后,由容器负责调用MDB。客户端发送消息到destination,MDB作为一个MessageListener接受消息
### Spring框架中基于资源文件的Bean装配 在Spring框架内,可以通过XML配置文件定义并装配Bean。这种方式允许开发者以声明式的风格描述对象以及它们之间的关系而无需硬编码这些逻辑。 #### XML Bean Definition Configuration 最传统的做法是在`applicationContext.xml`或其他自定义命名的XML文件里指定Bean及其属性: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义一个简单的bean --> <bean id="exampleService" class="com.example.ExampleServiceImpl"> <!-- 设置构造函数参数 --> <constructor-arg name="message" value="Hello World"/> <!-- 或者设置属性 --> <!--<property name="someProperty" ref="anotherBean"/>--> </bean> </beans> ``` 上述代码片段展示了如何在一个名为`exampleService`的Bean上设定构造方法注入的方式传递消息字符串给服务实现类[^1]。 对于更复杂的场景,比如需要加载外部化配置(如数据库连接信息),可以利用占位符`${}`语法读取环境变量或properties/yaml文件里的键值对: ```xml <context:property-placeholder location="classpath*:META-INF/config/*.properties"/> <!-- 使用占位符引用外部化的配置项 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> ``` 这里引入了`context:property-placeholder`标签用于解析特定路径下的`.properties`文件,并使得其中的内容能够被其他地方当作模板变量使用[^3]。 另外,在较新的版本中,推荐采用Java Config方式替代纯XML配置,不过理解XML配置的基础仍然是非常有价值的,尤其是在维护遗留系统的时候。 #### 自动扫描组件与混合模式 除了显式地在XML中注册每一个单独的Bean之外,还可以启用组件扫描(`component-scan`)特性让容器自动发现带有相应注解(@Component,@Repository等)的候选组件并将它们纳入管理范围之内。这通常配合`@Configuration``@Bean`一起工作,形成一种混合型配置方案——既保留了一定程度上的灵活性又不失简洁性。 ```java @Configuration @ComponentScan(basePackages = {"com.example"}) public class AppConfig { } ``` 此段落介绍了如何结合XML配置文件同现代编程模型相结合的方法来进行更加灵活高效的Bean装配操作[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值