JMS概述,ActiveMQ

    一、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不要求严格按照这是个优先级发送消息,但是必须保证加急消息要先于普通消息到达。

                            默认情况下,消息用不会过期。如果消息在特定周期内失去意义,那么可以设置过期时间,时间单位为毫秒。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值