`
itsnack
  • 浏览: 39565 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

EJB3.0 消息 异步

阅读更多
Java消息服务(JMS Java Message Services)

提供了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics).

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

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

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

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


java 代码

@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方法,消息作为一个参数传入.




java 代码

   
  
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();  
  }  
}  
  
}  

 
java 代码

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("HELLO WORLD!");  
   sender = ssn.createSender(queue);  
   sender.send(msg);  
   sender.close();  
  }catch(NamingException e){  
   e.printStackTrace();  
  }catch(JMSException e1){  
   e1.printStackTrace();  
  }  
}  
}  



(1) 得到一个JNDI初始化上下文(Context);
例子对应代码:


java 代码

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来使用相应的类型);
例子对应代码:


java 代码

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).
例子对应代码:


java 代码

msg = ssn.createTextMessage("HELLO WORLD!");  
sender = ssn.createSender(queue);  
sender.send(msg);  



----------------------------------------------------------
发送对象。。。。。。
==============================================================

jboss-5.1.0.GA\server\default\deploy\messaging\destinations-service.xml

<mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=The_Queue_Name" xmbean-dd="xmdesc/Queue-xmbean.xml">
  <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
  <depends>jboss.messaging:service=PostOffice</depends>
</mbean>

-------------------------------------
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.interceptor.Interceptors;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;

/**
* 异步连接工厂
*/
@Resource(mappedName = "ConnectionFactory") 
private QueueConnectionFactory qcf;

/**
* 异步队列
*/
@Resource(mappedName = "queue/The_Queue_Name") 
    private Queue queue;



private void sendMain(List trList) {
QueueConnection conn = null;
QueueSession session = null;
MessageProducer messageProducer = null;
ObjectMessage objectMessage = null;

try {
conn = qcf.createQueueConnection();
session = conn.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
messageProducer = session.createProducer(queue);
objectMessage = session.createObjectMessage((Serializable) trList);

// 发送数据到服务器
messageProducer.send(objectMessage);
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
messageProducer.close();
session.close();
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
分享到:
评论

相关推荐

    ejb3.0开发实例(java工程)

    5. **消息驱动Bean**:消息驱动Bean用于处理JMS(Java Message Service)消息,它在后台异步接收和处理消息,非常适合于处理高并发和解耦的场景。 6. **事务管理**:EJB 3.0提供了自动的事务管理,可以根据方法的...

    ejb3.0开发规范PDF

    EJB 3.0允许定义异步方法,这使得后台任务可以在不阻塞调用者的情况下执行,提高了系统的响应性。通过`@Asynchronous`注解,开发者可以声明一个方法为异步执行。 8. **Web服务支持(Web Services)**: EJB 3.0还...

    EJB 3.0实例教程.pdf

    在EJB 3.0之前,开发者需要编写大量的XML配置文件来描述实体、会话和消息驱动bean的行为。EJB 3.0引入了注解,使得开发者可以直接在类和方法上使用注解来声明bean的角色和行为。例如,`@Entity`用于标记实体bean,`@...

    ejb3.0入门图文教程

    接下来,《EJB3.0开发Message Driven Bean.pdf》将引导你了解消息驱动bean(MDB)。MDB是一种特殊类型的session bean,专门用于处理JMS(Java Message Service)消息。在企业级应用中,当系统需要异步处理大量数据...

    Java之精通EJB3.0.pdf

    EJB3.0增强了对异步方法的支持,通过`@Asynchronous`注解即可实现异步调用,这对于提高应用程序性能和响应性具有重要意义。 **4. 容器管理实体Bean:** EJB3.0引入了容器管理实体Bean(CMB),这是一种新的持久化...

    《EJB 3.0入门经典》 源码

    在"ejb3.0入门经典教程-source"这个压缩包中,包含了书中各个章节的示例代码,覆盖了EJB 3.0的各个方面,例如实体Bean的创建、会话Bean的使用、事务管理、安全性设置以及JPA的持久化操作等。这些源码对于初学者来说...

    EJB3.0API.rar_ejb_ejb3.0a_ejb3.0api

    1. **注解驱动(Annotation-Based)**:在EJB 3.0中,开发者可以通过注解在类和方法级别声明bean的属性,如实体(Entity)、会话(Session)和消息驱动(Message Driven)bean,以及事务、安全性和持久化等。...

    EJB3.0架包

    EJB3.0是EJB规范的一个重要版本,它在EJB2.x的基础上进行了大量简化,提高了开发效率,并引入了注解驱动的开发方式,使得EJB更易于理解和使用。 在EJB3.0中,主要包含以下关键知识点: 1. **实体Bean(Entity ...

    ejb2.0与ejb3.0的区别

    ### EJB2.0与EJB3.0的主要区别 #### 一、简介 企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将...

    EJB3.0实例教程(PDF)

    8. **异步方法调用**:EJB3.0引入了支持异步方法调用的特性,使得后台处理任务可以非阻塞地执行。 9. **安全性**:EJB3.0提供了内置的角色和权限管理,可以利用Java EE的安全框架来实现细粒度的访问控制。 10. **...

    EJB3.0规范中文版

    3. **消息驱动Bean(EJB Message-Driven)**:EJB 3.0引入了消息驱动Bean,它们用于处理Java Message Service (JMS) 消息。通过`@MessageDriven`注解,开发者可以创建一个监听特定消息队列或主题的Bean。 4. **依赖...

    EJB3.0规范-EJB3.0 SPECIFICATION

    10. **异步处理(Asynchronous Processing)**:EJB3.0允许消息驱动Bean以异步方式处理消息,提高系统响应性和可扩展性。 压缩包中的文件分别涵盖了EJB3.0的核心部分、持久化机制和简化版规范: - `ejb-3_0-fr-...

    EJB3.0源代码

    总的来说,"EJB3.0源代码"的压缩包很可能包含了使用EJB 3.0规范编写的各类Bean的源码,包括实体Bean、无状态会话Bean、有状态会话Bean和消息驱动Bean,以及相关的配置文件。通过分析这些源代码,我们可以深入理解EJB...

    EJB3.0 帮助文档

    消息驱动Bean是EJB 3.0引入的新特性,用于处理JMS(Java Message Service)消息。`@MessageDriven`注解标识这类Bean,它们自动监听消息队列,当有新消息到来时,自动触发Bean的方法。 **7. 容器服务与事务管理** ...

    mdb.rar_EJB3.0_ejb3.0 example

    标题"mdb.rar_EJB3.0_ejb3.0 example"暗示我们这里涉及的是EJB 3.0中Message Driven Bean(MDB)的示例。MDB是一种特殊类型的EJB,专门用于处理JMS(Java Message Service)消息,它是异步处理和解耦应用组件的理想...

    EJB3.0开发文档

    消息驱动Bean是EJB3.0新增的特性,它主要用于处理JMS(Java Message Service)消息。通过监听消息队列,消息驱动Bean可以在后台异步处理任务,提高系统响应速度和可扩展性。 四、依赖注入(Dependency Injection) ...

    EJB3.0实例教程及源代码

    **EJB3.0实例教程及源代码** 本教程专注于企业级JavaBeans(EJB)3.0技术的实践应用,由黎活明提供。EJB是Java平台上的一个核心组件,用于构建可扩展的、可靠的、安全的分布式应用程序。EJB 3.0是EJB规范的一个重要...

    ejb3.0规范PDF

    综上所述,ejb3.0规范PDF包含了大量的信息,从配置简化到实体Bean的JPA集成,再到会话Bean、消息驱动Bean的使用,以及依赖注入、接口驱动编程、事务管理和安全性等多个方面,为Java EE开发者提供了全面的指导。...

    EJB3.0实例教程(源代码).rar )

    - **消息驱动bean(Message-Driven Beans, MDBs)**:主要用于处理消息队列中的JMS(Java Message Service)消息,是异步处理的理想选择。 - **实体bean(Entity Beans)**:代表持久化的数据,通常与数据库中的记录...

Global site tag (gtag.js) - Google Analytics