activeMQ的使用

江枫思渺然 提交于 2020-02-05 03:10:38

一.应用场景
在异步处理,并发的业务(比如抢购活动),应用解耦都可以使用到activeMQ
二.RPC框架的局限性
我们使用RPC的框架其实都是点对点的调用,这种架构面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性
1)同步通讯,客户端发出调用后,必须等待服务对象完成处理并返回结果之后才能继续进行;
2)客户和服务对象的生命周期紧密耦合,客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络导致用户的请求不可达,客户会受到异常
3)点对点的通讯,客户的一次调用只能发给某个单独的目标对象.
三.消息中心的特点:
1、消息异步接收:消息发送者不需要等待消息接收着的响应,提高整个应用程序的性能
2、消息可靠接收:消息发送出去后保存在一个中间容器内,只有消息接收者收到消息后才删除消息
3、消息队列接收:消息以队列的形式接收,一个一个排队处理 可以指定先后顺序
四.JMS的概念
JMS即Java消息服务(Java Message Service)应用程序接口,是JavaEE平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
JMS规范
JMS定义了Java中访问消息中心的接口,并没有给予实现,实现JSM接口的消息中心称为JMS Provider,例如ActiveMQ
五.相关的组成
JMS Provider:实现JMS接口和规范的消息中心
JMS Producer:消息生产者,创建和发送JMS消息的客户端应用
JMS Consumer:消息消费者,接收和处理JMS消息的客户端应用
JMS Message:
JMS消息,分3个部分:
(1)消息头:每个消息头字段都有相应的getter和setter方法
(2)消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性
(3)消息体:封装具体的消息数据
JMS Destination:消息目的地,包含queue和topic
JMS Domain:消息传递域,JMS规范中定义了两种消息传递域,分别是点对点和发布/订阅消息传递域:
(1)点对点(PTP)
点对点(point-to-point,简写PTP或P2P)消息传递域,该消息传递域发送的消息目的地称为队列(queue)
特点:
a、每个消息只能有一个消费者
b、消息的生产者和消费者之间没有时间上的相关性,无论消息消费者在提取消息的时候,消息生产者是否处于运行状态,消息消费者还是可以提取消息
(2)发布/订阅(pub/sub)
发布/订阅(publish/subscribe,简写pub/sub)消息传递域,该消息传递域发送的消息目的地称为主题(topic)
特点:
a、每个消息可以有多个消费者
b、生产者和消费者之间有时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。
JMS Session:与JMS Provider所建立的会话,可设置事务,消息消费签收方式
六.消息格式定义
JMS定义了五种不同的消息正文格式,以及调用的消息类型.允许你发送并接受以一些不同形式的数据,提供现有消息格式的一些级别的兼容性
StreamMessage:原始值的数据流
MapMessage:键值对的数据存储
TextMessage:一个字符串对象
ObjectMessage:一个序列化的Java对象
BytesMessage:一个为解释字节的数据流
七.ActiveMQ安装运行
7.1ActiveMQ特点
1、完全支持JMS1.1和JavaEE1.4规范(持久化,分布式事务JTA和XADataSource)
2、支持多种传送协议:TCP,UDP,SSL,NIO
3、可插拔的体系结构,可灵活定制,如:集群,负责均衡,消息存储方式,安全管理等
4、很容易和系统集成使用(和spring整合)
5、多语言使用:Java,C,C++,C#,Ruby,Python,PHP
6、在设计上保证了高性能的集群
7、支持通过JDBC把消息持久化到数据库
7.2下载ActiveMQ运行程序:
1、从官网上下载运行程序:http://activemq.apache.org/download.html
2、拷贝到你要安装的位置直接解压就好了

启动ActiveMQ:双击bin目录下对应的操作系统下面的activemq.bat
访问地址: http://localhost:8161
在这里插入图片描述
在这里插入图片描述
7.3.下载解压
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录账号和密码均是admin
在这里插入图片描述

7.4.也可以修改默认的端口
在这里插入图片描述
在这里插入图片描述
八.activeMQ的使用
8.1新建一个普通的项目导入依赖(版本自选对应的版本)

<dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-broker</artifactId>
      <version>5.15.11</version>
    </dependency>

8.2生产者

public class Producer {
    public static void main(String[] args) throws Exception{
        //第一步:建立ConnectionFactory工厂对象,需要填入用户名,密码,以及要连接的地址.均使用默认即可,默认端口为tcp://localhost:61616
        ConnectionFactory factory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_USER,
                "tcp://localhost:61616"
        );
        //第二步:通过ConnectionFactory工厂对象我们创建一个Connection连接,并且调用Connection的start方法开启连接,Connection默认是关闭的.
        Connection connection = factory.createConnection();
        connection.start();
        //第三步:通过Connection对象创建Session会话(上下文环境对象),用于接受信息,参数配置1为是否启动事务,参数配置2为签收模式,一般我们设置自动签收.
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //第四步:通过session创建Destination对象,指的是一个客户端用户指定生产者消息目标和消费消息的来源的对象.在PTP模式中,Destination称作Queue即队列;在Pub/Sub模式,Destination被称作Topic即主题.在程序中可以使用多个Queue和Topic.
        Queue destination = session.createQueue("first");
        //第五步:我们需要通过Session对象创建消息的发送和接受对象(生产者和消费者)MessageProducer/MessageConsumer
        MessageProducer producer = session.createProducer(null);
        TextMessage msg;
        for(int i = 0;i<100;i++){
            msg = session.createTextMessage("这是队列消息" + i);
            //第六步:我们可以使用MessageProducer的setDeliveryMode方法为其设置持久化特性和非持久化特性(DeliveryMode),我们稍后详细介绍.
            producer.send(destination,msg);
            TimeUnit.SECONDS.sleep(1);
        }
        //第七步:最后我们使用JMS规范的TextMessage形式创建数据(通过Session对象),并用MessageProducer的send方法发送数据.同理客户端使用receive方法进行接接收数据,最后不要忘记关闭Connection连接.
        if(connection!=null){
            connection.close();
        }
    }
}

在这里插入图片描述
消息会保存在data目录下,即使你关闭了activemq也不影响
在这里插入图片描述
在这里插入图片描述
8.3消费者

public class Consumer {
    public static void main(String[] args) throws Exception{
        //第一步:建立ConnectionFactory工厂对象,需要填入用户名,密码,以及要连接的地址.均使用默认即可,默认端口为tcp://localhost:61616
        ConnectionFactory factory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        //第二步:通过ConnectionFactory工厂对象我们创建一个Connection连接,并且调用Connection的start方法开启连接,Connection默认是关闭的.
        Connection connection = factory.createConnection();
        connection.start();
        //第三步:通过Connection对象创建Session会话(上下文环境对象),用于接受信息,参数配置1为是否启动事务,参数配置2为签收模式,一般我们设置自动签收.
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //第四步:通过session创建Destination对象,指的是一个客户端用户指定生产者消息目标和消费消息的来源的对象.在PTP模式中,Destination称作Queue即队列;在Pub/Sub模式,Destination被称作Topic即主体.在程序中可以使用多个Queue和Topic.
        Destination destination = session.createQueue("first");
        //第五步:通过session创建消费者对象
        MessageConsumer consumer = session.createConsumer(destination);
        while(true){
            //从目标地址获取消息
            TextMessage msg = (TextMessage) consumer.receive();
            System.out.println(msg.getText());
        }
    }
}

在这里插入图片描述
8.4安全机制
在ActiveMQ的conf目录的activemq.xml中的broker添加密码配置添加账号密码

<!-- 添加访问ActiveMQ的账号密码 -->  
存放在broker的bean对象中
<plugins>  
	<simpleAuthenticationPlugin>  
		<users>  
			<authenticationUser username="xxx" password="xxx" groups="users,admins"/>  
		</users>  
	</simpleAuthenticationPlugin>  
</plugins>  

在这里插入图片描述
8.5数据的持久化
ActiveMQ支持切换不同的存储技术.支持KahaDB(默认),LevelDB,MySQL,Oracle.
我们可以切换其他的数据源MySQL
修改activemq.xml,配置如下:

<persistenceAdapter>
	<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
	<jdbcPersistenceAdapter dataSource="#mysql-ds"/> 
</persistenceAdapter>
<bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
	<property name="url" value="jdbc:mysql:///activemq"/>
	<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
	<property name="username" value="root"/>
	<property name="password" value="admin"/>
</bean>

添加jar包
在这里插入图片描述
在这里插入图片描述
activemq_msgs:用于存储消息,Queue和Topic都存储在这个表中
activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存:
activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker,其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker。
在这里插入图片描述
消费之后,表中的数据被删除
九.API的使用
9.1Connection方法使用
在成功创建正确的ConnectionFactory后,下一步将是创建一个连接,他是JMS定义的一个接口.ConnectionFacotry负责返回客户与底层消息传递系统进行通讯的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)
9.2Session方法使用
a.事务:事务回滚之后会重新再从消息中心重新获取数据.
b:签收方式
Session.AUTO_ACKNOWLEDGE
当客户端从receive或onMessage成功返回时,session自动签收客户端的这条消息的收条.
Session.CLIENT_ACKNOWLEDGE
客户端通过调用Message的acknowledge方法签收消息.在这种情况下,签收发送在session层面,签收一个已经消费的消息会自动的签收这个session所有已经消费消息的收条.
Session.DUPS_OK_ACKNOWLEDG
此选项只是Session不必确保对传送消息的签收.它可能引起消息的重复,但是降低了session的开销.所以只有客户端能容忍重复消息,才可使用.
9.3MessageProducer方法使用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!