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鎖實現的功能是相同。