ActiveMQ的基本使用

一、 ActiveMQ的概述:

       ActiveMQ 是一款开源的,完全支持JSM1.1JavaEE1.4中的JMS provider实现的消息中心(MOM)。

二、ActiveMQ特点:

  1. 完全支持 JMS1.1和javaEE1.4规范
  2. 可以通过JDBC持久化消息(默认KahaDB )、分布式事务JTA和XADateSource
  3. 支持多种协议:TCP、UDP、SSL、NIO
  4. 支持多种语言:C、C++、C#、java、Ruby、Python、PHP
  5. 容易和Spring集成
  6. 在设计上保证了高性能的集群

三、ActiveMQ的应用场景:

  1. 高并发业务,因为ActiveMQ的队列容器(数据可以有优先级)和轮询机制可以很好的处理高并发
  2. 耗时长的业务:ActiveMQ是一种异步的消息机制,
  3. 解耦业务:ActiveMQ 中发布/订阅(pub/sub)模式可以广播消息,解耦业务

四、ActiveMQ的下载和运行

  1. 从官网下载程序:http://activemq.apache.org/download.html
  2. 解压
  3. 运行启动程序

五、ActiveMQ一些重要配置

apache-activemq-5.15.3\conf 中有一个activemq.xml 文件(主要配置ActiveMQ的消息监听端口,如tcp://localhost:61616

           

    ActiveMQ的管理界面端口(管理界面端口):

           

   访问地址http://localhost:8161/admin/

六、配置ActiveMQ的持久化数据库

  1. 在activemq.xml文件中添加mysql的配置
     1 <bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
     2 
     3                    <property name="url" value="jdbc:mysql:///activemq"/>
     4 
     5                    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     6 
     7                    <property name="username" value="root"/>
     8 
     9                    <property name="password" value="admin"/>
    10 
    11 </bean>
  2. 将默认使用过kahadb的配置注释掉

            

             替换成<jdbcPersistenceAdapter dataSource="#mysql-ds"/>

 七、配置ActiveMQ的访问密码

1 //在ActiveMQ.xml中添加
2 <plugins>  
3     <simpleAuthenticationPlugin>  
4         <users>  
5     <authenticationUser username="admin" password="admin" groups="users,admins"/>  
6         </users>  
7     </simpleAuthenticationPlugin>  
8 </plugins>

     

八、 ActiveMQ事务

      ActiveMQ支持事务

     

 一旦开启事务则第二个参数Session.AUTO_ACKNOWLEDGE将无效,原因是当transacted为true,则不会使用Session.AUTO_ACKNOWLEDGE 而是使用Session.SESSION_TRANSACTED  

九、ActiveMQ签收方式

ActiveMQ 的签收机制:

  1. Session.AUTO_ACKNOWLEDGE:当客户端使用receive接收后,session会自动签收客户端这条消息,并且在数据库中将这条消息删除
  2. Session.CLIENT_ACKNOWLEDGE:需要msg.acknowledge()方法的配合,只有消息调用了acknowledge()方法则消息才会被签收,才会从数据库中删除
  3. Session.DUPS_OK_ACKNOWLEDG:允许在收到多个消息之后再一次性完成确认,这样能节约session,但是会出现消息重复的情况。

     

十、ActiveMQ的Demo项目搭建

使用Maven搭建Demo项目因为使用的ActiveMQ版本是5.15.3因此版本号要和使用的程序版本一致

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-broker</artifactId>
  <version>5.15.3</version>
</dependency>
//不同的版本可以到https://mvnrepository.com/artifact/org.apache.activemq/activemq-broker 查找

十一、生产者代码

 1 /**
 2  * 生产者
 3  */
 4 public class Product {
 5     public static void main(String[] args) throws Exception {
 6         //1.创建连接工厂
 7         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
 8                 "admin",
 9                 "admin",
10                 "tcp://localhost:61616");
11         //2.创建链接
12         Connection connection = connectionFactory.createConnection();
13         connection.start();
14         //3.创建会话
15         Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
16         //4.定义消息的目的地
17         Queue dest = session.createQueue("dest");
18         //5.创建生产者
19         MessageProducer producer = session.createProducer(dest);
20         TextMessage msg;
21         for (int i = 0; i < 10; i++) {
22             msg = session.createTextMessage("消息" + i);
23             //发送消息
24             producer.send(dest,msg);
25             //TimeUnit.SECONDS.sleep(1);
26         }
27         //关闭资源
28         if(connection!=null){
29             session.close();
30             connection.close();
31         }
32     }
33 }

十二、消费者代码

 1 /**
 2  * 消费者
 3  */
 4 public class Customer {
 5     public static void main(String[] args) throws Exception {
 6         //1.创建连接工厂
 7         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
 8                 "admin",
 9                 "admin",
10                 "tcp://127.0.0.1:61616");
11         //2.创建链接
12         Connection connection = connectionFactory.createConnection();
13         connection.start();
14         //3.创建会话
15         Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
16         //4.定义消息的来源
17         Queue dest = session.createQueue("dest");
18         //5.创建消费者
19         MessageConsumer consumer = session.createConsumer(dest);
20         while (true) {
21 
22             //6.接收消息,receive有阻塞的功能
23             TextMessage msg = (TextMessage) consumer.receive();
24 
25             msg.acknowledge();
26             System.out.println(msg.getText());
27         }
28     }
29 }
posted @ 2019-01-16 23:15  入坑的小学生  阅读(25)  评论(0)    收藏  举报