首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【转载】jms topic与jms queue差别

2012-12-23 
【转载】jms topic与jms queue区别作者longdick? ? http://longdick.iteye.com在JMS中,Topic实现publish和su

【转载】jms topic与jms queue区别

作者longdick? ? http://longdick.iteye.com
在JMS中,Topic实现publish和subscribe语义。一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber将接收到消息的一个拷贝。但是在消息代理接收到消息时,只有激活订阅的subscriber能够获得消息的一个拷贝。

JMS Queue执行load balancer语义。一条消息仅能被一个consumer收到。如果在message发送的时候没有可用的consumer,那么它将被保存一直到能处理该message的consumer可用。如果一个consumer收到一条message后却不响应它,那么这条消息将被转到另一个consumer那儿。一个Queue可以有很多consumer,并且在多个可用的consumer中负载均衡

?

Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表():

?

?

public void testMySend() throws JMSException {Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); Session session = null; Queue queue = null; MessageProducer producer = null; session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); queue=session.createQueue("myTest"); producer= session.createProducer(queue); Message msg=session.createTextMessage("hello"); producer.send(msg); producer.close(); session.close(); connection.close();}public void testMyReceive() throws JMSException{Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection();Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Queue queue = session.createQueue("myTest");MessageConsumer consumer= session.createConsumer(queue);consumer.setMessageListener(new MyListener());connection.start();consumer.close();session.close(); connection.close();}

?

消费端需要设定一个MessageListener:

?

?

以下是符合Jms1.1规范的使用Topic 发送消息的代码:

?

public void testMyTopicPublisher() throws JMSException { Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); Session session = null; Topic topic = null; MessageProducer producer = null; session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); topic=session.createTopic("myTopicTest"); producer= session.createProducer(topic); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); Message msg=session.createTextMessage("hello and whatever u say"); producer.send(msg); producer.close(); session.close(); connection.close();}?

以下是符合Jms1.1规范的使用Topic 接收消息的代码:

?

public static void testMyTopicConsumer() throws JMSException, InterruptedException{Connection connection = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616").createConnection(); Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); Topic topic = session.createTopic("myTopicTest"); MessageConsumer consumer= session.createConsumer(topic); consumer.setMessageListener(new MyListener()); connection.start();}


jms在创建Session时可以有两个参数,第一个参数是是否使用事务,第二个参数是消费者向发送者确认消息已经接收的方式:

?

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

?

确认消息的方式有如下三种:

AUTO_ACKNOWLEDGE(自动通知)

CLIENT_ACKNOWLEDGE(客户端自行决定通知时机)

DUPS_OK_ACKNOWLEDGE(延时//批量通知)

?

如果使用的是 客户端自行决定通知时机 方式,那么需要在MessageListener里显式调用message.acknowledge()来通知服务器。服务器接收到通知后采取相应的操作。

热点排行