What's ActiveMQ
JMS Provider的一种实现,用来帮助实现高可用,高性能,可伸缩,易用和安全的企业级面向消息服务的系统。
1.实现系统之间的解耦
old: System A ---> System B
now: SysTem A ---> (Message Oriented Middleware消息中间件) --->System B
2.保证高性能,A系统发出请求后不再需要等待B系统的响应就可以继续做其他事情了!
JMS概念
1.PTP ,Pub/Sub API结构
PTP:
1.每条消息只能有一个消费者
2.消息的生产者和消费者之间没有时间上的相关性,无论生产者是否在运行,消费者都可以从队列中提取消息
send acknowdge
Producer ------> Queue ----------> Consumer
PUB/SUB:
1.每条消息可以有多个消费者
2.消息的生产这和消费者之间存在时间上的相关性,消费者只能在订阅之后接收订阅时间之后Topic中的消息
publish subscrible
Producer --------> Topic -----------> Subscriber(1...n)
2.JMS持久化和非持久Topic
消息类型:TextMessage,MapMessage,BytesMessage,StreamMessage,ObjectMessage
非持久的Topic:
必须要求消费者在线。唯有消费者在线,生产者发送消息,消费者才能接收到消息。
持久的Topic:
必须先运行消费者端,等于向消息中间件注册该订阅指定topic的消费者。然后运行生产者端,此时无论消费者是否在线都可以接收到消息,不在线的话,下次连接时,会自动接收到不在线期间订阅的消息。
1.保证了消息的可靠性,消息不易丢失。
ActiveMQ安装及基本使用
1.去Apache ActiveMQ官网下载 ActiveMQ download 本人下载版本为:apache-activemq-5.15.12-bin.tar.gz
解压:tar -xvf ./apache-activemq-5.15.12-bin.tar.gz
2.启动ActiveMQ broker服务
解压安装后, bin目录下 ./activemq start
#此命令默认使用conf目录下的activemq.xml(内部配置消息持久化,broker等相关配置信息)作为配置文件启动activeMQ,推荐大家去详读一下相关配置内容。
#如果需要使用自定义的配置文件来启动activeMQ,则命令为: ./activemq start xbean:file:xxxxx(自定义文件路径)。
##ActiveMQ 服务默认端口为61616
3.去ActiveMQ自带的管理页面查看相关服务信息 http://ip-addr:8161/admin/
4.Java手动创建ActiveMQ Broker服务,一般在ActiveMQ服务器宕机时候可以临时代替使用
普通Broker服务:
引入ActiveMQ核心组件依赖
Pom:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>4.16</version>
</dependency>
Java:
public class createBroker {
public static void main(String[] args) throws Exception {
BrokerService broker=new BrokerService();
broker.setUseJmx(true);
broker.addConnector("tcp://localhost:61616");
broker.start();
}
}
#测试,通过Producer和Consumer分别发送和接受消息,如果都没问题证明我们手动创建的Broker生效。
用Spring实现的Broker服务
pom:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId
<version>5.15.12</version>
</dependency>
<!--注册消息连接池相关类-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.12</version>
</dependency>
<!--注册jms核心类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
ApplicationContext.xml:
<!--broker bean-->
<bean id="broker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
<property name="brokerName" value="myBroker"/>
<property name="persistent" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://localhost:61616</value>
</list>
</property>
</bean>
...
JAVA:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
#测试,通过Producer和Consumer分别发送和接受消息,如果都没问题证明我们手动创建的Broker生效。