A. 使用ibm MQ 在java类中报: NoClassDefFoundError:com/ibm/mq/headers/internal/trace/Names
1.相关jar包:
com.ibm.mq.commonservices.jar
com.ibm.mq.headers.jar
com.ibm.mq.jar
com.ibm.mq.jmqi.jar
connector.jar
junit-4.4.jar
相关jar可以在ibm mq的安装目录下找到:
2.在mq服务器上创建相应的队列管理器,和队列,以及服务器传输通道。附上操作命令:
--启动队列管理器
strmqm QMEMBFE
--启动监听
runmqlsr -m QMEMBFE -p 1414 -t tcp &
--用户交互管理界面程序
runmqsc QMEMBFE
--创建本地队列
DEFINE QLOCAL (Q1)
--创建名称为DC.SVRCONN的服务器连接通道
DEFINE CHANNEL(DC.SVRCONN) CHLTYPE (SVRCONN) REPLACE
--删除通道
DELETE CHANNEL(DC.SVRCONN)
3.使用java编写调用程序:
运行方法:单元测试运行:testMQ
MessageByMQ
[java]view plain
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importcom.ibm.mq.MQC;
importcom.ibm.mq.MQEnvironment;
importcom.ibm.mq.MQException;
importcom.ibm.mq.MQGetMessageOptions;
importcom.ibm.mq.MQMessage;
importcom.ibm.mq.MQPutMessageOptions;
importcom.ibm.mq.MQQueue;
importcom.ibm.mq.MQQueueManager;
/**
*列出常用的错误码:如下:
*2540:通道定义有错误:</p>
*解决方式如下:</p>
*1.进入用户交互界面:runmqscQMEMBFE(QMEMBFE为队列管理器名称)
*2.创建相应的服务器连接通道:DEFINECHANNEL(DC.SVRCONN)CHLTYPE(SVRCONN)REPLACE
*2035:授权相关错误:解决方式如下:
*进入用户交互界面:(同上):
*ALTERCHANNEL(DC.SVRCONN)CHLTYPE(SVRCONN)MCAUSER('mqm')
*说明:DC.SVRCONN服务器连接通道名称mqm为ibmmq用户名称
*
*
*
*
*@authorkefan
*
*/
publicclassMessageByMQ{
/**
*队列管理器的名称
*/
privateStringqManagerName="QMEMBFE";
/**
*队列管理器
*/
privateMQQueueManagerqMgr;
/**
*队列名称
*/
privateStringqueueName="Q1";
/**
*队列
*/
privateMQQueueqQueue;
/**
*mq服务器所在的主机名称
*/
privateStringhostname="192.168.233.134";
/**
*服务器连接通道名称
*/
privateStringchannelName="DC.SVRCONN";
/**
*监听器监听的端口
*/
privateintport=1414;
/**
*传输的编码类型
*/
privateintCCSID=1381;
@Before
publicvoidinit(){
try{
MQEnvironment.hostname=this.hostname;//安装MQ所在的ipaddress
MQEnvironment.port=this.port;//TCP/IPport
MQEnvironment.channel=this.channelName;
MQEnvironment.CCSID=CCSID;
qMgr=newMQQueueManager(this.qManagerName);
intqOptioin=MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_INQUIRE
|MQC.MQOO_OUTPUT;
qQueue=qMgr.accessQueue(queueName,qOptioin);
}catch(MQExceptione){
e.printStackTrace();
}
}
/**
*发送信息
*/
publicvoidSendMsg(byte[]qByte){
try{
MQMessageqMsg=newMQMessage();
qMsg.write(qByte);
MQPutMessageOptionspmo=newMQPutMessageOptions();
qQueue.put(qMsg,pmo);
System.out.println("Themessageissent!");
System.out.println(" Themessageis"+newString(qByte,"GBK"));
}catch(MQExceptione){
e.printStackTrace();
System.out
.println("AWebSphereMQerroroccurred:Completioncode"
+e.completionCode+"ReasonCodeis"
+e.reasonCode);
}catch(java.io.IOExceptione){
e.printStackTrace();
System.out
.println(""
+e);
}
}
/**
*从消息队列取数据
*/
publicvoidGetMsg(){
try{
MQMessageretrievedMessage=newMQMessage();
MQGetMessageOptionsgmo=newMQGetMessageOptions();
gmo.options+=MQC.MQPMO_SYNCPOINT;
qQueue.get(retrievedMessage,gmo);
intlength=retrievedMessage.getDataLength();
byte[]msg=newbyte[length];
retrievedMessage.readFully(msg);
StringsMsg=newString(msg,"GBK");
System.out.println(sMsg);
}catch(RuntimeExceptione){
e.printStackTrace();
}catch(MQExceptione){
e.printStackTrace();
if(e.reasonCode!=2033)//没有消息
{
e.printStackTrace();
System.out
.println("AWebSphereMQerroroccurred:Completioncode"
+e.completionCode
+"ReasonCodeis"
+e.reasonCode);
}
}catch(java.io.IOExceptione){
System.out
.println(""
+e);
}
}
/**
*单元测试方法
*/
@Test
publicvoidtestMQ(){
MessageByMQmqst=newMessageByMQ();
mqst.init();
try{
mqst.SendMsg("你好,WebshpereMQ7.5!".getBytes("GBK"));
mqst.GetMsg();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*释放资源
*/
@After
publicvoidrelease(){
try{
qQueue.close();
qMgr.disconnect();
}catch(MQExceptione){
System.out
.println("AWebSphereMQerroroccurred:Completioncode"
+e.completionCode+"ReasonCodeis"
+e.reasonCode);
}
}
}
B. linux系统如何启动mq
开篇之前奉上几条黄金链接:
MQ参考文档
http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic=%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htm
http://www-01.ibm.com/support/docview.wss?uid=swg27006467
MQ下载地址:http://www-03.ibm.com/software/procts/us/en/wmq/
安装的MQ软件包为WMQv600Trial-x86_linux_2.tar.gz. 将WMQv600Trial-x86_linux_2.tar.gz解压至某一目录。
(1)执行接受许可脚本: ./mqlicense.sh –accept 这个脚本是要安装WebSphere MQ 软件包的MQ许可程序. 至关重要,这个脚本没有正确配置的话将导致MQ安装失败.–accept是不启动图形直接接受许可。
(2) 安装 WebSphere MQ for Linux 服务器:
[root@localhost mq]# rpm-ivh MQSeriesRuntime-6.0.0-0.i386.rpm
[root@localhost mq]# rpm-ivh MQSeriesSDK-6.0.0-0.i386.rpm
[root@localhost mq]# rpm-ivh MQSeriesServer-6.0.0-0.i386.rpm
注:安装完成后,相关文件会被自动安装在/opt/mqm下,在安装
MQSeriesRuntime-6.0.0-0.i386.rpm时候,安装程序为系统自动创建了一个mqm用户和mqm组,安装完毕后,需要使用该用户来进行MQ的配置。
(3) 安装 WebSphere MQ for Linux 客户端:
[root@localhost mq]# rpm-ivh MQSeriesClient-6.0.0-0.i386.rpm
(4) 安装 WebSphere MQ 样本程序(其中包括amqsput、amqsget、amqsgbr和amqsbcg等)
[root@localhost mq]# rpm-ivh MQSeriesSamples-6.0.0-0.i386.rpm 样本程序安装在/opt/mqm/samp/bin 中。
(5)安装MQ其他软件包
[root@localhost mq]# rpm-ivh MQSeriesMan-6.0.0-0.i386.rpm
[root@localhost mq]# rpm-ivh MQSeriesJava-6.0.0-0.i386.rpm
[root@localhost mq]# rpm-ivh IBMJava2-SDK-1.4.2-0.0.i386.rpm
上面最后一步安装的是JDK运行环境,如果已经有相同或更高版本的JDK,不需要再安装。 (6) 安装过程创建了一个名为mqm 的用户和一个同样名为mqm 的组,此时,新用户是被锁定的,必须设置一个密码来解锁,这样才能正常使用该用户。用passwd 命令:
[root@localhost mq]# passwd mqm 以上操作均在root用户下操作,至此MQ6.0安装结束。MQ的配置相关命令操作均在mqm用户下。
注意:
如果执行crtmqm命令时提示
-bash-3.2$ crtmqm
-bash: crtmqm: command not found
则需要配置mqm用户的环境变量,编辑如下文件,并添加下面的内容,如下:
第一种方法: 相对第二种较安全 仅对 mqm用户有效
1)-bash-3.2$ vi /var/mqm/.bash_profile
PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin
2)执行“.”命令,使这个文件生效
-bash-3.2$ . .bash_profile
3)再次尝试实行crtmqm或是dspmqm命令,即可发现已经生效。
第二种方法:
1、su root
2、vim /etc/profile
3、在最后面加上:PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin
4、关闭远程终端重新打开,无需重启服务器
5、ok了!!
了解更多开源相关,去LUPA社区看看吧。
C. 使用endmqm 命令无法停止MQ队列管理器,怎么办
一、WebSphere MQ命令行命令
1、停止队列管理器
endmqm [-z] [([-c | -w | -i | -p] [-r] [-s]) | -x] QMgrName
endmqm mqm_name 使用默认选项停止队列管理器需要等待当前的应用连接完成并断开。
-i 立即停止队列管理器。
-w 需要等待所有的应用停止以后才会真正关闭队列管理器
-p 使用以上参数都无法正常停止队列管理器的情况下可以使用该参数
2、启动队列管理器
strmqm [-z] [-a | -c | -r | -x] [-d none|minimal|all] [-f] [-ns] QMgrName
队列管理器必须在完全停止时才能被启动。
3、创建队列管理器
crtmqm [-z] [-q] [-c Text] [-d DefXmitQ] [-h MaxHandles]
[-md DataPath] [-g ApplicationGroup]
[-t TrigInt] [-u DeadQ] [-x MaxUMsgs] [-lp LogPri] [-ls LogSec]
[-lc | -ll] [-lf LogFileSize] [-ld LogPath] QMgrName
队列管理器名大小写敏感且不支持空字符串,长度为48字节,同一网络中不能有重名。
创建队列管理器的时侯最好创建死信队列用于存放无法发送的信息,保证通道不会因为无法发送信息而被关闭。
crtmqm -u deadq_name mqm_name
4、删除队列管理器
dltmqm [-z] QMgrName
删除队列管理器会完全删除其所拥有的对象和相关信息,并且是不可恢复的。要删除一个队列管理器首先要保证他是停止的。
二、WebSphere MQ Script. (MQSC) commands
WebSphere MQ Script. (MQSC) commands是常常用来管理队列管理器对象的。这些对象包括队列管理器本身,队列,名称列表,通道,客户端通道,监听,服务等。使用runmqsc 队列管理名来启动,可以运行单个的命令,也可以通过命令集的脚本来运行。
本地队列管理器的作用是接收远程或本地的信息流,并将本地队列中的信息流取出以供应用程序使用。在做这些工作之前需要定义相关的队列管理器,队列和通道等,而这些工作是由WebSphere MQ Script. (MQSC) commands来完整的。在Windows及Linux环境下也可以通过WebSphere MQ Explorer来完成。
启动WebSphere MQ Script. (MQSC) :runmqsc [-e] [-v] [-w WaitTime [-x] [-m LocalQMgrName]] [QMgrName]
runmqsc mqm_name。通过命令runmqsc启动队列管理器的命令服务器。WebSphere MQ Explorer也能完成相同的任务。runmqsc的相关命令有三种运行方式,Verify a command without running it,Run a command on a local queue manager,Run a command on a remote queue manager。runmqsc的相关命令在解释的时候都会以大写来解释,比如DEFINE,ALTER,RESET等。但是这些命令并不是大小写敏感的。每行runmqsc命令最长只能到8个字符,可以通过-或者+连接下一行,-是从下一行的第一个字符开始,+是从下一行的第一个非空字符开始。而且所有命令与平台无关。runmqsc的标准输入是键盘,标准输出时屏幕,我们可以通过<,>重定向。例如从脚本输入命令runmqsc </path/filename.in,将结果重定向到文件runmqsc>/path/filename.out。
1、显示队列管理器属性(DISPLAY QMGR):
DISPLAY QMGR显示当前队列管理器的所有属性,也可以使用DISPLAY QMGR 属性名,单独查看当前队列管理器的某个特定属性。
2、 更改队列管理器属性(ALTER QMGR ):
ALTER QMGR 用于更改队列管理器的相关属性,例如 ALTER QMGR MAXHANDS(255),这个命令将默认队列管理器的MAXHANDS由256更改为255。
3、创建本地队列(DEFINE QLOCAL ):
DEFINE QLOCAL Q_LOCAL_NAME,在创建队列的时候可以定义相关属性的值,如果没有定义则使用默认值。也可以全部使用默认值,最后通过ALTER QLOCAL命令来修改相关属性。在同一个队列管理器中不能有同名的队列,可以使用REPLACE关键字重建已有的队列。
4、修改本地队列属性(ALTER QLOCAL):
ALTER QLOCAL Q_LOCAL_NAME NEW_ATTRIBUTE。已经定义了的本地队列可以使用ALTER QLOCAL 命令对其属性进行修改。
5、显示本地队列属性(DISPLAY QLOCAL):
DISPLAY QLOCAL Q_LOCAL_NAME ATTRIBUTE。此命令用于显示本地队列的属性,可以使用默认的显示全部属性,也可以显示指定的属性。
6、复制本地队列(DEFINE QLOCAL NEW LIKE OLD):
DEFINE QLOCAL NEW LIKE OLD。此命令可以创建一个属性与OLD完全一样的本地队列。当然,我们也可以在语句后面指定属性的详细信息,没有指定的则继承OLD的对应属性,指定了的则使用新的属性。
7、清除本地队列中的消息(CLEAR QLOCAL):
CLEAR QLOCAL Q_LOCAL_QUEUE。此命令用于清除本地队列中存储的信息。在清除信息的时候系统不会给出任何提示,而是直接把信息删除。在一下两种情况下不能使用CLEAR QLOCAL,本地队列中存储的有在最近一次队列同步以后未提交的信息,有应用程序打开使用本地此队列。
8、删除本地队列(DELETE QLOCAL):
DELETE QLOCAL Q_LOCAL_QUEUE。此命令用于删除本地队列,当本地队列中存在有没有提交的数据此队列不能删除。如果队列中存在数据,且数据是提交了的,可以使用PURGE关键字删除本地队列。例如DELETE QLOCAL (Q_LOCAL_QUEUE) PURGE,在删除的时候可以指定NOPURGE关键字代替PURGE以保护删除的队列中可能存在的已提交数据。
三、PCF commands
PCF commands允许管理员通过编程的方式将MQ的日常管理任务集成在程序中。包括创建队列,预定义队列,更改队列管理器等, PCF commands与MQSC锁实现的功能是相同。