消息驱动Bean (Message Driven Bean)
消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。它是一个异步的无状态Session Bean,客户端调
用MDB 后无需等待,立刻返回,MDB 将异步处理客户请求。一个MDB 类必须实现MessageListener 接口。当
容器检测到bean 守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入。MDB 在OnMessage()
中决定如何处理该消息。你可以用注释来配置MDB 监听哪一条队列。当MDB 部署时,容器将会用到其中的注
释信息。
当一个业务执行的时间很长,而执行结果无需实时向用户反馈时,很适合使用消息驱动Bean。如订单成功后给用
户发送一封电子邮件或发送一条短信等。
用MDB 后无需等待,立刻返回,MDB 将异步处理客户请求。一个MDB 类必须实现MessageListener 接口。当
容器检测到bean 守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入。MDB 在OnMessage()
中决定如何处理该消息。你可以用注释来配置MDB 监听哪一条队列。当MDB 部署时,容器将会用到其中的注
释信息。
当一个业务执行的时间很长,而执行结果无需实时向用户反馈时,很适合使用消息驱动Bean。如订单成功后给用
户发送一封电子邮件或发送一条短信等。
1.1 Queue 消息的发送与接收(PTP 消息传递模型)
客户端发送消息一般有以下步
骤:
(1) 得到一个JNDI 初始化上下文(Context);
例子对应代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(props);
(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue 来使用相应的类型);
例子对应代码:
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);
例子对应代码:conn = factory.createQueueConnection();
(4) 通过连接来建立一个会话(Session);
例子对应代码:session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不需要事务的并且能自动接收消息收条的会话,在非事务Session 中,消息传递的方
式有三种:
Session.AUTO_ACKNOWLEDGE :当客户机调用的receive 方法成功返回,或当MessageListenser 成功处理
了消息,session 将会自动接收消息的收条。
Session.CLIENT_ACKNOWLEDGE :Session 对象依赖于应用程序对已收到的消息调用确认方法。一旦调用
该方法,会话将确认所有自上次确认后收到的消息。该方法允许应用程序通过一次调用接收、处理和确认一
批消息。
Session. DUPS_OK_ACKNOWLEDGE :一旦消息处理中返回了应用程序接收方法,Session 对象即确认消息
接收,允许重复确认。就资源利用情况而言,此模式最高效。
(5) 查找目的地(Topic/ Queue);
例子对应代码:Destination destination = (Queue) ctx.lookup("queue/foshanshop");
(6) 根据会话以及目的地来建立消息制造者MessageProducer (扩展了QueueSender 和TopicPublisher 这两个基本接口)
例子对应代码:
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("佛山人您好,这是我的第一个消息驱动Bean");//发送文本
producer.send(msg);
骤:
(1) 得到一个JNDI 初始化上下文(Context);
例子对应代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(props);
(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue 来使用相应的类型);
例子对应代码:
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);
例子对应代码:conn = factory.createQueueConnection();
(4) 通过连接来建立一个会话(Session);
例子对应代码:session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不需要事务的并且能自动接收消息收条的会话,在非事务Session 中,消息传递的方
式有三种:
Session.AUTO_ACKNOWLEDGE :当客户机调用的receive 方法成功返回,或当MessageListenser 成功处理
了消息,session 将会自动接收消息的收条。
Session.CLIENT_ACKNOWLEDGE :Session 对象依赖于应用程序对已收到的消息调用确认方法。一旦调用
该方法,会话将确认所有自上次确认后收到的消息。该方法允许应用程序通过一次调用接收、处理和确认一
批消息。
Session. DUPS_OK_ACKNOWLEDGE :一旦消息处理中返回了应用程序接收方法,Session 对象即确认消息
接收,允许重复确认。就资源利用情况而言,此模式最高效。
(5) 查找目的地(Topic/ Queue);
例子对应代码:Destination destination = (Queue) ctx.lookup("queue/foshanshop");
(6) 根据会话以及目的地来建立消息制造者MessageProducer (扩展了QueueSender 和TopicPublisher 这两个基本接口)
例子对应代码:
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("佛山人您好,这是我的第一个消息驱动Bean");//发送文本
producer.send(msg);