ActiveMQ入门

首先了解的名称缩写:

MOM:Message-oriented middleware,面向消息中间件

是用于分布式应用或者系统中的异步、松耦合、可靠、可扩展性和安全通信的一类软件。总体思想是它作为消息的接收器和发送器之间的消息中介,提供了一个全新水平的松耦合。

基于JMS实现的MOM,又被称为JMSProvider

JMS:Java Message Service,java消息服务

最初的目的是为了使应用程序能够访问现有的MOM系统,后来被许多现有的MOM供应商采用,并实现为MOM系统。

是Java平台上有关面向MOM的技术规范,旨在通过提供标准的产生、发送、接收和处理消息的API简化企业应用的开发、类似于JDBC和关系型数据库通信方式的抽象。

JMS中的一些角色

Broken:就是Active启动的一个实例,一个节点,一个消息服务器,作为server提供消息核心服务

provider:生产者,消息生产者是由会话创建的一个对象,用于把消息发送到一个目的地。纯Java语言编写的JMS接口实现(比如ActiveMQ就是)。

consumer:消费者,是由会话创建的一个对象,它用于接收发送目的地的消息。分为两种:
同步消费。通过调用消费者的receive方法从目的地中显示提取消息。receive方法可以一直阻塞到消息到达。
异步消费。客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。

P2P:基于点对点的消息模型(使用queue作为destination)
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消费者不可能消费到以及被消费的消息。
queue支持存在多个消费者,但是对于一个消息来说,只会有一个消费者可以消费、其他的则不能消费此消息了。当消费者不存在是,消费会一直存在,直到有消费者消费。

PUB/SUB:基于订阅/发布的消息模型(消息域使用topic作为destination)
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。
和点对点方式不同,发布到topic的消息会被所有订阅者消费。当生产者发布消息,不管是否有消费者。都不会保存消息,一定要先有消息的消费者,后有消息的生产者。
ActiveMQ入门_第1张图片

ActiveMQ

实现了JMS规范的系统间远程通信的消息代理。

创建应用程序的步骤:

  1. 获取连接工厂
  2. 使用连接工厂创建连接
  3. 启动连接
  4. 从连接创建会话
  5. 获取destination
  6. 创建producer,或创建message
  7. 创建consumer,或发送或接受message,注册消息监听器(可选)
  8. 发送或接受message
  9. 关闭资源(connection、session、producer、consumer等)
// 发送方
public class Sender {
     

	public static void main(String[] args) throws JMSException, InterruptedException {
     

		// 1.获取连接工程

		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
				"tcp://localhost:61616");

		// 2.获取一个向ActiveMQ的连接
		Connection connection = connectionFactory.createConnection();
		
		// 3.获取session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4.找目的地,获取destination,消费端,也会从这个目的地取消息
		Queue queue = session.createQueue("user");
		// 5.1 消息创建者
		MessageProducer producer = session.createProducer(queue);
		// consumer -> 消费者
		// producer -> 创建者
		// 5.2.创建消息
		for (int i = 0; i < 100; i++) {
     
			TextMessage textMessage = session.createTextMessage(i + "、 hi");
			// 5.3.向目的地写入消息
			producer.send(textMessage);
			Thread.currentThread().setName("MyThread" + i);
			System.out.println(Thread.currentThread().getName());
		}

		// 6.关闭连接
		connection.close();
		System.out.println("System exit...");
	}
// 接收方
public class Receiver {
     

	public static void main(String[] args) throws JMSException {
     
		// 1.获取连接工程

		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
				"tcp://localhost:61616");

		// 2.获取一个向ActiveMQ的连接
		Connection connection = connectionFactory.createConnection();
		connection.start();
		// 3.获取session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4.找目的地,获取destination,消费端,也会从这个目的地取消息
		Destination queue = session.createQueue("user");
		// 5.获取消息

		MessageConsumer consumer = session.createConsumer(queue);

		while (true) {
     
			TextMessage message = (TextMessage) consumer.receive();
			System.out.println("message:" + message.getText());
		}

		/*
		 * // 6.关闭连接 connection.close(); System.out.println("System exit...");
		 */

	}

ActiveMQ 常用的存储方式

1、KahaDB
ActiveMQ 5.3 版本起的默认存储方式。KahaDB存储是一个基于文件的快速存储消息,设计目标是易于使用且尽可能快。它使用基于文件的消息数据库意味着没有第三方数据库的先决条件。

要启用 KahaDB 存储,需要在 activemq.xml 中进行以下配置:

1 <broker brokerName="broker" persistent="true" useShutdownHook="false">
2         <persistenceAdapter>
3                 <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
4         persistenceAdapter>
5 broker>

2、AMQ
与 KahaDB 存储一样,AMQ存储使用户能够快速启动和运行,因为它不依赖于第三方数据库。AMQ 消息存储库是可靠持久性和高性能索引的事务日志组合,当消息吞吐量是应用程序的主要需求时,该存储是最佳选择。但因为它为每个索引使用两个分开的文件,并且每个 Destination 都有一个索引,所以当你打算在代理中使用数千个队列的时候,不应该使用它。

<persistenceAdapter>
        <amqPersistenceAdapter
                directory="${activemq.data}/kahadb"
                syncOnWrite="true"
                indexPageSize="16kb"
                indexMaxBinSize="100"
                maxFileLength="10mb" />
persistenceAdapter>

3、JDBC
选择关系型数据库,通常的原因是企业已经具备了管理关系型数据的专长,但是它在性能上绝对不优于上述消息存储实现。事实是,许多企业使用关系数据库作为存储,是因为他们更愿意充分利用这些数据库资源。

<beans>
        <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
                <persistenceAdapter>
                        <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
                persistenceAdapter>
        broker>
        <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
                <property name="username" value="activemq"/>
                <property name="password" value="activemq"/>
                <property name="maxActive" value="200"/>
                <property name="poolPreparedStatements" value="true"/>
        bean>
beans>

4.内存存储
内存消息存储器将所有持久消息保存在内存中。在仅存储有限数量 Message 的情况下,内存消息存储会很有用,因为 Message 通常会被快速消耗。在 activema.xml 中将 broker 元素上的 persistent 属性设置为 false 即可

1 <broker brokerName="test-broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">
2         <transportConnectors>
3                 <transportConnector uri="tcp://localhost:61635"/>
4         transportConnectors>
5 broker>

ActiveMQ 的部署模式

1.单例模式
2.无共享主从模式
3.共享存储主从模式

ActiveMQ 的网络连接

1.代理网络
2.网络发现

你可能感兴趣的:(JAVA,多线程与高并发,java,后端)