jms详解~

Java消息服务JMS详解时间:2009-11-24 21:33来源: 作者: 点击:49次 本文向您介绍Java中的消息服务JMS,Java消息服务提供了点对点模式和发布-订阅模式,文中将详细介绍这两种服务。 本文向您介绍Java中的消息服务JMS,Java消息服务帮助了点对点模式和发布-订阅模式,文中将详细介绍这两种服务。 Java消息服务(JMS Java Message Services)帮助了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics). Queue仅允许一个的消息传送给一个的客户(一对一): Java消息服务JMS的接收者和发送者之间不存在时间上的依赖联系。不论发送者发送消息时接收者也许在运行,接收者都没成绩提取消息。接收者对于胜利处理的消息给出回执。 Topics没成绩有多个客户端(一对多,多对多): 向某个话题订阅的客户程序只能收到那些在它订阅之后发布的消息。为了接收到消息,订阅者必需保持聚会状态。因此,发布者和订阅者之间存在时间上的依赖联系。 点对点消息模式经过一个的消息队列(Queue)出现,消息的生产者向队列写入消息,消息的订阅者从队列提取消息。发布-订阅消息模式经过一个的话题(Topic)节点构成的层次框架出现,消息的生产者向那个层次框架发布消息,消息的订阅者向那个框架订阅消息。 消息驱动的Bean只有一个的Bean类。从某些方面看,JMS消息驱动的Bean类似于无状态对话Bean:消息驱动的Bean不为特定的客户保留数据或对话状态。 @MessageDriven(activationConfig={ @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination",propertyValue="queue/jms") }) @MessageDriven注释指明这是一个的消息驱动Bean,并应用@ActivationConfigProperty注释配置消息的各种属性,其 中destinationType属性指定消息的类别,消息有两种类别topics 和queues,下面是这两种消息类别的介绍: Topics 没成绩有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisIT, Java消息服务接受者叫做subscriber。destinationType属性对应value:javax.jms.Topic Queue 仅仅允许一个的消息传送给一个的客户。一个的发送者将消息放入消息队列,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个的接受者抽取并得到消息后,更多相关人就不能再得到它。destinationType属性对应value:javax.jms.Queue destination属性用作指定消息路径,消息驱动Bean在发布时,假如路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除 当一个的消息到达queue/jms队列时,就会触发onMessage窍门,消息作为一个的参数传入. package com.julycn.jms; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/jms") }) public class MessageQueue implements MessageListener { public MessageQueue() { } public void onMessage(Message message) { TextMessage tmsg = (TextMessage) message; try { System.out.println(tmsg.getText()); } catch (JMSException e) { e.printStackTrace(); } } } package com.julycn.client; import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.naming.InitialContext; import javax.naming.NamingException; public class MessageQueueClient { public static void main(String[] args) { QueueConnection conn; QueueSession session; Queue queue; QueueSender sender; TextMessage msg; try { InitialContext ctx = new InitialContext(); QueueConnectionFactory qcf = (QueueConnectionFactory) ctx .seeup("ConnectionFactory"); conn = qcf.createQueueConnection(); session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.seeup("queue/jms"); msg = session.createTextMessage("你好,好久不见!"); sender = session.createSender(queue); sender.send(msg); sender.close(); } catch (NamingException e) { e.printStackTrace(); } catch (JMSException e) { e.printStackTrace(); } } } (1) 得到一个的JNDI初始化上下文(Context); 例子对应源代码: Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.inte编程ces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "www.verybc.com:1099"); props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); InitialContext ctx = new InitialContext(props); 留意:没成绩写在源代码中,也没成绩写在jndi.properties文档中. (2) 根据上下文来查找一个的连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来应用相应的类别); 例子对应源代码: QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.seeup("ConnectionFactory"); (3) 从连接工厂得到一个的连接(Connect 有两种[TopicConnection/ QueueConnection]); 例子对应源代码:conn = qcf.createQueueConnection(); (4) 经过连接来建立一个的对话(Session); 例子对应源代码:session= conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 这句源代码意思是:建立不需求事务的并且能自动接收Java消息服务收条的对话,在非事务Session 中,JMS消息传递的方法有三种: Session.AUTO_ACKNOWLEDGE :当客户机调用的receive窍门胜利返回,或当MessageListenser 胜利处理了消息,session将会自动接收消息的收条。 Session.CLIENT_ACKNOWLEDGE :客户机经过调用消息的acknowingledge窍门来接收消息。接收除了在session层。接收到一个的被消费的消息时,将自动接收该session已经 消费的所有消息。例如:假如消息的消费者消费了10条消息,然后接收15 个被传递的消息,则前面的10 个消息的收据都会在这15 个消息中被接收。 Session.DUPS_ACKNOWLEDGE :指示session缓慢接收消息。 (5) 查找目的地(Topic/ Queue); 例子对应源代码:queue =(Queue) ctx.seeup("queue/jms"); (6) 根据对话以及目的地来建立消息制造者(TopicPublisIT/QueueSender)和消费者(TopicSubscriber/QueueReceiver). 例子对应源代码: msg = session.createTextMessage("你好,好久不见!"); sender = session.createSender(queue); sender.send(msg); 备注:假如运行时出现javax.naming.NameNotFoundException: jms bound , 是由于JBoss不会自已建立一个的Queue对象,因此,需求手工来配置Queue对象。没成绩 /server/default/deploy列表中建立一个的编程-service.xml文档,其中编程没成绩任意取value,但必需跟“-service”后缀,例如,abc-service.xml。该文档没成绩放在deploy或其子列表(没成绩是多层子列表)中。该文档的内容如下: jboss.mq:service=DestinationManager 元素的title属性value中的title必需是jms,要与queue/jms中的/后面的部份一致. 【非常编程推荐】

你可能感兴趣的:(java,bean,session,properties,jms,import)