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的消息会被所有订阅者消费。当生产者发布消息,不管是否有消费者。都不会保存消息,一定要先有消息的消费者,后有消息的生产者。
实现了JMS规范的系统间远程通信的消息代理。
创建应用程序的步骤:
// 发送方
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...");
*/
}
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>
1.单例模式
2.无共享主从模式
3.共享存储主从模式
1.代理网络
2.网络发现