SSM商城项目(八)
?1.? ?學習計劃
1、solr集群搭建
2、使用solrj管理solr集群
3、把搜索功能切換到集群版
4、添加商品同步到索引庫
2.?? 什么是SolrCloud
SolrCloud(solr 云)是Solr提供的分布式搜索方案,當你需要大規模,容錯,分布式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求并發很高,這時需要使用SolrCloud來滿足這些需求。
?SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。
它有幾個特色功能:
1)集中式的配置信息
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡
3.?? Solr集群的系統架構
?
3.1. 物理結構
三個Solr實例( 每個實例包括兩個Core),組成一個SolrCloud。
3.2. 邏輯結構
索引集合包括兩個Shard(shard1和shard2),shard1和shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由zookeeper選舉產生,zookeeper控制每個shard上三個Core的索引數據一致,解決高可用問題。
用戶發起索引請求分別從shard1和shard2上獲取,解決高并發問題。
?
3.2.1.??? collection
Collection在SolrCloud集群中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個Shard(分片),它們使用相同的配置信息。
比如:針對商品信息搜索可以創建一個collection。
?collection=shard1+shard2+....+shardX
?
3.2.2.??? Core
每個Core是Solr中一個獨立運行單位,提供 索引和搜索服務。一個shard需要由一個Core或多個Core組成。由于collection由多個shard組成所以collection一般由多個core組成。
3.2.3.??? Master或Slave
Master是master-slave結構中的主結點(通常說主服務器),Slave是master-slave結構中的從結點(通常說從服務器或備服務器)。同一個Shard下master和slave存儲的數據是一致的,這是為了達到高可用目的。
3.2.4.??? Shard
Collection的邏輯分片。每個Shard被化成一個或者多個replication,通過選舉確定哪個是Leader。
3.3. 需要實現的solr集群架構
Zookeeper作為集群的管理工具。
1、集群管理:容錯、負載均衡。
2、配置文件的集中管理
3、集群的入口
?
需要實現zookeeper 高可用。需要搭建集群。建議是奇數節點。需要三個zookeeper服務器。?
搭建solr集群需要7臺服務器。
搭建偽分布式:
需要三個zookeeper節點
需要四個tomcat節點。
建議虛擬機的內容1G以上。
4.?? 環境準備
??? CentOS-6.5-i386-bin-DVD1.iso
?????? jdk-7u72-linux-i586.tar.gz
??? apache-tomcat-7.0.47.tar.gz
??? zookeeper-3.4.6.tar.gz
??? solr-4.10.3.tgz
5.?? 安裝步驟
5.1. Zookeeper集群搭建
第一步:需要安裝jdk環境。
第二步:把zookeeper的壓縮包上傳到服務器。
第三步:解壓縮。
第四步:把zookeeper復制三份。
[root@localhost ~]# mkdir /usr/local/solr-cloud
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper01
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper02
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper03
第五步:在每個zookeeper目錄下創建一個data目錄。
第六步:在data目錄下創建一個myid文件,文件名就叫做“myid”。內容就是每個實例的id。例如1、2、3
[root@localhost data]# touch? myid
[root@localhost data]# vim myid
[root@localhost data]# cat myid
1
第七步:修改配置文件。把conf目錄下的zoo_sample.cfg文件改名為zoo.cfg
?第八步:啟動每個zookeeper實例。
[root@localhost solr-cloud]# vim starall.sh
cd zookeeper01/bin
./zkServer.sh start
cd ../../
cd zookeeper02/bin
./zkServer.sh start
cd ../../
cd zookeeper03/bin
./zkServer.sh start
cd ../../
?[root@localhost solr-cloud]# chmod u+x starall.sh
[root@localhost solr-cloud]# ./starall.sh
?
查看zookeeper的狀態:
zookeeper01/bin/zkServer.sh status
zookeeper02/bin/zkServer.sh status
zookeeper03/bin/zkServer.sh status
如果還是單機模式啟動(Mode: standalone),關閉重啟下。
5.2. Solr集群的搭建
第一步:在?/usr/local/solr-cloud創建四個tomcat實例。每個tomcat運行在不同的端口。8180、8280、8380、8480
第二步:部署solr的war包。把單機版的solr工程復制到集群中的tomcat中。
[root@localhost solr-cloud]# cp -r ../solr/tomcat/webapps/solr/? tomcat01/webapps/
[root@localhost solr-cloud]# cp -r ../solr/tomcat/webapps/solr/? tomcat02/webapps/
[root@localhost solr-cloud]# cp -r ../solr/tomcat/webapps/solr/? tomcat03/webapps/
[root@localhost solr-cloud]# cp -r ../solr/tomcat/webapps/solr/? tomcat04/webapps/
第三步:為每個solr實例創建一個對應的solrhome。使用單機版的solrhome復制四份。
[root@localhost solr-cloud]# cp -r ../solr/solrhome/ solrhome01
[root@localhost solr-cloud]# cp -r ../solr/solrhome/ solrhome02
[root@localhost solr-cloud]# cp -r ../solr/solrhome/ solrhome03
[root@localhost solr-cloud]# cp -r ../solr/solrhome/ solrhome04
第四步:需要修改solr的web.xml文件。把solrhome關聯起來。
[root@localhost solr-cloud]# vim tomcat01/webapps/solr/WEB-INF/web.xml
[root@localhost solr-cloud]# vim tomcat02/webapps/solr/WEB-INF/web.xml
[root@localhost solr-cloud]# vim tomcat03/webapps/solr/WEB-INF/web.xml
[root@localhost solr-cloud]# vim tomcat04/webapps/solr/WEB-INF/web.xml
第五步:配置solrCloud相關的配置。每個solrhome下都有一個solr.xml,把其中的ip及端口號配置好。
第六步:讓zookeeper統一管理配置文件。需要把solrhome/collection1/conf目錄上傳到zookeeper。上傳任意solrhome中的配置文件即可。
使用工具上傳配置文件:/heima/solr-4.10.3/example/scripts/cloud-scripts
[root@localhost cloud-scripts]# ./zkcli.sh -zkhost 192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf
[root@localhost cloud-scripts]# cd /usr/local/solr-cloud/zookeeper01/bin
[root@localhost bin]# ./zkCli.sh -server 192.168.25.128:2183
第七步:修改tomcat/bin目錄下的catalina.sh 文件,關聯solr和zookeeper。
把此配置添加到配置文件中:
[root@localhost solr-cloud]# vim tomcat01/bin/catalina.sh
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
[root@localhost solr-cloud]# vim tomcat02/bin/catalina.sh
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
[root@localhost solr-cloud]# vim tomcat03/bin/catalina.sh
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
[root@localhost solr-cloud]# vim tomcat04/bin/catalina.sh
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
第八步:啟動每個tomcat實例。要包裝zookeeper集群是啟動狀態。
[root@localhost solr-cloud]# vim start-tomcat-all.sh
/usr/local/solr-cloud/tomcat01/bin/startup.sh
/usr/local/solr-cloud/tomcat02/bin/startup.sh
/usr/local/solr-cloud/tomcat03/bin/startup.sh
/usr/local/solr-cloud/tomcat04/bin/startup.sh
[root@localhost solr-cloud]# chmod u+x start-tomcat-all.sh
[root@localhost solr-cloud]# ./start-tomcat-all.sh
第九步:訪問集群
第十步:創建新的Collection進行分片處理。
http://192.168.25.128:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
第十一步:刪除不用的Collection。
http://192.168.25.128:8180/solr/admin/collections?action=DELETE&name=collection1
?
6.?? 使用solrJ管理集群
6.1. 添加文檔
使用步驟:
第一步:把solrJ相關的jar包添加到工程中。
第二步:創建一個SolrServer對象,需要使用CloudSolrServer子類。構造方法的參數是zookeeper的地址列表。
第三步:需要設置DefaultCollection屬性。
第四步:創建一SolrInputDocument對象。
第五步:向文檔對象中添加域
第六步:把文檔對象寫入索引庫。
第七步:提交。
@Testpublic void testSolrCloudAddDocument() throws Exception {// 第一步:把solrJ相關的jar包添加到工程中。// 第二步:創建一個SolrServer對象,需要使用CloudSolrServer子類。構造方法的參數是zookeeper的地址列表。//參數是zookeeper的地址列表,使用逗號分隔CloudSolrServer solrServer = new CloudSolrServer("192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183");// 第三步:需要設置DefaultCollection屬性。solrServer.setDefaultCollection("collection2");// 第四步:創建一SolrInputDocument對象。SolrInputDocument document = new SolrInputDocument();// 第五步:向文檔對象中添加域document.addField("item_title", "測試商品");document.addField("item_price", "100");document.addField("id", "test001");// 第六步:把文檔對象寫入索引庫。 solrServer.add(document);// 第七步:提交。 solrServer.commit();}6.2. 查詢文檔
@Testpublic void testQueryDocument() throws Exception {//創建一個CloudSolrServer對象CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183");//設置默認的CollectioncloudSolrServer.setDefaultCollection("collection2");//創建一個查詢對象SolrQuery query = new SolrQuery();//設置查詢條件query.setQuery("*:*");//執行查詢QueryResponse queryResponse = cloudSolrServer.query(query);//取查詢結果SolrDocumentList solrDocumentList = queryResponse.getResults();System.out.println("總記錄數:" + solrDocumentList.getNumFound());//打印for (SolrDocument solrDocument : solrDocumentList) {System.out.println(solrDocument.get("id"));System.out.println(solrDocument.get("title"));System.out.println(solrDocument.get("item_title"));System.out.println(solrDocument.get("item_price"));}}7.?? 把搜索功能切換到集群版
<!-- 單機版solr服務配置 --> <!-- <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer"><constructor-arg index="0" value="http://192.168.25.128:8090/solr/collection1"/></bean> --><!-- 集群版solr服務 --><bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer"><constructor-arg name="zkHost" value="192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"></constructor-arg> <property name="defaultCollection" value="collection2"></property></bean>啟動注冊中心
[root@localhost //]# cd heima/zookeeper-3.4.6/bin
[root@localhost bin]# ./zkServer.sh start
啟動redis集群
[root@localhost //]# cd? usr/local/redis-cluster
[root@localhost redis-cluster]# ./start-all.sh?
8.?? 全局異常處理
8.1. 處理思路
8.2. 創建全局異常處理器
package cn.e3mall.search.exception;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView;public class GlobalExceptionReslover implements HandlerExceptionResolver{Logger logger = LoggerFactory.getLogger(GlobalExceptionReslover.class);@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {//寫日志文件logger.error("系統發生異常", ex);//發郵件、發短信//Jmail:可以查找相關的資料//需要在購買短信。調用第三方接口即可。//展示錯誤頁面ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("error/exception");return modelAndView;} }8.3. 上傳日志文件
log4j.rootLogger=DEBUG,A3,STDOUTlog4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%nlog4j.appender.A3=org.apache.log4j.RollingFileAppender log4j.appender.A3.file=logs/server.log log4j.appender.A3.MaxFileSize=1024KB log4j.appender.A3.MaxBackupIndex=10 log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n8.4. Springmvc中配置異常處理器
<!-- 全局異常處理器 -->
<bean class="cn.e3mall.search.exception.GlobalExceptionReslover"/>
9.?? 同步索引庫分析
方案一:在taotao-manager中,添加商品的業務邏輯中,添加一個同步索引庫的業務邏輯。
缺點:業務邏輯耦合度高,業務拆分不明確
方案二:業務邏輯在taotao-search中實現,調用服務在taotao-manager實現。業務邏輯分開。
缺點:服務之間的耦合度變高。服務的啟動有先后順序。
方案三:使用消息隊列。MQ是一個消息中間件。
MQ是一個消息中間件,ActiveMQ、RabbitMQ、kafka
10.?? ActiveMQ
10.1. 什么是ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
主要特點:
1. 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2. 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
3. 對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性
4. 通過了常見J2EE服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上
5. 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持通過JDBC和journal提供高速的消息持久化
7. 從設計上保證了高性能的集群,客戶端-服務器,點對點
8. 支持Ajax
9. 支持與Axis的整合
10. 可以很容易得調用內嵌JMS provider,進行測試
10.2. ActiveMQ的消息形式
對于消息的傳遞有兩種類型:
一種是點對點的,即一個生產者和一個消費者一一對應;
另一種是發布/訂閱模式,即一個生產者產生消息并進行發送后,可以由多個消費者進行接收。
JMS定義了五種不同的消息正文格式,以及調用的消息類型,允許你發送并接收以一些不同形式的數據,提供現有消息格式的一些級別的兼容性。
· StreamMessage -- Java原始值的數據流
· MapMessage--一套名稱-值對
· TextMessage--一個字符串對象
· ObjectMessage--一個序列化的 Java對象
· BytesMessage--一個字節的數據流
11.?? ActiveMQ的安裝
進入http://activemq.apache.org/下載ActiveMQ
?
?
?
11.1. 安裝環境:
1、需要jdk
2、安裝Linux系統。生產環境都是Linux系統。
11.2. 安裝步驟
第一步: 把ActiveMQ 的壓縮包上傳到Linux系統。
第二步:解壓縮。
第三步:啟動。
使用bin目錄下的activemq命令啟動:
[root@localhost bin]# ./activemq start
關閉:
[root@localhost bin]# ./activemq stop
查看狀態:
[root@localhost bin]# ./activemq status
?
注意:如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建議使用5.11.2
進入管理后臺:
http://192.168.25.168:8161/admin
用戶名:admin
密碼:admin
12.?? ActiveMQ的使用方法
12.1. Queue
12.1.1.??? Producer
生產者:生產消息,發送端。
把jar包添加到工程e3-manager-service的pom.xml中。使用5.11.2版本的jar包。
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId></dependency>第一步:創建ConnectionFactory對象,需要指定服務端ip及端口號。
第二步:使用ConnectionFactory對象創建一個Connection對象。
第三步:開啟連接,調用Connection對象的start方法。
第四步:使用Connection對象創建一個Session對象。
第五步:使用Session對象創建一個Destination對象(topic、queue),此處創建一個Queue對象。
第六步:使用Session對象創建一個Producer對象。
第七步:創建一個Message對象,創建一個TextMessage對象。
第八步:使用Producer對象發送消息。
第九步:關閉資源。
package cn.e3mall.activemq;import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory; import org.junit.Test;public class ActiveMqTest {@Testpublic void testQueueProducer() throws Exception {// 第一步:創建ConnectionFactory對象,需要指定服務端ip及端口號。//brokerURL服務器的ip及端口號ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");// 第二步:使用ConnectionFactory對象創建一個Connection對象。Connection connection = connectionFactory.createConnection();// 第三步:開啟連接,調用Connection對象的start方法。 connection.start();// 第四步:使用Connection對象創建一個Session對象。//第一個參數:是否開啟事務。true:開啟事務,第二個參數忽略。//第二個參數:當第一個參數為false時,才有意義。消息的應答模式。1、自動應答2、手動應答。一般是自動應答。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session對象創建一個Destination對象(topic、queue),此處創建一個Queue對象。//參數:隊列的名稱。Queue queue = session.createQueue("test-queue");// 第六步:使用Session對象創建一個Producer對象。MessageProducer producer = session.createProducer(queue);// 第七步:創建一個Message對象,創建一個TextMessage對象。/*TextMessage message = new ActiveMQTextMessage();message.setText("hello activeMq,this is my first test.");*/TextMessage textMessage = session.createTextMessage("hello activeMq,this is my first test.");// 第八步:使用Producer對象發送消息。 producer.send(textMessage);// 第九步:關閉資源。 producer.close();session.close();connection.close();}}12.1.2.??? Consumer
消費者:接收消息。
第一步:創建一個ConnectionFactory對象。
第二步:從ConnectionFactory對象中獲得一個Connection對象。
第三步:開啟連接。調用Connection對象的start方法。
第四步:使用Connection對象創建一個Session對象。
第五步:使用Session對象創建一個Destination對象。和發送端保持一致queue,并且隊列的名稱一致。
第六步:使用Session對象創建一個Consumer對象。
第七步:接收消息。
第八步:打印消息。
第九步:關閉資源
@Testpublic void testQueueConsumer() throws Exception {// 第一步:創建一個ConnectionFactory對象。ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");// 第二步:從ConnectionFactory對象中獲得一個Connection對象。Connection connection = connectionFactory.createConnection();// 第三步:開啟連接。調用Connection對象的start方法。 connection.start();// 第四步:使用Connection對象創建一個Session對象。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session對象創建一個Destination對象。和發送端保持一致queue,并且隊列的名稱一致。Queue queue = session.createQueue("test-queue");// 第六步:使用Session對象創建一個Consumer對象。MessageConsumer consumer = session.createConsumer(queue);// 第七步:接收消息。consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {try {TextMessage textMessage = (TextMessage) message;String text = null;//取消息的內容text = textMessage.getText();// 第八步:打印消息。 System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}});//等待鍵盤輸入 System.in.read();// 第九步:關閉資源 consumer.close();session.close();connection.close();}12.2. Topic
12.2.1.??? Producer
使用步驟:
第一步:創建ConnectionFactory對象,需要指定服務端ip及端口號。
第二步:使用ConnectionFactory對象創建一個Connection對象。
第三步:開啟連接,調用Connection對象的start方法。
第四步:使用Connection對象創建一個Session對象。
第五步:使用Session對象創建一個Destination對象(topic、queue),此處創建一個Topic對象。
第六步:使用Session對象創建一個Producer對象。
第七步:創建一個Message對象,創建一個TextMessage對象。
第八步:使用Producer對象發送消息。
第九步:關閉資源。
@Testpublic void testTopicProducer() throws Exception {// 第一步:創建ConnectionFactory對象,需要指定服務端ip及端口號。// brokerURL服務器的ip及端口號ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");// 第二步:使用ConnectionFactory對象創建一個Connection對象。Connection connection = connectionFactory.createConnection();// 第三步:開啟連接,調用Connection對象的start方法。 connection.start();// 第四步:使用Connection對象創建一個Session對象。// 第一個參數:是否開啟事務。true:開啟事務,第二個參數忽略。// 第二個參數:當第一個參數為false時,才有意義。消息的應答模式。1、自動應答2、手動應答。一般是自動應答。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session對象創建一個Destination對象(topic、queue),此處創建一個topic對象。// 參數:話題的名稱。Topic topic = session.createTopic("test-topic");// 第六步:使用Session對象創建一個Producer對象。MessageProducer producer = session.createProducer(topic);// 第七步:創建一個Message對象,創建一個TextMessage對象。/** TextMessage message = new ActiveMQTextMessage(); message.setText(* "hello activeMq,this is my first test.");*/TextMessage textMessage = session.createTextMessage("hello activeMq,this is my topic test");// 第八步:使用Producer對象發送消息。 producer.send(textMessage);// 第九步:關閉資源。 producer.close();session.close();connection.close();}12.2.2.??? Consumer
消費者:接收消息。
第一步:創建一個ConnectionFactory對象。
第二步:從ConnectionFactory對象中獲得一個Connection對象。
第三步:開啟連接。調用Connection對象的start方法。
第四步:使用Connection對象創建一個Session對象。
第五步:使用Session對象創建一個Destination對象。和發送端保持一致topic,并且話題的名稱一致。
第六步:使用Session對象創建一個Consumer對象。
第七步:接收消息。
第八步:打印消息。
第九步:關閉資源
@Testpublic void testTopicConsumer() throws Exception {// 第一步:創建一個ConnectionFactory對象。ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");// 第二步:從ConnectionFactory對象中獲得一個Connection對象。Connection connection = connectionFactory.createConnection();// 第三步:開啟連接。調用Connection對象的start方法。 connection.start();// 第四步:使用Connection對象創建一個Session對象。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session對象創建一個Destination對象。和發送端保持一致topic,并且話題的名稱一致。Topic topic = session.createTopic("test-topic");// 第六步:使用Session對象創建一個Consumer對象。MessageConsumer consumer = session.createConsumer(topic);// 第七步:接收消息。consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {try {TextMessage textMessage = (TextMessage) message;String text = null;// 取消息的內容text = textMessage.getText();// 第八步:打印消息。 System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}});System.out.println("topic的消費端03。。。。。");// 等待鍵盤輸入 System.in.read();// 第九步:關閉資源 consumer.close();session.close();connection.close();}?
總結
問題:linux下ActiveMQ閃退,java.net.UnknownHostException:root
解決:vim /etc/hosts
配置Ip和主機名
?
?
?
轉載于:https://www.cnblogs.com/huozhonghun/p/10071156.html
總結
以上是生活随笔為你收集整理的SSM商城项目(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下安装Firefox中国版解
- 下一篇: 十五周 苏浪浪 201771010120