activeMQ

ActiveMQ

Activemq/ zeromq /rocketmq/kafka/RabbitMq/JMS

    
 
  

B

 

 

 

 

 

 

 

 

 

 

JMS 规范  

ActiveMQ 特点

1.       完全支持JMS规范

2.       支持多种传输协议/方式: VM/ TCP /SSL / NIO /UDP/JXTA/JGROUPS

3.       非常容易与我们的业务系统集成

4.       支持多种语言编写的客户端

5.       消息做持久化-jdbc 。 kahadb

 

安装ActiveMq和启动

1.       下载activemq:http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.3/apache-activemq-5.14.3-bin.tar.gz&action=download

2.       通过tar –zxvf 解压我们的activemq.tar.gz

3.       进入到bin目录下执行./activemq start/stop

4.       启动成功后,有两个端口号 , 1. 控制台:8161.  2. 默认连接端口61616

 

第一个实例

发送端

public static void main(String[] args) {
    ConnectionFactory connectionFactory; //连接工厂
   
Connection connection=null; //客户端到JMS provider的连接
   
Session session; //一个发送或者接收消息的会话
   
Destination destination; //消息的目的
   
MessageProducer producer; //消息发送者
   
try{
        connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616");
        connection=connectionFactory.createConnection();
        session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

        connection.start();

        destination=session.createQueue("first_queue");
        producer=session.createProducer(destination);

        TextMessage message=session.createTextMessage("我的第一次消息发送");

        producer.send(message);

        session.commit();
        session.close();
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        try {
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

 

 

接收端
 

public static void main(String[] args) {

    ConnectionFactory connectionFactory; //连接工厂

    Connection connection=null; //客户端到JMS provider的连接

    Session session; //一个发送或者接收消息的会话

    Destination destination; //消息的目的

    MessageConsumer consumer; //消息发送者

    try{

        connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616");

        connection=connectionFactory.createConnection();

        session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

  

        destination=session.createQueue("first_queue");

        consumer=session.createConsumer(destination);

  

        connection.start();

  

        while (true) {

            TextMessage message = (TextMessage) consumer.receive();

            if(message!=null) {

                System.out.println(message.getText());

                session.commit();

            }else{

                break;

            }

        }

  

        session.close();

  

    }catch (Exception e){

        e.printStackTrace();

    }finally {

        try {

            connection.close();

        } catch (JMSException e) {

            e.printStackTrace();

        }

    }

}

消息可以发送String,Map,对象等。

 

JMS规范

JMS是什么

Jms的消息服务或规范(java message service)

 

JMS 的规范

Java中提供访问消息中间件的接口,并没有给出实现 , 通过ActiveMq

 

JMS provider

实现了jms接口和规范的消息中间件

 

JMS消息的组成:

消息头

JMSDestinanion: 比如是QUEUE或者是TOPIC

     destination = session.createQueue("first_queue");   //点对点

     producer = session.createProducer(destination);

     

JMSDeliveryMode: 持久模式和非持久模式

JMSExpiration:  消息过期时间

      message.setJMSExpiration(0);  //0消息永不过期

JMSPriorty  : 消息优先级别(0-9) 默认是4;  注意:JMS只保证加急消息(5~9)比普通消息(0~4)更早到达,

JMSMessageID ;

JMSTimestamp:

JMSReplyTo:

 

消息属性

通过Message.setStringProperty()来设置

    message.setStringProperty("key","hello world");     //消息属性

 

消息体

 

JMS consumer

 

JMS domains【消息域】

PTP  (point – to –point )   目的地被成为QUEUE(默认是持久化)

 特点

1.       如果在session关闭时, 有一些消息发送到队列,消费者从队列接收消息,接收消息后会将其从队列中消除,如果没被签收,那么下次连接时还能再次接收

      destination = session.createQueue("first_queue");

 

pub/sub  目的地被成为 (topic) (默认是非持久化)

……..

 

 

topic特性:

           如果发送端发送的时候,消费端没有启动(如果消费端已经启动可接受),那么消费端就不能接受到这个消息。(消息丢失)

          destination = session.createTopic("first_topic");

 

JMS的可靠性机制

消息的接收确认

JMS消息只有被确认过以后,才会认为消息被成功消费: 客户端接收消息、客户端处理消息、消息确认

消息事务性

消息确认方式

1.      AUTO_ACKNOWLEDGE ;  需要客户端session.commit()来确认会话签收

收:

2.      CLIENT_ACKNOWLEDGE; 通过客户端调用message.acknowledge()方法来签收消息

接收端要为false(如果为true,能接受消息,但是没有消费),发送端依旧是true.

 

3.      DUPS_ACKNOWLEDGE ; 会话延迟确认提交。JMSprovider会在消息头的JMSRedelivered字段设置为true,表示该消息为重复消息

 

消息的持久性

持久化消息(可靠性)

 保证消息只被传送一次和成功使用一次。

非持久化消息(可能会丢失消息,性能更好)

 保证消息最多被传送一次

 

持久化订阅(topic,消息不再丢失)

                     消息会一直存在

                     发送端:

                      producer.setDeliveryMode(DeliveryMode.PERSISTENT);      //持久化模型

                     接收端:

注释成员变量中的destination,consumer

下面代码:第三行不能放在第四行后面,报错:clientID on a used Connection is not allowed.

     

                    clientID 唯一就可以,让发送端知道你是持久订阅客户端【类似zookeeper中的节点】

                                                     topic1是随便写的

 

消息回滚:

       session.rollback()  发送端本地事物

 

 

Spring+activeMq

(processon绘制)           D:优惠券等

     如果这些业务都放在A就会很大,很复杂。解耦等

     多线程也可以去做,但是具有一定的局限性和复杂性,也不能持久化存储等。

 

Spring+activeMQ

sender

1.     

2.     

 

3.     

在此过程中出现的报错总结

①                 :local class incompatible: stream classdesc serialVersionUID = -5514063437663796977, loca

Intellij IDEA 自动生成SerialVersionUID

Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’ 

选上以后,在你的class中:Alt+Enter(放在类名)就会提示自动创建serialVersionUID了。

两个实体中的UID必须是一样的?

 

企业中更多的是用上面的监听➕spring的注解监听消息。封装了consumer.setMessageListener(new MessageListener(){}))

ActiveMQ支持的传输协议

ActiveMQ支持 client-broker通讯协议

 

TCP传输(默认)

1.      高可靠性、而且稳定性强

2.      传输效率高

3.      应用比较广泛

 

Nio:

1.      如果有大量的client去连接到broker上的时候,一般情下,会出现线程数限制的问题

2.      Nio比TCP性能更好

 

NIO、

UDP: udp://ip:port     (不稳定传输,消息丢失)

HTTP :

VM、SSL

Nio方式传输

1.      修改${activemq_home}/conf/activemq.xml

2.     

 

3.      修改连接串:

4.      log日志/data/activemq.log

 

ActiveMQ消息持久化

支持的持久存储方式有哪些

1.      AMQ 基于文件的存储方式(硬盘中), 5.0之前的默认方式

2.      Kahadb 这是5.0后的默认方式 (实务日志+索引)

1.      Director  目录

2.      IndexWriteBatchSize:  批量写入磁盘大小设置

3.      cleanupInterval :  持续多久消息没用就清除

4.      indexcachesize  缓存中索引数量

3.      JDBC 消息存储 【消息消费了,数据库中就没有了】

消息表(ACTIVEMQ_MSGS) 所有的queue和topic都存在里面

消息响应(ACTIVEMQ_ACK)   持久订阅的信息和最后一个持久订阅接收的消息id信息

锁定表(ACTIVEMQ_LOCK)    默认集群,master,slave判断主表,如果单表,useDatabaseLock=”false”

 

配置过程中要注意的几个点:[没有搞出来!!!]

1.     

2.     

3.      引入jar包到lib目录下,包括:commons-pools.jar  commons-dbcp.jar  . mysql的驱动包

 

4.      JDBC Message store with activemq journal   jdbc+缓存 效率更高

 

报这个错,很有可能标签少写了/,坑大了!!

 

ActiveMQ第三次课

1.持久化存储

2.集群配置

3.高级特性

4.总结

 

1. kahadb

2. Jdbc持久化操作

3. Jdbc Message store with ActiveMQ journal   【有缓存,效率更高】

会先缓存到内存中,如果宕机数据不会丢失,在文件中有记录,可以恢复。文件操作(kafka)快于数据库.    4  2048这两个参数先不要配置,有点问题。(应该根据文件大小刷入数据库)

4. Memory 基于内存方式来持久化消息  (快,宕机消息丢失)

 

1.                  Journal 性能优于jdbc

2.                  Jdbc一般用于master/slave模式 ,

3.                  一般使用journal

 

consumer

activeMQ的集群配置

queue consumer cluster (谁获得谁消费,其他人靠边站)

 
 

 

 

 

 

 

 

Broker Cluster

静态网络连接

TransportConnector (tcp /udp)

NetworkConnector (多个broker通信)

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.  

static:(tcp://192.168.11.132:61616,tcp://….)

initialReconnectDelay ;

maxReconnectDelay .

 

2.   如果要做双向链接,那么需要在指定的双方服务器上都需要配置networkConnector [只是做到了负载而没有集群]

这种方式可以认为,发送给130,132先去130消费,然后消费者再去132消费。如此可以理解demo中的问题。如果132宕机,重启依旧可以在132中消费剩下的消息,但在130中已经没有消息,不能消费。【相对而言就出现了消息卡住】

 

管道订阅的方式(conduit subscription)

 

 

消息回流 【如果要双向回流,双方服务器都需要配置】

默认是true,broker之间均分消息,false是不均分(最好两台都配)

 

容错链接(failover protocol)

通过failover协议实现自动重连的逻辑。提供了两种方式: randomize=true/false

true,随机负载;false,主从备份,主宕机后才会连从。

 

1.   initialReconnectDelay ;  (&in 添加在false后)

2.   maxReconnectDelay

3.   useExponentialBackOff:  重连间隔时间是否已指数形式增长(衰减重试)

 

动态网络连接 (广播机制,时时发现去连接,但可能会丢包)

<networkConnectors>

   <networkConnect uri=”multicast://default”/>

</networkConnectors>

 

Master slave

1.                  Shared file system master slave

主要通过共享存储目录实现master和slave的热备。所有ActiveMQ应用都在不断获取共享目co录

的控制权,谁抢到了控制权,它就是master

 
 

 

 

 

 

 

 

 

 

 

 

2.                  JDBC Master  (主从,高可用)

 

3.                  Replicated levelDB store (类似zookeeper原理 )

 

Destinantion 高级特性

组合队列 : (一个消息可以发给多个队列 )

      

      

<destinationInterceptors>

  <virtualDestinationInterceptor>

    

  </ virtualDestinationInterceptor>

</destinationInterceptors>

 

 

Message Dispatch 高级特性

Message Cursors (消息游标)

 

 
 

 

 

 

 

 

 

 

 

 

 

  

Store-based (对非持久化消息处理)

VM   (虚拟化内存)

File-based  (磁盘临时文件)

 

1.                  异步调用   (有实务一定要同步)

2.                  一对多通信 (topic方式订阅)

3.                  多个系统的集成

4.                  提高系统的可用性和伸缩性

 

 

ActiveMQ

Activemq/ zeromq /rocketmq/kafka/RabbitMq/JMS

    
 
  

B

 

 

 

 

 

 

 

 

 

 

JMS 规范  

ActiveMQ 特点

1.       完全支持JMS规范

2.       支持多种传输协议/方式: VM/ TCP /SSL / NIO /UDP/JXTA/JGROUPS

3.       非常容易与我们的业务系统集成

4.       支持多种语言编写的客户端

5.       消息做持久化-jdbc 。 kahadb

 

安装ActiveMq和启动

1.       下载activemq:http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.3/apache-activemq-5.14.3-bin.tar.gz&action=download

2.       通过tar –zxvf 解压我们的activemq.tar.gz

3.       进入到bin目录下执行./activemq start/stop

4.       启动成功后,有两个端口号 , 1. 控制台:8161.  2. 默认连接端口61616

 

第一个实例

发送端

public static void main(String[] args) {
    ConnectionFactory connectionFactory; //连接工厂
   
Connection connection=null; //客户端到JMS provider的连接
   
Session session; //一个发送或者接收消息的会话
   
Destination destination; //消息的目的
   
MessageProducer producer; //消息发送者
   
try{
        connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616");
        connection=connectionFactory.createConnection();
        session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

        connection.start();

        destination=session.createQueue("first_queue");
        producer=session.createProducer(destination);

        TextMessage message=session.createTextMessage("我的第一次消息发送");

        producer.send(message);

        session.commit();
        session.close();
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        try {
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

 

 

接收端
 

public static void main(String[] args) {

    ConnectionFactory connectionFactory; //连接工厂

    Connection connection=null; //客户端到JMS provider的连接

    Session session; //一个发送或者接收消息的会话

    Destination destination; //消息的目的

    MessageConsumer consumer; //消息发送者

    try{

        connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616");

        connection=connectionFactory.createConnection();

        session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);

  

        destination=session.createQueue("first_queue");

        consumer=session.createConsumer(destination);

  

        connection.start();

  

        while (true) {

            TextMessage message = (TextMessage) consumer.receive();

            if(message!=null) {

                System.out.println(message.getText());

                session.commit();

            }else{

                break;

            }

        }

  

        session.close();

  

    }catch (Exception e){

        e.printStackTrace();

    }finally {

        try {

            connection.close();

        } catch (JMSException e) {

            e.printStackTrace();

        }

    }

}

消息可以发送String,Map,对象等。

 

JMS规范

JMS是什么

Jms的消息服务或规范(java message service)

 

JMS 的规范

Java中提供访问消息中间件的接口,并没有给出实现 , 通过ActiveMq

 

JMS provider

实现了jms接口和规范的消息中间件

 

JMS消息的组成:

消息头

JMSDestinanion: 比如是QUEUE或者是TOPIC

     destination = session.createQueue("first_queue");   //点对点

     producer = session.createProducer(destination);

     

JMSDeliveryMode: 持久模式和非持久模式

JMSExpiration:  消息过期时间

      message.setJMSExpiration(0);  //0消息永不过期

JMSPriorty  : 消息优先级别(0-9) 默认是4;  注意:JMS只保证加急消息(5~9)比普通消息(0~4)更早到达,

JMSMessageID ;

JMSTimestamp:

JMSReplyTo:

 

消息属性

通过Message.setStringProperty()来设置

    message.setStringProperty("key","hello world");     //消息属性

 

消息体

 

JMS consumer

 

JMS domains【消息域】

PTP  (point – to –point )   目的地被成为QUEUE(默认是持久化)

 特点

1.       如果在session关闭时, 有一些消息发送到队列,消费者从队列接收消息,接收消息后会将其从队列中消除,如果没被签收,那么下次连接时还能再次接收

      destination = session.createQueue("first_queue");

 

pub/sub  目的地被成为 (topic) (默认是非持久化)

……..

 

 

topic特性:

           如果发送端发送的时候,消费端没有启动(如果消费端已经启动可接受),那么消费端就不能接受到这个消息。(消息丢失)

          destination = session.createTopic("first_topic");

 

JMS的可靠性机制

消息的接收确认

JMS消息只有被确认过以后,才会认为消息被成功消费: 客户端接收消息、客户端处理消息、消息确认

消息事务性

消息确认方式

1.      AUTO_ACKNOWLEDGE ;  需要客户端session.commit()来确认会话签收

收:

2.      CLIENT_ACKNOWLEDGE; 通过客户端调用message.acknowledge()方法来签收消息

接收端要为false(如果为true,能接受消息,但是没有消费),发送端依旧是true.

 

3.      DUPS_ACKNOWLEDGE ; 会话延迟确认提交。JMSprovider会在消息头的JMSRedelivered字段设置为true,表示该消息为重复消息

 

消息的持久性

持久化消息(可靠性)

 保证消息只被传送一次和成功使用一次。

非持久化消息(可能会丢失消息,性能更好)

 保证消息最多被传送一次

 

持久化订阅(topic,消息不再丢失)

                     消息会一直存在

                     发送端:

                      producer.setDeliveryMode(DeliveryMode.PERSISTENT);      //持久化模型

                     接收端:

注释成员变量中的destination,consumer

下面代码:第三行不能放在第四行后面,报错:clientID on a used Connection is not allowed.

     

                    clientID 唯一就可以,让发送端知道你是持久订阅客户端【类似zookeeper中的节点】

                                                     topic1是随便写的

 

消息回滚:

       session.rollback()  发送端本地事物

 

 

Spring+activeMq

(processon绘制)           D:优惠券等

     如果这些业务都放在A就会很大,很复杂。解耦等

     多线程也可以去做,但是具有一定的局限性和复杂性,也不能持久化存储等。

 

Spring+activeMQ

sender

1.     

2.     

 

3.     

在此过程中出现的报错总结

①                 :local class incompatible: stream classdesc serialVersionUID = -5514063437663796977, loca

Intellij IDEA 自动生成SerialVersionUID

Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’ 

选上以后,在你的class中:Alt+Enter(放在类名)就会提示自动创建serialVersionUID了。

两个实体中的UID必须是一样的?

 

企业中更多的是用上面的监听➕spring的注解监听消息。封装了consumer.setMessageListener(new MessageListener(){}))

ActiveMQ支持的传输协议

ActiveMQ支持 client-broker通讯协议

 

TCP传输(默认)

1.      高可靠性、而且稳定性强

2.      传输效率高

3.      应用比较广泛

 

Nio:

1.      如果有大量的client去连接到broker上的时候,一般情下,会出现线程数限制的问题

2.      Nio比TCP性能更好

 

NIO、

UDP: udp://ip:port     (不稳定传输,消息丢失)

HTTP :

VM、SSL

Nio方式传输

1.      修改${activemq_home}/conf/activemq.xml

2.     

 

3.      修改连接串:

4.      log日志/data/activemq.log

 

ActiveMQ消息持久化

支持的持久存储方式有哪些

1.      AMQ 基于文件的存储方式(硬盘中), 5.0之前的默认方式

2.      Kahadb 这是5.0后的默认方式 (实务日志+索引)

1.      Director  目录

2.      IndexWriteBatchSize:  批量写入磁盘大小设置

3.      cleanupInterval :  持续多久消息没用就清除

4.      indexcachesize  缓存中索引数量

3.      JDBC 消息存储 【消息消费了,数据库中就没有了】

消息表(ACTIVEMQ_MSGS) 所有的queue和topic都存在里面

消息响应(ACTIVEMQ_ACK)   持久订阅的信息和最后一个持久订阅接收的消息id信息

锁定表(ACTIVEMQ_LOCK)    默认集群,master,slave判断主表,如果单表,useDatabaseLock=”false”

 

配置过程中要注意的几个点:[没有搞出来!!!]

1.     

2.     

3.      引入jar包到lib目录下,包括:commons-pools.jar  commons-dbcp.jar  . mysql的驱动包

 

4.      JDBC Message store with activemq journal   jdbc+缓存 效率更高

 

报这个错,很有可能标签少写了/,坑大了!!

 

ActiveMQ第三次课

1.持久化存储

2.集群配置

3.高级特性

4.总结

 

1. kahadb

2. Jdbc持久化操作

3. Jdbc Message store with ActiveMQ journal   【有缓存,效率更高】

会先缓存到内存中,如果宕机数据不会丢失,在文件中有记录,可以恢复。文件操作(kafka)快于数据库.    4  2048这两个参数先不要配置,有点问题。(应该根据文件大小刷入数据库)

4. Memory 基于内存方式来持久化消息  (快,宕机消息丢失)

 

1.                  Journal 性能优于jdbc

2.                  Jdbc一般用于master/slave模式 ,

3.                  一般使用journal

 

consumer

activeMQ的集群配置

queue consumer cluster (谁获得谁消费,其他人靠边站)

 
 

 

 

 

 

 

 

Broker Cluster

静态网络连接

TransportConnector (tcp /udp)

NetworkConnector (多个broker通信)

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.  

static:(tcp://192.168.11.132:61616,tcp://….)

initialReconnectDelay ;

maxReconnectDelay .

 

2.   如果要做双向链接,那么需要在指定的双方服务器上都需要配置networkConnector [只是做到了负载而没有集群]

这种方式可以认为,发送给130,132先去130消费,然后消费者再去132消费。如此可以理解demo中的问题。如果132宕机,重启依旧可以在132中消费剩下的消息,但在130中已经没有消息,不能消费。【相对而言就出现了消息卡住】

 

管道订阅的方式(conduit subscription)

 

 

消息回流 【如果要双向回流,双方服务器都需要配置】

默认是true,broker之间均分消息,false是不均分(最好两台都配)

 

容错链接(failover protocol)

通过failover协议实现自动重连的逻辑。提供了两种方式: randomize=true/false

true,随机负载;false,主从备份,主宕机后才会连从。

 

1.   initialReconnectDelay ;  (&in 添加在false后)

2.   maxReconnectDelay

3.   useExponentialBackOff:  重连间隔时间是否已指数形式增长(衰减重试)

 

动态网络连接 (广播机制,时时发现去连接,但可能会丢包)

<networkConnectors>

   <networkConnect uri=”multicast://default”/>

</networkConnectors>

 

Master slave

1.                  Shared file system master slave

主要通过共享存储目录实现master和slave的热备。所有ActiveMQ应用都在不断获取共享目co录

的控制权,谁抢到了控制权,它就是master

 
 

 

 

 

 

 

 

 

 

 

 

2.                  JDBC Master  (主从,高可用)

 

3.                  Replicated levelDB store (类似zookeeper原理 )

 

Destinantion 高级特性

组合队列 : (一个消息可以发给多个队列 )

      

      

<destinationInterceptors>

  <virtualDestinationInterceptor>

    

  </ virtualDestinationInterceptor>

</destinationInterceptors>

 

 

Message Dispatch 高级特性

Message Cursors (消息游标)

 

 
 

 

 

 

 

 

 

 

 

 

 

  

Store-based (对非持久化消息处理)

VM   (虚拟化内存)

File-based  (磁盘临时文件)

 

1.                  异步调用   (有实务一定要同步)

2.                  一对多通信 (topic方式订阅)

3.                  多个系统的集成

4.                  提高系统的可用性和伸缩性

 

 

转载于:https://my.oschina.net/u/3339488/blog/855820

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值