一、JMS概述
1、当前,COREBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性: 1)、同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;
2)、客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;
3)、点对点通信:客户的一次调用只发送给某个单独的目标对象。
2、 面向消息的中间件(Message Oriented Middleware,MOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收者。
3、 JAVA消息服务(JMS)定义了Java中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMS Provider,已有的MOM系统包括Apache的ActiveMQ、以及阿里巴巴的RockeMQ、IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ、RabbitMQ等等,他们基本都遵循JMS规范。
4、 JMS实现JMS接口的消息中间件
Provider(MessageProvider):生产者
Consumer(MessageConsumer):消费者
PTP:Point to Point,即点对点的消息模型;
Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型;
Queue:队列目标;
Topic:主题目标;
ConnectionFactory:连接工厂,JMS用它创建连接;
Connection:JMS客户端到JMS Provider的连接;
Destination:消息的目的地;
Session:会话,一个发送或者接收消息的线程;
二、ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。
1、 ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间件仍然扮演着特殊的地位,可以说ActiveMQ在业界应用最广泛,当然如果想要有更强大的性能和海量数据处理能力,ActiveMQ还需要不断的升级版本,80%以上的业务我们使用ActiveMQ都足够满足需求,当然后续如天猫、淘宝网这种大型的电商网站,尤其是双11这种特殊时间,ActiveMQ需要进行复杂的优化源码以及架构设计才能完成,我们之后学习一个更强大的分布式消息中间,RocketMQ,可以说ActiveMQ是核心,是基础。
2、下载地址:http://activemq.apache.org/
3、ActiveMQ演示:
4、ActiveMQ的安全机制
1)、 activemq的web管理界面:http://127.0.0.1:8161/adimn
activemq管理台使用jetty部署,所以需要修改密码则需要到相应的配置文件;
C:\的vsoftware\apache-activemq-5.11.1\conf\jetty-realm.properties
activemq应该设置安全机制,只有符合认证的用户才能进行发送和获取消息,所以我们也可以在activemq.xml里去添加安全验证配置!
C:\devsoftware\apache-activemq-5.11.1\conf\activemq.xml,在第123行之后添加配置(添加一个插件配置即可)
2)、Connection方法使用
在成功创建正确的ConnectionFactory后,下一步将是创建一个连接,它是JMS定义的一个接口。ConnectionFactory复杂返回可以与底层消息传递系统进行通信的Connection实现。通常客户端只是用单一连接。根据JMS文档,Connection的目的是”利用JMS提供者封装开放的连接“,以及表示“客户端与提供者服务例程之间的开发TCP/IP套接字”。该文档还指出Connection应该是进行客户端身份验证的地方等等。
当一个Connection被创建时,它的传输默认时关闭的,必须使用start方法开启。一个
Connection可以建议一个或者多个Session。
当一个程序执行完成后,必须关闭之前创建的Connection,否则ActiveMQ不能释放资源,关闭一个Connection同样也关闭了Session,MessageProducer和MessageConsumer。
Connection createConnection();
Connection createConnection(String userName,String password,String url);
3)、Session方法使用
一旦从ConnectionFactory中获得一个Connection,必须从Connection中创建一个或者多个Session。Session时一个发送或者接收消息的线程,可以使用Session创建MessageProducer,MessageConsumer和Message。
Session可以被事务化,也可以不被事务化,通常,可以通过向Connection上的适当创建方法传递一个布尔参数对此进行设置。
Session createSession(boolean transacted,int acknowledgeMode);
其中Transacted为使用事务标识,acknowledgeMode为签收模式。
结束事务有两种方法:提交或者回滚。当一个事务提交,消息被处理。如果事务中有一个步骤失败,事务就回滚,这个事务中的已经执行的动作将被撤销。在发送消息最后也必须要使用session.commit()方法表示提交事务。
签收模式有三种形式:
A)、Session.AUTO_ACKNOWLEDGE当客户端从receive或onMesssage成功返回时,Session自动签收客户端的这条消息的收条。
B)、Session.CLIENT_ACKNOWLEDGE客户端通过调用消息(Message)的acknowledge方法签收消息。在这种情况下,签收发生在Session层面:签收一个已消费的消息会自动地签收这个Session所有已消费消息的收条。
C)、Session.DUPS_OK_ACKNOWLEDGE此选项指示Session不必确保对传送消息的签收。它可能引起消息的重复,但是降低了Session的开销,所以只有客户端能容忍重复的消息,才可使用。
4)、MessageProducer
MessageProducer:MessageProducer是一个由Session创建的对象,用来向Destination发送消息。
void send(Destination destination,Message message);
void send(Destination destination,Message message,int deliveryMode,int priority,long timeToLive);
void send(Message message);
void send(Message message,int deliverMode,int priority,long timeToLiver);
其中deliveryMode为传送模式,priority为消息优先级,timeToLive为消息过期时间。
ActiveMQ支持两种消息传送模式:PERSISTENT和NON_PERSISTENT两种。如果不指定传送模式,那么默认是持久性消息。如果容忍消息消失,那么使用非持久性消息可以改善性能和减少存储的开销。
消息优先级从0-9十个级别,0-4是普通消息,5-9是加急消息。如果不指定优先级,则默认为4.JMS不要求严格按照这是个优先级发送消息,但是必须保证加急消息要先于普通消息到达。
默认情况下,消息用不会过期。如果消息在特定周期内失去意义,那么可以设置过期时间,时间单位为毫秒。