windows、linux下java连接本地MQ队列实现输入(二)
2017-07-11 17:11
423 查看
上一篇文章环境为windows,这一篇将说一下linux环境下java连接本地队列实现输入输出,其实大同小异,但是八戒在这里有很多心得感悟,想和大家做一分享,八戒将尽全力实现跨系统java远程访问MQ队列实现输入输出,争取下一篇文章快点出炉。(下一篇:客户端windows,服务器端linux)
说到linux,不得不说的就是命令,当然八戒也希望自己将来在linux上有一些建树。哈哈~~,整理一下面部肌肉,言归正传。
系统版本:CentOS
jdk版本:jdk-7u7-linux-i586.tar.gz
MQ版本:MQ_7.5.0.2_TRIAL_LNX_ON_X86_32_ML.tar.gz (版本:7.5)
官网下载地址:https://www.ibm.com/developerworks/cn/downloads/ws/wmq/(90天试用)
第三方工具:SecureCRT(这里给大家推荐一个支持SSH的终端程序,简单的说就是windows下登录linux服务区主机,上传文件很方便)
通过SecureCRT登录linux系统,首先是上传jdk,MQ安装包,默认是放在当前用户/home/用户名 下
点击传输,Zmodem上传列表,选中要上传的文件
确认后,再点击传输,开始Zmodem上传。
jdk安装配置请自行百度(友情提示,环境变量设置完成后,需要运行一下 vim /etc/profile)
在/etc目录下执行命令 ./profile
算了,我还是简单说一下jdk安装吧。
root登录,查看jdk是否安装,如果没有安装先安装jdk
#cd /usr; mkdir java; cd java;
#cp /home/nick/jdk-7u7-linux-i586.tar.gz . (复制gz到当前路径,最后空格后面有个点,表示当前目录)
#tar -zxvf jdk-7u7-linux-i586.tar.gz(解压gz)
配置以下环境
#vim /etc/profile
JAVA_HOME=/usr/java/jdk1.7.0_07
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
完成后执行命令#. /etc/profile
查看jdk是否安装成功
#java -version
下面是MQ安装:
#cd /soft; mkdir mqsoft; cd mqsoft
#tar -zxvf ./MQ_7.5.0.2_TRIAL_LNX_ON_X86_32_ML.tar.gz
#./mqlicense.sh -accept
#rpm -ivh MQSeriesRuntime-7.5.0-2.i386.rpm (安装MQ运行时组件)
# rpm -ivh MQSeriesServer-7.5.0-2.i386.rpm (安装MQ服务器组件)
# rpm -ivh MQSeriesClient-7.5.0-2.i386.rpm (安装MQ客户端组件)
#rpm -ivh MQSeriesJava-7.5.0-2.i386.rpm (安装Java库,这里面提供MQ Java开发相关类库)
# rpm -ivh MQSeriesJRE-7.5.0-2.i386.rpm (安装Java运行时用来运行MQ Java应用)
# rpm -ivh MQSeriesMsg_Zh_CN-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesSamples-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesMan-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesSDK-7.5.0-2.i386.rpm
安装过程中自动创建一个名为mqm的用户和一个同样名为mqm的组,此时,mqm用户是被锁定的,你必须设置一个密码来解锁。
passwd命令可以解决
#passwd 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了!!
当走到这一步你基本上已经完成了一半,如果用爬华山来比拟的话,你已经到达北峰了,哈哈,
说到这我就不得不说一句,八戒曾经爬过两次华山,但是都没有看到日出,所以以后还会去,直到看到日出为止。我这个暴脾气....
切换到mqm用户下
su mqm
创建队列管理器QM_BANANA,并启动
~crtmqm QM_BANANA
~strmqm QM_BANANA
~dspmq 查看所有队列管理器运行状态
下面编写java程序
MQ java应用主要需要包含的jar包,在/opt/mqm/java/lib目录下,具体需要什么可以百度,我是全选。
package cn.shayulajiao.MQ;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
public class JulyTest {
static MQQueueManager qMgr;
static int CCSID = 1381;
static String queueString = "QUEUE1";
public static void connect() throws MQException {
MQEnvironment.hostname = "127.0.0.1";
MQEnvironment.channel = "JAVA.CLIENT.CHANNEL1";
MQEnvironment.port = 1332;
MQEnvironment.CCSID = CCSID;
//MQ中拥有权限的用户名
MQEnvironment.userID = "nick";
//用户名对应的密码
MQEnvironment.password = "123456";
qMgr = new MQQueueManager("QM_BANANA");
}
public static void sendMsg(String msgStr) {
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
MQQueue queue = null;
try {
// 建立Q1通道的连接
queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
MQMessage msg = new MQMessage();// 要写入队列的消息
msg.format = MQC.MQFMT_STRING;
msg.characterSet = CCSID;
msg.encoding = CCSID;
// msg.writeObject(msgStr); //将消息写入消息对象中
msg.writeString(msgStr);
MQPutMessageOptions pmo = new MQPutMessageOptions();
msg.expiry = -1; // 设置消息用不过期
queue.put(msg, pmo);// 将消息放入队列
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (queue != null) {
try {
queue.close();
} catch (MQException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void receiveMsg() {
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
MQQueue queue = null;
try {
queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
System.out.println("该队列当前的深度为:" + queue.getCurrentDepth());
System.out.println("===========================");
int depth = queue.getCurrentDepth();
// 将队列的里的消息读出来
while (depth-- > 0) {
MQMessage msg = new MQMessage();// 要读的队列的消息
MQGetMessageOptions gmo = new MQGetMessageOptions();
queue.get(msg, gmo);
System.out.println("消息的大小为:" + msg.getDataLength());
System.out.println("消息的内容:\n" + msg.readStringOfByteLength(msg.getDataLength()));
System.out.println("---------------------------");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (queue != null) {
try {
queue.close();
} catch (MQException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws MQException {
connect();
sendMsg("hello world");
sendMsg("同是天涯沦落人,相逢何必曾相识");
receiveMsg();
}
}
当走到这一步的时候,你基本已经到金锁关了, 马上登顶!!!!!!!!!!!!!!!!!
如果你看到了这个结果,恭喜你,成功登顶了!!!!!!!!!!!!!!!!!!!!!!
如果报错,可以参考上一篇windows环境错误解决办法。
如果报错显示未找到远程通道,那就是你的通道名字写错了,好像不区分
如果报错显示未找到队列,同样是你的队列名字写错了,一定区分大小写(你要是创建时写小写,MQ会为你转换为大写)
上面是我遇到的一些问题,当然还有未遇到的,应该还会在更新一篇远程访问MQ,不要着急,耐心等待....
最后我总结一下,最近这几天学IBM MQ的心得体会,供大家参考:(这时候我就要翻开我的死亡小笔记,看看)
就以常用命令起手:
crtmqm -q qMgrName 创建队列管理器
strmqm -q qMgrName 启动
dltmqm -q qMgrName 删除
endmqm -i qMgrName 立即停止
endmqm -p qMgrName 强制停止
dspmq 显示队列管理器
/opt/mqm/samp/bin/amqsput Qname qMgrName 往队列中放消息
/opt/mqm/samp/bin/amqsget Qname qMgrName 从队列中取消息
(如果提示未找到amqsput命令,环境变量配置以下,同jdk)
runmqsc qMgrName 运行MQSeries命令
~dis qmgr 显示全信息
~dis channel(*)
~dis queue(*)
~dis ql('队列名') curdepth
给已有的用户添加工作组
usermod -G groupname username
groupmod -n mqm nick
查看用户属于什么组
groups 用户名
注:你的用户名必须要是mqm组的用户
暂时就这么多,以后有什么需要补充的,后续跟上...........................................................................
说到linux,不得不说的就是命令,当然八戒也希望自己将来在linux上有一些建树。哈哈~~,整理一下面部肌肉,言归正传。
系统版本:CentOS
jdk版本:jdk-7u7-linux-i586.tar.gz
MQ版本:MQ_7.5.0.2_TRIAL_LNX_ON_X86_32_ML.tar.gz (版本:7.5)
官网下载地址:https://www.ibm.com/developerworks/cn/downloads/ws/wmq/(90天试用)
第三方工具:SecureCRT(这里给大家推荐一个支持SSH的终端程序,简单的说就是windows下登录linux服务区主机,上传文件很方便)
通过SecureCRT登录linux系统,首先是上传jdk,MQ安装包,默认是放在当前用户/home/用户名 下
点击传输,Zmodem上传列表,选中要上传的文件
确认后,再点击传输,开始Zmodem上传。
jdk安装配置请自行百度(友情提示,环境变量设置完成后,需要运行一下 vim /etc/profile)
在/etc目录下执行命令 ./profile
算了,我还是简单说一下jdk安装吧。
root登录,查看jdk是否安装,如果没有安装先安装jdk
#cd /usr; mkdir java; cd java;
#cp /home/nick/jdk-7u7-linux-i586.tar.gz . (复制gz到当前路径,最后空格后面有个点,表示当前目录)
#tar -zxvf jdk-7u7-linux-i586.tar.gz(解压gz)
配置以下环境
#vim /etc/profile
JAVA_HOME=/usr/java/jdk1.7.0_07
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
完成后执行命令#. /etc/profile
查看jdk是否安装成功
#java -version
下面是MQ安装:
#cd /soft; mkdir mqsoft; cd mqsoft
#tar -zxvf ./MQ_7.5.0.2_TRIAL_LNX_ON_X86_32_ML.tar.gz
#./mqlicense.sh -accept
#rpm -ivh MQSeriesRuntime-7.5.0-2.i386.rpm (安装MQ运行时组件)
# rpm -ivh MQSeriesServer-7.5.0-2.i386.rpm (安装MQ服务器组件)
# rpm -ivh MQSeriesClient-7.5.0-2.i386.rpm (安装MQ客户端组件)
#rpm -ivh MQSeriesJava-7.5.0-2.i386.rpm (安装Java库,这里面提供MQ Java开发相关类库)
# rpm -ivh MQSeriesJRE-7.5.0-2.i386.rpm (安装Java运行时用来运行MQ Java应用)
# rpm -ivh MQSeriesMsg_Zh_CN-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesSamples-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesMan-7.5.0-2.i386.rpm
# rpm -ivh MQSeriesSDK-7.5.0-2.i386.rpm
安装过程中自动创建一个名为mqm的用户和一个同样名为mqm的组,此时,mqm用户是被锁定的,你必须设置一个密码来解锁。
passwd命令可以解决
#passwd 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了!!
当走到这一步你基本上已经完成了一半,如果用爬华山来比拟的话,你已经到达北峰了,哈哈,
说到这我就不得不说一句,八戒曾经爬过两次华山,但是都没有看到日出,所以以后还会去,直到看到日出为止。我这个暴脾气....
切换到mqm用户下
su mqm
创建队列管理器QM_BANANA,并启动
~crtmqm QM_BANANA
~strmqm QM_BANANA
~dspmq 查看所有队列管理器运行状态
启动脚本执行器,进行设置 ~ runmqsc QM_BANANA 输入: DEFINE QLOCAL(QUEUE1) 创建本地队列QUEUE1 授权nick用户使用队列QUEUE1,其中PROFILE是对该条记录进行命名,PRINCIPAL指定特定用户,表明权限授权某用户。 SET AUTHREC PROFILE(QUEUE1) OBJTYPE(QUEUE) PRINCIPAL('nick') AUTHADD(PUT,GET) 授权用户nick可以连接队列管理器 SET AUTHREC OBJTYPE(QMGR) PRINCIPAL('nick') AUTHADD(CONNECT) 定义服务器连接通道 DEFINE CHANNEL(JAVA.CLIENT.CHANNEL1) CHLTYPE(SVRCONN) TRPTYPE(TCP) 授权MQ客户端可以连接上面定义的通道,通过ip地址和用户名方式授权 SET CHLAUTH(JAVA.CLIENT.CHANNEL1) TYPE(ADDRESSMAP) ADDRESS('127.0.0.1') MCAUSER('nick') 定义监听器,接受连接 DEFINE LISTENER(JAVA.CLIENT.LISTENER1) TRPTYPE(TCP) CONTROL(QMGR) PORT(1332) 启动: START LISTENER(JAVA.CLIENT.LISTENER1) 结束: end
下面编写java程序
MQ java应用主要需要包含的jar包,在/opt/mqm/java/lib目录下,具体需要什么可以百度,我是全选。
package cn.shayulajiao.MQ;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
public class JulyTest {
static MQQueueManager qMgr;
static int CCSID = 1381;
static String queueString = "QUEUE1";
public static void connect() throws MQException {
MQEnvironment.hostname = "127.0.0.1";
MQEnvironment.channel = "JAVA.CLIENT.CHANNEL1";
MQEnvironment.port = 1332;
MQEnvironment.CCSID = CCSID;
//MQ中拥有权限的用户名
MQEnvironment.userID = "nick";
//用户名对应的密码
MQEnvironment.password = "123456";
qMgr = new MQQueueManager("QM_BANANA");
}
public static void sendMsg(String msgStr) {
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
MQQueue queue = null;
try {
// 建立Q1通道的连接
queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
MQMessage msg = new MQMessage();// 要写入队列的消息
msg.format = MQC.MQFMT_STRING;
msg.characterSet = CCSID;
msg.encoding = CCSID;
// msg.writeObject(msgStr); //将消息写入消息对象中
msg.writeString(msgStr);
MQPutMessageOptions pmo = new MQPutMessageOptions();
msg.expiry = -1; // 设置消息用不过期
queue.put(msg, pmo);// 将消息放入队列
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (queue != null) {
try {
queue.close();
} catch (MQException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void receiveMsg() {
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
MQQueue queue = null;
try {
queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
System.out.println("该队列当前的深度为:" + queue.getCurrentDepth());
System.out.println("===========================");
int depth = queue.getCurrentDepth();
// 将队列的里的消息读出来
while (depth-- > 0) {
MQMessage msg = new MQMessage();// 要读的队列的消息
MQGetMessageOptions gmo = new MQGetMessageOptions();
queue.get(msg, gmo);
System.out.println("消息的大小为:" + msg.getDataLength());
System.out.println("消息的内容:\n" + msg.readStringOfByteLength(msg.getDataLength()));
System.out.println("---------------------------");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (queue != null) {
try {
queue.close();
} catch (MQException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws MQException {
connect();
sendMsg("hello world");
sendMsg("同是天涯沦落人,相逢何必曾相识");
receiveMsg();
}
}
当走到这一步的时候,你基本已经到金锁关了, 马上登顶!!!!!!!!!!!!!!!!!
如果你看到了这个结果,恭喜你,成功登顶了!!!!!!!!!!!!!!!!!!!!!!
如果报错,可以参考上一篇windows环境错误解决办法。
如果报错显示未找到远程通道,那就是你的通道名字写错了,好像不区分
如果报错显示未找到队列,同样是你的队列名字写错了,一定区分大小写(你要是创建时写小写,MQ会为你转换为大写)
上面是我遇到的一些问题,当然还有未遇到的,应该还会在更新一篇远程访问MQ,不要着急,耐心等待....
最后我总结一下,最近这几天学IBM MQ的心得体会,供大家参考:(这时候我就要翻开我的死亡小笔记,看看)
就以常用命令起手:
crtmqm -q qMgrName 创建队列管理器
strmqm -q qMgrName 启动
dltmqm -q qMgrName 删除
endmqm -i qMgrName 立即停止
endmqm -p qMgrName 强制停止
dspmq 显示队列管理器
/opt/mqm/samp/bin/amqsput Qname qMgrName 往队列中放消息
/opt/mqm/samp/bin/amqsget Qname qMgrName 从队列中取消息
(如果提示未找到amqsput命令,环境变量配置以下,同jdk)
runmqsc qMgrName 运行MQSeries命令
~dis qmgr 显示全信息
~dis channel(*)
~dis queue(*)
~dis ql('队列名') curdepth
给已有的用户添加工作组
usermod -G groupname username
groupmod -n mqm nick
查看用户属于什么组
groups 用户名
注:你的用户名必须要是mqm组的用户
暂时就这么多,以后有什么需要补充的,后续跟上...........................................................................
相关文章推荐
- windows、linux下java连接本地MQ队列实现输入
- 在 Windows 中实现 Java 本地方法
- 通过Windows Azure Connect ,实现本地机器与Windows Azure 虚拟机的相互连接(转+译)
- tightvnc实现windows远程连接控制linux主机
- 在 Windows 中实现 Java 本地方法
- 在 Windows 中实现 Java 本地方法
- 在Windows中实现Java本地方法(JNI) - JMeteor????S Blog - CSDNBlog
- JAVA分别实现Windows平台和Linux平台下的ip获取
- 实现Windows远程连接Linux系统通过telnet连接通讯
- linux下实现java的本地方法调用
- 用vnc实现windows远程连接linux桌面
- 通过Windows Azure Connect ,实现本地机器与Windows Azure 虚拟机的相互连接(转+译)
- Delphi实现WINDOWS“本地连接”的启用和禁用
- Windows 中实现 Java 本地方法
- Java调用C(Linux下实现Java本地方法)
- 通过Windows Azure Connect ,实现本地机器与Windows Azure 虚拟机的相互连接(转+译)
- 用vnc实现windows远程连接linux桌面
- 分享一个基于java ArrayList的简单MQ队列,用在连接多个蓝牙设备一个一个连接的应用中
- Chap10:在 Windows 中实现 Java 本地方法