【EJB基础】Message Driven Bean

本文介绍EJB2.0中的MessageDrivenBean,并通过实例对比JMS的点对点(P2P)与发布订阅(Pub/Sub)模型。P2P确保每条消息仅被一个消费者接收并处理;而Pub/Sub支持消息广播,允许多个消费者同时接收消息。

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

MessageDriven BeanEJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。对客户端来说,message-driven bean就是异步消息的消费者,当消息到达之后,由容器负责调用MDB。客户端发送消息到destinationMDB作为一个MessageListener接收消息。

 

JMS支持两种消息模型Point-to-PointP2P)和Publish/SubscribePub/Sub),即点对点和发布订阅模型。

 

P2P每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

Pub/sub:每个消息可以有多个消费者。

 

下面举例:

P2P

P2P消息传递模型规定了一条消息只能传递给一个接收方。采用javax.jms.Queue表示。为了证明客户端发的消息只能有一个消费者接收,建立两个EJB Project

 

EJB Projec1

@MessageDriven(
		activationConfig = {
				@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
				@ActivationConfigProperty(propertyName="destination", propertyValue="queue/myqueue")
				
		}
)
public class MyMDBBean implements MessageListener{
	public void onMessage(Message msg) {
		TextMessage textMessage=(TextMessage)msg;
		try {
			System.out.println("MyQueueMDBBean被调用了【"+textMessage.getText()+"】");
		} catch (JMSException e) {
			e.printStackTrace();
		}
	
	
	}
}

EJB Project2

@MessageDriven(
		activationConfig = {
				@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
				@ActivationConfigProperty(propertyName="destination", propertyValue="queue/myqueue")
				
		}
)
public class MyMDBBean02 implements MessageListener{
	public void onMessage(Message msg) {
		TextMessage textMessage=(TextMessage)msg;
		try {
			System.out.println("MyQueueMDBBean02被调用了【"+textMessage.getText()+"】");
		} catch (JMSException e) {
			e.printStackTrace();
		}
	
	
	}
}
客户端测试类:

public class MyQBeanClient {

	/**     
	 * 消息驱动Bean客户端 (点对点模式)
	 * @param @param args   
	 */

	public static void main(String[] args)throws Exception {
		InitialContext ctx = new InitialContext();
		
		//获取ConnectionFactory
		QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
		
		//创建QueueConnection对象
		QueueConnection connection = factory.createQueueConnection();
		
		//创建QueueSession对象,第一个参数表示事务自动提交,第二个参数标识一旦消息被正确送达,将自动发回响应
		QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
		
		//获取Destination对象
		Queue queue = (Queue)ctx.lookup("queue/myqueue");
		
		//创建文本消息
		TextMessage msg = session.createTextMessage("世界,你好");
		
		//创建发送者
		QueueSender sender = session.createSender(queue);
		
		//发送信息
		sender.send(msg);
		
		//关闭会话
		session.close();
		System.out.println("消息已经发送");

	}

}

测试结果:


两个MDB,一个客户端发送消息只能有一个接受到,随机的。


Pub/sub

Pub/sub消息传递模型允许一条消息传递给多个接收方。采用javax.jms.Topic表示。也同样建立两个EJB Project

EJB Project1

@MessageDriven(
		activationConfig = {
				@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic"),
				@ActivationConfigProperty(propertyName="destination", propertyValue="topic/myTopic")
				
		}
)
public class MyTopicMDBBean implements MessageListener{
	public void onMessage(Message msg) {
		TextMessage textMessage=(TextMessage)msg;
		try {
			System.out.println("MyTopicMDBBean被调用了【"+textMessage.getText()+"】");
		} catch (JMSException e) {
			e.printStackTrace();
		}
	
	
	}
}

EJB Project2同上。

客户端测试类:

public class MyTopicBeanClient {

	/**     
	 * 消息驱动Bean客户端 (pub/subm模式)
	 * @param @param args   
	 */

	public static void main(String[] args)throws Exception {
		InitialContext ctx = new InitialContext();
		
		//获取ConnectionFactory
		TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("ConnectionFactory");
		
		//创建TopicConnection对象
		TopicConnection connection = factory.createTopicConnection();
		
		//创建TopicSession对象,第一个参数表示事务自动提交,第二个参数标识一旦消息被正确送达,将自动发回响应
		TopicSession session = connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
		
		//获取Destination对象
		Topic Topic = (Topic)ctx.lookup("topic/myTopic");
		
		//创建文本消息
		TextMessage msg = session.createTextMessage("世界,你好");
		
		//创建发送者
		TopicPublisher topicPublisher = session.createPublisher(Topic);
		
		//发送信息
		topicPublisher.publish(msg);
		
		//关闭会话
		session.close();
		System.out.println("消息已经发送");

	}

}
试结果:


一个客户端发送一条消息可以传递给多个接收方。相当于多人聊天室。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值