一:传统RPC中间件的缺点:corba、dcom、RMI
- 同步通讯:客户发出请求后,必须等待服务对象完成处理并返回结果后才能执行。
- 客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务器对象崩溃或者网络故障导致客户的请求不可达,客户会接到异常。
- 点对点通讯:客户的一次调用只发送给服务器某个单独的目标对象。
二:面向消息的中间件Message Oriented Middleware ,MOM介绍
- 较好的解决了传统RPC的不足,发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接受者。这种模式下,发送和接受都是异步的,发送者无需等待,二者的生命周期必须相同。发送消息时接受者不一定运行,接受消息的时候发送者也不一定运行。
- 一对多通讯:对于一个消息可以有多个接受者。
三:JMS简介
- java消息服务(JMS)定义了Java中访问消息中间件的接口。也就是说JMS知识接口,并没有给与实现。实现JMS接口的消息中间件称为JMS Provider,Apatche的ActiveMQ就是属于MOM中间件的一种,JMS接口的实现。
- JMS术语:JMS实现了JMS接口的消息中间件。Provider(Message provider)-生产者;Consumer(Message Comsumer)-消费者;PTP(point to point)-点对点的消息模型;Pub/Sub(Publish/Subscribe)-即发布/订阅的消息模型;Queue-队列目标;Topic-主题目标;ConnectionFactory-连接工厂,JMS用它创建连接;Connection-JMS客户端到JMS Provider的连接点;Destination-消息的目的地;Session-会话,一个发送或接受消息的线程;Message接口-消费者和生产者之间产生的对象。该对象包括三部分组成:1.消息头(必须):识别和为消息寻找漏由的操作设置。2.一组消息属性(可选):包含额外属性,支持其他提供者和用户兼容。可以创建定制的字段和过滤器(消息选择器)。3.一个消息体(可选):允许用户创建5种类型的消息(StreamMessage-java原始值的数据流,MapMessage-名称-值对,TextMessage-一串字符串对象,ObjectMessage-一个序列化的java对象,BytesMessage-一个未解析的字节数据流)
四:activeMQ介绍
向中间件中添加数据:
public class Sender {
public static void main(String[] args) throws Exception {
// 1创建连接工厂
ConnectionFactory connectionFactory = new org.apache.activemq.ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
// 2通过连接工厂创建连接,并开启连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 3创建session回话1.是否启动事物,2.签收模式
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 4创建目标对象在p2p模式中目的地被称为Queue,pb模式下被称为Topic
Destination destination = session.createQueue("queue1");
// 5通过session创建生产者或消费者Messageproducer/MessageConsumer
MessageProducer messageProvider = session.createProducer(destination);
// 6设置持久化存储特性,是否持久化存储或者临时存储
messageProvider.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 非持久化
// 7创建数据对象,messageProvider发送该数据,供消费者使用
for (int i = 0; i < 5; i++) {
TextMessage textMessage = session.createTextMessage();
textMessage.setText("我是消息内容," + i);
// 发送消息
messageProvider.send(textMessage);
}
if (connection != null) {
connection.close();
}
}
获取中间件中存放的数据:
public class Sender {
public static void main(String[] args) throws Exception {
// 1创建连接工厂
ConnectionFactory connectionFactory = new org.apache.activemq.ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
// 2通过连接工厂创建连接,并开启连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 3创建session回话1.是否启动事物,2.签收模式
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 4创建目标对象在p2p模式中目的地被称为Queue,pb模式下被称为Topic
Destination destination = session.createQueue("queue1");
// 5通过session创建生产者或消费者Messageproducer/MessageConsumer
MessageProducer messageProvider = session.createProducer(destination);
// 6设置持久化存储特性,是否持久化存储或者临时存储
messageProvider.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 非持久化
// 7创建数据对象,messageProvider发送该数据,供消费者使用
for (int i = 0; i < 5; i++) {
TextMessage textMessage = session.createTextMessage();
textMessage.setText("我是消息内容," + i);
// 发送消息
messageProvider.send(textMessage);
}
if (connection != null) {
connection.close();
}
}