zoukankan      html  css  js  c++  java
  • ActiveMQ记录

    一.   ActiveMQ是什么? 
     
    ActiveMQ is the most popular and powerful open source Message Bus.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台
    已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
     
    下面是它的特性列表
     
    多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
    完全支持JMS1.1和J2EE 1.4规范  (持久化,XA消息,事务)
    对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
    通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
    支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
    支持通过JDBC和journal提供高速的消息持久化
    从设计上保证了高性能的集群,客户端-服务器,点对点
    支持Ajax
    支持与Axis的整合
    可以很容易得调用内嵌JMS provider,进行测试
    二.   ActiveMQ的竞争者   
     
    1,其他开源 JMS provider(资料来自 java-source.net) :
            jbossmq(jboss 4)
            jboss messaging (jboss 5)
            joram-4.3.21  2006-09-22
            openjms-0.7.7-alpha-3.zip December 26, 2005
            mantamq
     
      ubermq  
            SomnifugiJMS  2005-7-27
     
    开源的JMS Provider大部分都已经停止发展了,剩下的几个都是找到了东家,和某种J2EE 服务器挂钩,比如jboss mq 与jboss,joram与jonas(objectweb组织),ActiveMQ 与Geronimo(ASF APACHE基金组织),而在这3个之间,从网络底层来看,只有ActiveMQ使用了NIO,单从这个角度来看ActiveMQ在性能上会有一定的优势。     
     
    2.商业JMS provider
            IBM WebSphere MQ
            BEA WebLogic JMS
            Oracle AQ 
            NonStop Server for Java Message Service(JMS)
            Sun Java System Message Queue
            Sonic jms
            TIBCO Enterprise For JMS
            iLinkMQ (国内)
     
     现在的商业J2EE 应用服务器大部分都会有JMS Provider的实现,毕竟应用服务器都已经花费不薄,也不在乎在里面送一个JMS Provider了,当然还是有独立的比如IBM WebSphere MQ,Sonic JMS ,前者肯定是商用MQ(这个概念不仅仅是JMS Provier了,只能说JMS 只是它提供的一个应用)中间的巨无霸了。
     
     从这点来看,ActiveMQ明显的竞争者并不多,因为它是作为独立的开源JMS Provider出现的,很容易被用于多种结构设计中,使用ActiveMQ作为默认JMS Provider的开源项目有ServiceMix,Geronimo. 
     
    三.安装ActiveMQ
     
           首先去http://activemq.apache.org/download.html 下载最新版本4.1.0release, 解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz)目录如下:
           
           +bin       (windows下面的bat和unix/linux下面的sh)
           +conf      (activeMQ配置目录,包含最基本的activeMQ配置文件)
           +data      (默认是空的)
           +docs      (index,replease版本里面没有文档,-.-b不知道为啥不带)
           +example   (几个例子
           +lib       (activemMQ使用到的lib)
           -apache-activemq-4.1-incubator.jar  (ActiveMQ的binary)
           -LICENSE.txt       
           -NOTICE.txt        
           -README.txt
           -user-guide.html
     

           你可以使用bin\activemq.bat(activemq) 启动 

    启动完成以后,可以访问

    http://localhost:8161/admin/ 

    http://localhost:8161/demo/ 

     

     1. 这个仅仅是最基础的ActiveMQ的配置,很多地方都没有配置因此不要直接使用这个配置用于生产系统

     
    2. 有的时候由于端口被占用,导致ActiveMQ错误,ActiveMQ可能需要以下端口1099(JMX),61616(默认的TransportConnector)
     
    3. 如果没有物理网卡,或者MS的LoopBackAdpater Multicast会报一个错误
     
    四.   测试你的ActiveMQ
     
    由于ActiveMQ是一个独立的jms provider,所以我们不需要其他任何第三方服务器就可以马上做我们的测试了.编译example目录下面的程序ProducerTool/ConsumerTool 是JMS参考里面提到的典型应用,Producer产生消息,Consumer消费消息,而且这个例子还可以加入参数帮助你测试刚才启动的本地ActiveMQ或者是远程的ActiveMQ
     
    ProducerTool [url] broker的地址,默认的是tcp://localhost:61616 
        [true|flase] 是否使用topic,默认是false
        [subject] subject的名字,默认是TOOL.DEFAULT
        [durabl] 是否持久化消息,默认是false
        [messagecount] 发送消息数量,默认是10
        [messagesize] 消息长度,默认是255
        [clientID] durable为true的时候,需要配置clientID
        [timeToLive] 消息存活时间 
        [sleepTime] 发送消息中间的休眠时间
        [transacte]  是否采用事务
     
    ConsumerTool [url] broker的地址,默认的是tcp://localhost:61616
        [true|flase] 是否使用topic,默认是false
        [subject] subject的名字,默认是TOOL.DEFAULT
        [durabl] 是否持久化消息,默认是false
        [maxiumMessages] 接受最大消息数量,0表示不限制
        [clientID] durable为true的时候,需要配置clientID
        [transacte]  是否采用事务
        [sleepTime]  接受消息中间的休眠时间,默认是0,onMeesage方法不休眠
        [receiveTimeOut] 接受超时

    三、消息传递的两种模型

    • 3.1、PTP模型

            PTP模型是基于队列的,生产者发送消息到队列,消费者从队列接收消息,队列的存在使消息的异步传输成为可能。JMS提供工具管理队列的创建,删除。PTP模型定义了客户端如何向队列发送消息,从队列接受消息,浏览队列中的消息。

    • 3.2、 JMS PUB/SUB模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题。主题可以被认为是消息的传输中介,发布者发布消息到主题,订阅者从主题订阅消息。主题使得消息订阅者和消息发布者保持相互独立,不需要接触即可保证消息的传送。

    四、开发JMS应用步骤

    • 获取ConnectionFactory对象;
    • ConnectionFactory对象创建Connection对象;
    • Connection对象创建一个或者多个JMS Session;
    • 获取目标队列或者主题对象,即Destination对象;
    • SessionDestination创建MessageProducerMessageConsumer;
    • 通知Connection开始传送消息;
    • 4.1、 ConnectionFactory

         要初始化JMS,需要用到链接工厂。客户端通过创建连接工厂简历到ActiveMQ的连接,一个连接工厂封装了一组连接配置参数,这组参数在配置ActiveMQ时已经定义,例如brokerURL参数,此参数传入的是ActiveMQ服务的地址和端口,支持openwire协议的默认连接为tcp://ip:61616,支持stomp协议的默认连接为tcp://ip:61613。支持并发操作。

         如:ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");

    • 4.2、 Connection

         ConnectionJMS定义的一个接口。ConnectionFactory负责返回可以与底层消息传输系统信息通讯的Connection的实现。通常客户端只使用单一的连接。Connection还应该是客户端身份验证的地方。当一个Connection被创建时,传输默认是关闭的,要使用start方法开启,一个connection可以建立一个或者多个session。程序执行完成后,必须关闭之前创建的Connection

             如:Connection conn = cf.createConnection();

    • 4.3、 Session

         可以从Connection创建一个或者多个SessionSession是一个发送或者接收消息的线程。可以使用Session创建MessageProducerMessageConsumerMessageSession可以被事务华,也可以不被事务化,可以通过适当的创建方法对此进行设置。

            如:Session session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE);

          第一个参数为使用事务的标识,第二个 是签收模式

    • 4.4、Destination

         Destination是客户端用来指定生产消息目标和消费 消息来源的对象。在PTP模式中,DestinationQueue即队列;在PUB/SUB模式中,DestinationTopic即主题。程序中可以使用多个QueueTopic

             如:Destination destination = new ActiveMQQueue("testQueue");

    • 4.5、MessageProducer

         MessageProducer是由Session创建的对象,用来向Destination发送消息。

             如:MessageProducer producer = session.createProducer(destination);

             发送消息:

             producer.send(message);

    • 4.6、 MessageConsumer

          MessageConsumer是由Session创建的对象,用来从Destination接受消息。

             如:MessageConsumer consumer = session.createConsumer(destination);

         接收消息:

        consumer.receive(); 

    安全配置

    1、控制台安全配置,打开conf/jetty.xml文件,找到

        <bean id="securityConstraint" class="org.eclipse.jetty.http.security.Constraint">

            <property name="name" value="BASIC" />

            <property name="roles" value="admin" />

            <property name="authenticate" value="false" />

        </bean>

       将“false”改为“true”即可。用户名和密码存放在conf/jetty-realm.properties文件中。

    2、生产者和消费者连接MQ需要密码

       打开conf/activemq.xml文件,在<broker>标签里的<systemUsage>标签前加入:

       <plugins>  

    <simpleAuthenticationPlugin>  

    <users>  

    <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>  

    </users>  

    </simpleAuthenticationPlugin>  

       </plugins>

     注意必须在<systemUsage>标签前,否则启动ActiveMQ会报错。

     

    用户名和密码存放在conf/credentials.properties文件中 

    activemq控制台英文注释

     

     Number Of Consumers  消费者 

    Number Of Pending Messages 等待消费的消息 
    Messages Enqueued 进入队列的消息 
    Messages Dequeued 出了队列的消息 
    Operations  操作 
    Purge 净化

    当有一个消息进入这个队列时,等待消费的消息是1,进入队列的消息是1。当消息消费后,等待消费的消息是0,进入队列的消息是1,出队列的消息是1.在来一条消息时,等待消费的消息是1,进入队列的消息就是2.以此类推,进入队列的消息和出队列的消息是池子,等待消费的消息是水流。

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
    记一次odoo创建新的模块时,但是在odoo web界面找不到应用的案例
    python实现格式化输出9*9乘法表
    format和urlencode的使用对比
    python字典小知识
    01
    深浅拷贝再回顾
    DRF的路由生成类的使用
  • 原文地址:https://www.cnblogs.com/xchit/p/ActiveMQ.html
Copyright © 2011-2022 走看看