java jms_Java消息服务JMS详解

@MessageDriven(activationConfig={

@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),

@ActivationConfigProperty(propertyName="destination",propertyValue="queue/jms")

})

@MessageDriven注释指明这是一个消息驱动Bean,并使用@ActivationConfigProperty注释配置消息的各种属性,其 中destinationType属性指定消息的类型,消息有两种类型topics 和queues,下面是这两种消息类型的介绍:

Topics 可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher, Java消息服务接受者叫做subscriber。destinationType属性对应值:javax.jms.Topic

Queue 仅仅允许一个消息传送给一个客户。一个发送者将消息放入消息队列,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能再得到它。destinationType属性对应值: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

.lookup("ConnectionFactory");

conn = qcf.createQueueConnection();

session = conn.createQueueSession(false,

QueueSession.AUTO_ACKNOWLEDGE);

queue = (Queue) ctx.lookup("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.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);注意:可以写在代码中,也可以写在jndi.properties文件中.

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);

例子对应代码:

QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.lookup("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 :客户机通过调用消息的acknowledge方法来接收消息。接收发生在session层。接收到一个被消费的消息时,将自动接收该session已经 消费的所有消息。例如:如果消息的消费者消费了10条消息,然后接收15 个被传递的消息,则前面的10 个消息的收据都会在这15 个消息中被接收。

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

(5) 查找目的地(Topic/ Queue);

例子对应代码:queue =(Queue) ctx.lookup("queue/jms");

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/QueueReceiver).

例子对应代码:

msg = session.createTextMessage("你好,好久不见!");

sender = session.createSender(queue);

sender.send(msg);

备注:如果运行时出现javax.naming.NameNotFoundException: jms not bound , 是因为JBoss不会自已建立一个Queue对象,因此,需要手工来配置Queue对象。可以\server\default\deploy目录中建立一个xxx-service.xml文件,其中xxx可以任意取值,但必须跟“-service”后缀,例如,abc-service.xml。该文件可以放在deploy或其子目录(可以是多层子目录)中。该文件的内容如下:

jboss.mq:service=DestinationManager

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-01-09 03:43

浏览 2359

评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值