代码改变世界

activemq及activemq-cpp 编译安装

2013-06-08 16:47  airsong  阅读(3648)  评论(0编辑  收藏  举报

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)