JMS基本概念
○ Point-to-Point(P2P) //点对点
○ Publish/Subscribe(Pub/Sub) //发布订阅模型
P2T
涉及到的概念
消息队列(Queue)
- 发送者(Sender)
- 接收者(Receiver)
- 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
- P2P的特点
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
接收者在成功接收消息之后需向队列应答成功
如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。
Pub/Sub模式图涉及到的概念
主题(Topic)
- 发布者(Publisher)
- 订阅者(Subscriber)
客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。 - Pub/Sub的特点
- 每个消息可以有多个消费者
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
- 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
1安装
解压
http://127.0.0.1:8161/admin/
admin admin
Messages Enqueued:表示生产了多少条消息,记做P
Messages Dequeued:表示消费了多少条消息,记做C
Number Of Consumers:表示在该队列上还有多少消费者在等待接受消息
Number Of Pending Messages:表示还有多少条消息没有被消费,实际上是表示消息的积压程度,就是P-C
生产者:
package com.sds.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public static void main(String[] args) throws JMSException {
// TODO Auto-generated method stub
//创建ConnectionFactory连接工厂
ConnectionFactory conntionFactory=new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616");
//创建Connection
Connection connection=conntionFactory.createConnection();
connection.start();
//创建Session
Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建Destination 在ptp模式下是queue,在pub/sub下是topic
Destination destination=session.createQueue("first");
//创建MessageProducer 发送消息的生产者/接受消息的消费者
MessageProducer producer=session.createProducer(destination);
//设置持久化方式 如果非持久化,那么意味着MQ的重启会导致消息的丢失
//如果持久化到kahdb/leveldb/jdbc方式的话,意味着消息持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//定义消息对象,并发送
TextMessage message=session.createTextMessage();
message.setText("hello world.");
producer.send(message);
System.out.println(message.toString());
//释放连接
if(connection != null) {
connection.close();
}
}
}
消费者:
package com.sds.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) throws JMSException {
ConnectionFactory conntionFactory=new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616");
Connection connection=conntionFactory.createConnection();
connection.start();
Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination destination=session.createQueue("first");
MessageConsumer consumer=session.createConsumer(destination);
TextMessage message=(TextMessage)consumer.receive();
String str=message.getText();
System.out.println(str);
}
}