第171次(ActiveMQ)
学习主题:ActiveMQ
学习目标:
1 掌握什么是MQ 什么是JMS
2 掌握ActiveMQ的安装与目录结构
对应作业
- ActiveMQ简介
- 什么是ActiveMQ?
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位.
- 什么是消息?
消息是在两台计算机间传送的数据单位.消息可以非常简单,列如只包含文本字符串;也可以更加复杂,可能包含嵌入对象.
- 什么是队列?
和数据结构中学习的一样,特点:先进先出
- 什么是消息队列?
消息队列是在消息传输过程中,保存消息的容器.
- 常见的消息服务有哪些?
ActiveMQ RabbitMQ RocketMQ
- 消息服务应用场景
- 消息服务可应用于哪些场景?
用户注册 订单处理
- 如何将Solr集群中的索引库分为两片?
- JMS消息模型介绍
- 什么是JMS?
JMS(Java Messaging Service)是JAVA 平台上有关面向消息中间件的技术规范,他便于消息系统中的Java应用程序进行消息交换,并且通过提标准的产生,发送,接受消息的接口,简化企业应用的开发.
- JMS中有哪些消息模型?
点对点 和 广播(1对多)
- 安装ActiveMQ
- 如何安装ActiveMQ?
- 下载Active MQ
- 移动到Liunx系统上进行解压
- 执行/bin/activeMQ即可。
- ActiveMQ目录介绍
- ActiveMQ有哪些目录?没给目录的作用是什么?
bin 存放的是脚本文件
conf 存放的是进本配置文件
data 存放的是日志文件
docs 存放的是说明文档
example存放的是简单的示例
lib 存放的是activemq所需的jar包
webapps 用于存放项目的目录
第172次(ActiveMQ)
学习主题:ActiveMQ
学习目标:
1 掌握ActiveMQ中的术语与API
2 掌握使用MQ处理文本消息,对象消息
3 掌握使用ActiveMQ实现队列服务监听处理消息
4 掌握Topic模型
对应作业
- ActiveMQ中的术语
- Destination是什么含义?
目的地,JMS Provider(消息中间件)负责维护,用于对Message进行管理的对象。
MessageProducer 需要指定Destination才能发送消息,Message Receiver需要指定Detination才能接受消息
- Producer是什么含义?
消息生产者, 负责发送Message到目的地
- Consumer | Receiver是什么含义?
消息消费者,负责从目的地中消费{处理|监听 |订阅}Message
- Message是什么含义?
消息,消息封装一次通信的内容
- ActiveMQ中的常用API
- ConnectionFactory的作用是什么?
连接工厂,用于常见连接的工厂类型
- Connection的作用是什么?
连接,用于建立访问ActiveMQ连接的类型,有连接工厂创建
- Session的作用是什么?
会话,一次持久有效状态的访问,有链接创建
- Destination & Queue的作用是什么?
目的地,用于描述本次访问ActiveMQ的消息访问目的地,即ActiveMQ服务的具体队列,由会话创建
- MessageProducer的作用是什么?
消息生成者,再一次有效会话中,用于发送消息给ActiveMQ服务的工具,由会话创建
- MessageConsumer的作用是什么?
消息消费者(消息订阅者,消息处理者),在一次有效会话中,用于从ActiveMQ服务中获取消息的工具,由会话创建.
- Message的作用是什么?
消息,通过消息生成者向ActiveMQ服务发送消息时使用的数据载体对象或消息消费者从ActiveMQ服务中获取消息时使用的数据载体对象,是所有消息{文本消息,对象消息等}具体类型的顶级接口,可以通过会话创建或通过会话从ActiveMQ服务中获取
1. ActiveMQ处理文本消息-创建消息生产者
1. 如何创建消息生产者?
2. package
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. public class
12. /**
13. * 生产消息
14. */
15. public void
16. //定义连接工厂
17. null;
18. //定义连接对象
19. null;
20. //会话
21. null;
22. //目的地
23. null;
24. //定义消息的发送者
25. null;
26. //定义消息
27. null;
28. try{
29. /**
30. * userName:访问ActiveMQ服务的用户名,用户密码 默认 admin
31. * 用户名可以通过jettry-realm.properties文件进行修改.
32. * brokerURL:访问ActiveMQ服务的路径地址.
33. * 路径结构:
34. *
35. */
36. new
37. //创建连接对象
38. connection =connectionFactory.createConnection();
39. //启动连接
40. connection.start();
41. /**
42. * transacted:事务 (是否使用事务(true或false))
43. * acknowledgeMode:
44. * session.AUTO_ACKNOWLEDGE:自动消息确定机制
45. * session.CLIENT_ACKNOWLEDGE:客户端确认机制
46. * session.AUTO_ACKNOWLEDGE:有副本的客户端消息确认机制
47. */
48. false, session.AUTO_ACKNOWLEDGE);
49. //创建目的地名称,即队列的名称.消息的消费者需要通过此名称访问对应的队列.
50. destination = session.createQueue("helloWorld-destination");
51. //创建消息的生产者
52. producer = session.createProducer(destination);
53. //创建消息对象
54. message = session.createTextMessage(msgTest);
55. //发送消息
56. producer.send(message);
57. catch(Exception exception){
58. finally
59. if(producer!=null){
60. try
61. producer.close();
62. catch
63. // TODO Auto-generated catch block
64. e.printStackTrace();
65. }
66. }
67. if(session!=null){
68. try
69. session.close();
70. catch
71. // TODO Auto-generated catch block
72. e.printStackTrace();
73. }
74. }
75. if (connection!=null) {
76. try
77. connection.close();
78. catch
79. // TODO Auto-generated catch block
80. e.printStackTrace();
81. }
82. }
83. }
84. }
85. }
86. ActiveMQ处理文本消息-创建消息消费者
1. 如何创建消息消费者?
87. package
88. import
89. import
90. import
91. import
92. import
93. import
94. import
95. import
96. import
97. import
98. public class
99. /**
100. * 消费消息
101. */
102. public void
103. //定义连接工厂
104. null;
105. //定义连接对象
106. null;
107. //会话
108. null;
109. //目的地
110. null;
111. //定义消息的接受者
112. null;
113. //定义消息
114. null;
115. try{
116. /**
117. * userName:访问ActiveMQ服务的用户名,用户密码 默认 admin
118. * 用户名可以通过jettry-realm.properties文件进行修改.
119. * brokerURL:访问ActiveMQ服务的路径地址.
120. * 路径结构:
121. *
122. */
123. new
124. //创建连接对象
125. connection =connectionFactory.createConnection();
126. //启动连接
127. connection.start();
128. /**
129. * transacted:事务 (是否使用事务(true或false))
130. * acknowledgeMode:
131. * session.AUTO_ACKNOWLEDGE:自动消息确定机制
132. * session.CLIENT_ACKNOWLEDGE:客户端确认机制
133. * session.AUTO_ACKNOWLEDGE:有副本的客户端消息确认机制
134. */
135. false, session.AUTO_ACKNOWLEDGE);
136. //创建目的地名称,即队列的名称.消息的消费者需要通过此名称访问对应的队列.
137. destination = session.createQueue("helloWorld-destination");
138. //创建消息的接受者
139. consumer = session.createConsumer(destination);
140. //创建消息对象&接受消息
141. message = consumer.receive();
142. //处理消息
143. String msg = ((TextMessage)message).getText();
144. System.out.println("获取的文本信息:"+msg);
145. catch(Exception exception){
146. finally
147. if(consumer!=null){
148. try
149. consumer.close();
150. catch
151. // TODO Auto-generated catch block
152. e.printStackTrace();
153. }
154. }
155. if(session!=null){
156. try
157. session.close();
158. catch
159. // TODO Auto-generated catch block
160. e.printStackTrace();
161. }
162. }
163. if (connection!=null) {
164. try
165. connection.close();
166. catch
167. // TODO Auto-generated catch block
168. e.printStackTrace();
169. }
170. }
171. }
172. }
173. //
174. }
175. ActiveMQ处理对象消息
1. 如何处理消息对象?
消费者:
1. //处理对象消息
2. ObjectMessage objectMessage = (ObjectMessage)message;
3. User user = (User)objectMessage.getObject();
4. System.out.println(user.toString());
生产者:
1. //创建消息对象
2. message = session.createObjectMessage(user);
3. ActiveMQ实现队列服务监听处理消息
1. ActiveMQ实现队列服务监听处理消息
4. consumer.setMessageListener(new
5. //ActiveMQ 回调的方法,通过该方法将信息传递到consumer
6. @Override
7. public void
8. //处理消息
9. null;
10. //处理消息
11. try
12. msg = ((TextMessage)message).getText();
13. catch
14. // TODO Auto-generated catch block
15. e.printStackTrace();
16. }
17. System.out.println("获取的文本信息:"+msg);
18. }
19. });
20. Topic模型的使用
- 什么是Topic模型?
Publish/Subscribe 处理模式(Topic)
消息生产者(发布)将消息发布到topic中,同时有多个消费者(订阅)消费该消息.
和点对点方式不同,发布到topic的消息会被所有订阅者消费
当生产者发送消息,不管是由有消费者,都不会保留消息.
一定要先有消息的消费者,后有消息的生产者.