activemq及activemq-cpp 編譯安裝


hp-ux平台安裝ActiveMQ及ActiveMQ客戶端安裝步驟及過程

####################################################################################

#ActiveMQ服務端安裝(系統已安裝JAVA_SDK並已導出JAVA_HOME環境變量)
1.下載
Apache官網下載ActiveMQ(具體鏈接請google)

2.解壓
將下載下來的apache-activemq-5.7.0-bin.tar.gz放置在你想要安裝的目錄
gunzip apache-activemq-5.7.0-bin.tar.gz
tar -vxf apache-activemq-5.7.0-bin.tar

linux下可以直接 tar xvfz apache-activemq-5.7.0-bin.tar.gz

3.修改activemq運行文件的權限
cd /opt/app/apache-activemq-5.7.0/bin
chmod 755 activemq

4.運行
activemq start

6.關閉
activemq stop

7.端口狀態查看處於LISTEN狀態:
failover連接端口: netstat -an|grep 61616
控制台端口: netstat -an|grep 8161

####################################################################################
#activemq-cpp客戶端編譯安裝
1.下載以下組件
activemq-cpp-library-3.6.0-src.tar.gz
apr-1.4.6.tar.gz
apr-util-1.5.2.tar.gz
cppunit-1.12.1.tar.gz
openssl-1.0.1e.tar.gz(這個hp-ux下已有,可以不安裝)


2.解壓文件
gunzip activemq-cpp-library-3.6.0-src.tar.gz
tar -vxf activemq-cpp-library-3.6.0-src.tar

gunzip apr-1.4.6.tar.gz
tar -vxf apr-1.4.6.tar

gunzip apr-util-1.5.2.tar.gz
tar -vxf apr-util-1.5.2.tar

gunzip cppunit-1.12.1.tar.gz
tar -vxf cppunit-1.12.1.tar

3.編譯
AMQ_HOME為activemq-cpp的安裝目錄,根據實際情況設置

cd cppunit-1.12.1
./configure CC=aCC CFLAGS="+DD64 -mt -AA -g +z +d" LDFLAGS="+DD64 -mt -AA -g +z +d" CXX=aCC CXXFLAGS="+DD64 -mt -AA -g +z +d" --prefix=$(AMQ_HOME)
make
make install

cd apr-1.4.6
./configure CC=aCC CFLAGS="+DD64 -mt -AA -g +z +d" LDFLAGS="+DD64 -mt -AA -g +z +d" CXX=aCC CXXFLAGS="+DD64 -mt -AA -g +z +d" --prefix=$(AMQ_HOME)
make
make install

cd apr-util-1.5.2/xml/expat
./configure CC=aCC CFLAGS="+DD64 -mt" LDFLAGS="+DD64 -mt" CXX=aCC CXXFLAGS="+DD64 -mt" --prefix=$(AMQ_HOME)
make
make install

cd apr-util-1.5.2
./configure CC=aCC CFLAGS="+DD64 -mt -AA -g +z +d" LDFLAGS="+DD64 -mt -AA -g +z +d" CXX=aCC CXXFLAGS="+DD64 -mt -AA -g +z +d" --prefix=$(AMQ_HOME) --with-apr=$(AMQ_HOME) --with-expat=$(AMQ_HOME)
make
make install

cd activemq-cpp-library-3.6.0
iconv -f utf8 -t gb18030 configure >configure2
chmod 755 configure2
./configure CC=aCC CFLAGS="+DD64 -AA -mt -g +z +d" LDFLAGS="+DD64 -AA -mt -g +z +d" CXX=aCC CXXFLAGS="+DD64 -AA -mt -g +z +d" --prefix=$(AMQ_HOME) --with-cppunit=$(AMQ_HOME) --with-apr=$(AMQ_HOME) --with-apr-util=$(AMQ_HOME) --with-expat=$(AMQ_HOME)
make
make install

安裝完成后
$(AMQ_HOME)/include 存放了所有相關的頭文件(包括activemq-cpp-3.6.0,cppunit,apr-1,expat)
$(AMQ_HOME)/lib 存放了所有相關的.a,.so文件(包括libactivemq-cpp.so libapr-1.so libaprutil-1.so libcppunit.so libexpat.so)

####################################################################################
#安裝過程中可能遇到的問題
1.make activemq-cpp時,會提示文件無法編譯,無法生成目標文件。
原因及解決:
hp-ux下的tar解包是,會對文件名截取(相關文檔說明最長才預留100BYTES。。。),導致長文件名解包不正確。此時需要在windows平台解壓出來以后復制這些文件名至hp-ux機器的相應目錄。
2.編譯activemq-cpp-library-3.6.0時提示:Invalid multibyte character.
原因及解決:
此次下載的activemq-cpp-library-3.6.0的configure文件為utf8格式(命令行:iconv -f utf8 -to ./configure >./configure2),需要轉換成gbk格式才可以運行。(當然,你也可以通過改變當前語言環境變量等其他方法)
3.鏈接xml解析庫expat.so時沖突。
如果編譯的機器預裝的其他軟件有expat.so之類的庫,在編譯apr-util時必須明確指定expat包路徑(--with-expat=$PATH),否則在生成apr-util.so文件正常,但鏈接activemq-cpp會沖突提示符號信息不匹配。

4.安裝以后,運行自帶樣例程序立即dump掉
原因及解決:
經過gdb程序以后,發現在生成UUID時core掉,最后調用的一個函數是sprintf。此函數apache的apr包有實現,換成apr_snprintf函數或者拷貝linux內核的sprintf函數,稍改一下,OK,重新編譯就可以了。(還是改成apr_函數快速簡單).
樣例程序中發送/接收者的回調函數里面也同樣需要替換printf/fprintf等的相關函數,或者注釋。此原因與文檔中提到apache在apr中有對相關函數hack有關。

###################################################################################

#常用函數代碼

 

//初始化/反初始化

activemq::library::ActiveMQCPP::initializeLibrary();

activemq::library::ActiveMQCPP::shutdownLibrary();

//連接brokerURI
auto_ptr<ActiveMQConnectionFactory> connectionFactory(new ActiveMQConnectionFactory());
connection = connectionFactory->createConnection(brokerURI, sUsr, sPwd, sCltId);
connection->start();

 

//斷開連接

connection->close();

delete connection;

 

//異常
catch ( CMSException& e )
{
e.printStackTrace();
connection = NULL;
//string sErr = e.getMessage();
}


//收文本消息
session = connection->createSession(Session::AUTO_ACKNOWLEDGE);//CLIENT_ACKNOWLEDGE
destination = session->createQueue(sQueue);
consumer = session->createConsumer(destination);
Message *message = consumer->receive(100);//wait 100ms
const TextMessage* textMessage = dynamic_cast< const TextMessage* >( message );
string sMsg = textMessage->getText();
delete message;
delete consumer;
delete destination;
session->close();
delete session;

//發文本消息
session = connection->createSession(Session::AUTO_ACKNOWLEDGE);//CLIENT_ACKNOWLEDGE
destination = session->createQueue(sQueue);
producer = session->createProducer(destination);
//producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);//默認非持久化
TextMessage *message = session->createTextMessage();
message->setText(sMsg);
producer->send(message);
//默認為非持久化,優先級4,永久存活
//producer->send(message, DeliveryMode::NON_PERSISTENT, Message::DEFAULT_MSG_PRIORITY, Message::DEFAULT_TIME_TO_LIVE);
delete message;
delete producer;
delete destination;
session->close();
delete session;

 

//連接中遇到的問題

1.failover:(tcp://127.0.0.1:61616)采用次種方式連接時,程序一直在連接,不報異常。

解決方法:不用failover協議。改成tcp://127.0.0.1:61616即可(默認openwire)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM