`
hain
  • 浏览: 454072 次
  • 来自: ...
社区版块
存档分类
最新评论

Message Driven Bean & JMS

    博客分类:
  • ejb
阅读更多

Java消息服务(JMS Java Message Services)提供了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics).

Queue仅允许一个消息传送给一个客户(一对一):
消息的接收者和发送者之间不存在时间上的依赖关系。不论发送者发送消息时接收者是否在运行,接收者都可以提取信息。接收者对于成功处理的消息给出回执。

Topics可以有多个客户端(一对多,多对多):
向某个话题订阅的客户程序只能收到那些在它订阅之后发布的消息。为了接收到消息,订阅者必须保持活动状态。因此,发布者和订阅者之间存在时间上的依赖关系。

点对点消息模式通过一个消息队列(Queue)实现,消息的生产者向队列写入消息,消息的订阅者从队列提取消息。发布-订阅消息模式通过一个话题(Topic)节点构成的层次结构实现,消息的生产者向这个层次结构发布消息,消息的订阅者向这个结构订阅消息。

消息驱动的Bean只有一个Bean类。从某些方面看,消息驱动的Bean类似于无状态会话Bean:消息驱动的Bean不为特定的客户保留数据或对话状态。

@MessageDriven(activationConfig={
   @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
   @ActivationConfigProperty(propertyName="destination",propertyValue="queue/Msg")
})

@MessageDriven注释指明这是一个消息驱动Bean,并使用@ActivationConfigProperty注释配置消息的各种属性,其 中destinationType属性指定消息的类型,消息有两种类型topics 和queues,下面是这两种消息类型的介绍:
Topics 可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher, 消息接
受者叫做subscriber。destinationType属性对应值:javax.jms.Topic

Queue 仅仅允许一个消息传送给一个客户。一个发送者将消息放入消息队列,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能再得到它。destinationType属性对应值:javax.jms.Queue
destination属性用作指定消息路径,消息驱动Bean在发布时,如果路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除

当一个消息到达queue/Msg队列时,就会触发onMessage方法,消息作为一个参数传入.


package ejb;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.ejb.MessageDriven;
import javax.jms.TextMessage;
import javax.jms.JMSException;
import javax.ejb.ActivationConfigProperty;

@MessageDriven(activationConfig={
   @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
   @ActivationConfigProperty(propertyName="destination",propertyValue="queue/Msg")
})
public class Msg implements MessageListener {

public void onMessage(Message msg) {
   // TODO Auto-generated method stub
   TextMessage tmsg = (TextMessage) msg;
   try{
    System.out.println(tmsg.getText());
   }catch(JMSException e){
    e.printStackTrace();
   }
}

}

 

package test;

import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.JMSException;
import javax.jms.QueueSession;
import javax.jms.Queue;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.naming.*;

public class MsgTest {
public static void main(String[] args){
   QueueConnection conn;
   QueueSession ssn;
   Queue queue;
   QueueSender sender;
   TextMessage msg;
   try{
    InitialContext ctx = new InitialContext();
    QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.lookup("ConnectionFactory");
    conn = qcf.createQueueConnection();
    ssn = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    queue =(Queue) ctx.lookup("queue/Msg");
    msg = ssn.createTextMessage("MM!好久不见了!很想啊!");
    sender = ssn.createSender(queue);
    sender.send(msg);
    sender.close();
   }catch(NamingException e){
    e.printStackTrace();
   }catch(JMSException e1){
    e1.printStackTrace();
   }
}
}


(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");
InitialContext ctx = new InitialContext(props);

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);
例子对应代码:
QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.lookup("ConnectionFactory");

(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);
例子对应代码:conn = qcf.createQueueConnection();

(4) 通过连接来建立一个会话(Session);
例子对应代码:ssn = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不需要事务的并且能自动接收消息收条的会话,在非事务Session 中,消息传递的方式有三种:
Session.AUTO_ACKNOWLEDGE :当客户机调用的receive方法成功返回,或当MessageListenser 成功处理了消息,session将会自动接收消息的收条。

Session.CLIENT_ACKNOWLEDGE :客户机通过调用消息的acknowledge方法来接收消息。接收发生在session层。接收到一个被消费的消息时,将自动接收该session已经 消费的所有消息。例如:如果消息的消费者消费了10条消息,然后接收15 个被传递的消息,则前面的10 个消息的收据都会在这15 个消息中被接收。

Session.DUPS_ACKNOWLEDGE :指示session缓慢接收消息。

(5) 查找目的地(Topic/ Queue);
例子对应代码:queue =(Queue) ctx.lookup("queue/Msg");

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/QueueReceiver).
例子对应代码:
msg = ssn.createTextMessage("胡辣汤!好久没有喝了!很想啊!");
sender = ssn.createSender(queue);
sender.send(msg);

分享到:
评论

相关推荐

    EJB3.0开发Message Driven Bean

    @MessageDriven(activationConfig={ @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue=...

    EJB3.0开发Message Driven Bean.rar

    你需要在类上添加这个注解,并指定消息驱动接口,例如`@MessageDriven(name = "MyMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })...

    Message-Driven Bean EJB实例源代码

    - 使用`@MessageDriven`注解标记该类,指定JMS目的地类型(队列或主题),以及其他配置属性。 - 在ejb-jar.xml或元数据注解中配置MDB,如JNDI名称、消息驱动适配器等。 6. **源代码解析**: 压缩包中的源代码...

    java源码:Message-Driven Bean EJB实例源代码.zip

    在EJB项目中,我们需要在ejb-jar.xml或@MessageDriven注解中配置MDB的相关属性,如消息监听接口、JMS目的地类型(队列或主题)、JNDI名称等。 **4. MDB的源码分析** 在提供的源码中,我们可能会看到以下关键组件: ...

    基于Java的实例源码-Message-Driven Bean EJB实例源代码.zip

    2. **编写MDB类**:MDB类需要实现`javax.ejb.MessageDrivenBean`接口或者继承`javax.jms.MessageListener`接口,并标注`@MessageDriven`注解。这个注解包含了JMS目的地的配置信息,如目的地类型、激活配置等。 3. *...

    基于java的Message-Driven Bean EJB实例源代码.zip

    - 使用`@MessageDriven`注解来声明bean是一个MDB,并指定JMS配置,如目的地类型(队列或主题)、消息驱动适配器等。 - 可以通过`@ActivationConfigProperty`注解进一步配置MDB的行为,例如设置消息选择器、最大...

    基于Java的Message-Driven Bean EJB实例源代码.zip

    Java Message-Driven Bean(MDB)是企业级Java(EJB)技术的一部分,它主要用于处理Java消息服务(JMS)中的消息。在Java EE环境中,MDBs是无状态的bean,它们作为后台服务运行,监听消息队列或主题,并对到来的消息...

    Message-Driven Bean EJB实例源代码.rar

    1. **MDB类定义**:MDB类需要实现 javax.jms.MessageListener 接口,并且通常会带有 @MessageDriven 注解。例如: ```java import javax.ejb.MessageDriven; import javax.jms.MessageListener; import javax.jms....

    Message-Driven Bean EJB实例源代码.7z

    7. **部署**:在EJB 3.1及更高版本中,MDB的部署变得更加简单,可以使用注解(如`@MessageDriven`)来代替XML配置,进一步简化了开发过程。 在这个源代码实例中,你可能会看到以下几个关键部分: 1. **MDB类**:...

    基于Java的源码-Message-Driven Bean EJB实例源代码.zip

    Java中的Message-Driven Bean (MDB) 是Enterprise JavaBeans (EJB) 规范的一部分,用于处理JMS(Java Message Service)消息。这个压缩包“基于Java的源码-Message-Driven Bean EJB实例源代码.zip”显然包含了实现...

    基于Java的实例开发源码-Message-Driven Bean EJB实例源代码.zip

    "基于Java的实例开发源码-Message-Driven Bean EJB实例源代码.zip" 这个标题揭示了本次讨论的核心内容,即一个关于Java编程的实例项目,特别是涉及了Java企业版(Java EE)中的Message-Driven Bean(MDB)组件。...

    Message-Driven Bean 培训PPT

    MDB(Message-Driven Bean)是一种特殊的EJB,它被设计用来处理来自JMS的消息。MDB具有特定的生命周期,包括创建、激活和销毁阶段。当一个MDB实例被创建时,它会被激活并准备好接收消息。当不再需要时,MDB会被销毁...

    EJB3中MessageDrivenBean知识

    在EJB3中,创建一个MDB非常简单,只需要在bean类上添加`@MessageDriven`注解,并指定消息驱动的类型,如`@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")`来定义...

    ejb3进阶案例

    定义MessageDriven Bean时,我们需要使用`@MessageDriven`注解,并指定消息驱动的类型,例如`@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic")`用于指定是主题还是...

    EJB2 SessionBean

    EntityBean处理数据库操作,SessionBean执行业务逻辑,而Message Driven Bean响应JMS(Java消息服务)消息,实现异步通信。 总之,EJB2 SessionBean是Java EE早期版本中的核心组件,它为分布式应用程序提供了一种...

    ejb状态bean和消息bean的源代码

    - `@MessageDriven` 注解:标记Bean为消息驱动。 - `@ActivationConfigProperty`:配置与JMS资源相关的属性,如目的地类型、目的地名称等。 - 实现`MessageListener`接口或使用`@Inject` JMS消息。 例如: ```java ...

    EJB容器对bean的管理

    消息驱动bean(Message driven bean,MDB)专门用于处理JMS消息。每个MDB都有自己的实例池。当JMS客户端发送消息时,EJB容器会从池中选取一个实例来处理消息。处理完成后,实例返回池中等待下一次消息。这种机制确保...

    消息驱动bean EJB 3.0

    例如,`@MessageDriven` 注解用于标记类为MDB,`@ActivationConfigProperty` 用于设置与JMS 相关的属性。 - **部署描述符**: 部署描述符(如ejb-jar.xml 或者META-INF/ejb-jar.xml)可以用来进一步配置MDB,但EJB ...

Global site tag (gtag.js) - Google Analytics