
开发四年只会写业务代码ibm websphere mq (1cpu),分布式高并发都不会还做程序员?->>>
最近的程序仍然在和websphere mq打交道,但是碰到这些疑问,网上查资料几乎查不到什么结果。。。主要有一下几个问题,求大神来解答
1、事务

我看有一些实例,比如《IBM WebSphere MQ基础教程》这本书中,无论是往mq放消息而是取消息都调用了qMgr.commit(),而网上一些实例都没有调用该方式。所以什么时候该用,什么时候不用?

2、多线程访问mq

未充分利用CPU提升效益,应用是多线程的。多个泛型同时访问一个队列从上面更改息会有问题吗?还是《IBM WebSphere MQ基础教程》这本书里有那么一段话:

但是,从网上某篇博客中又看见这样一句话:


我对访问mq的操作作了一个封装类MQGet,使用了单例。。。。应用是一个web应用ibm websphere mq (1cpu),在servlet的init方法中先读取MQGet.getInstance().conn(),这样应用推进时就确立了联结;然后在进入的N多个线程中都调用MQGet.getInstance().getMsg()来取队列消息;在servlet的destroy方法中读取MQGet.getInstance().close()来关闭连接。
不知道这样做是否有问题,坐等大神指教。。

附MQGet类源码:
package com.tk.csc.service;
import org.apache.log4j.Logger;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
public class MQGet {
private static final Logger logger = Logger.getLogger(MQGet.class);
private static final String HOST = OverallProperties.getInstance().getPropertyStr("mqUrl");
private static final int PORT = OverallProperties.getInstance().getPropertyInt("mqPort");
private static final String CHANNEL = OverallProperties.getInstance().getPropertyStr("mqChannel");
private static final String QMANAGER = OverallProperties.getInstance().getPropertyStr("mqManager");
private static final String QNAME = OverallProperties.getInstance().getPropertyStr("mqName");
private static final int CCSID = 1208;
private static final MQGet m = new MQGet();
private MQQueueManager qMgr;
private MQQueue queue ;
public static MQGet getInstance() {
return m;
}
private MQGet() {}
public boolean conn() {
logger.info("trying to connect MQ:" + HOST+ ":" + PORT);
MQEnvironment.hostname = HOST;
MQEnvironment.channel = CHANNEL;
MQEnvironment.CCSID = CCSID;
MQEnvironment.port = PORT;
MQEnvironment.properties.put("transport", "MQSeries");
try {
qMgr = new MQQueueManager(QMANAGER, 0);
} catch (MQException e) {
logger.info("create mqmanager fail!" + e.getMessage());
return false;
}
try {
queue = qMgr.accessQueue(QNAME, 8226, null, null, null);
} catch (MQException e) {
logger.info("accessQueue fail!" + e.getMessage());
return false;
}
return true;
}
public String[] getMsg() {
int depth = 0;
try {
depth = queue.getCurrentDepth();
} catch (MQException e1) {
logger.info("get queue depth fail!" + e1.getMessage());
}
logger.info("当前队列深度==" + depth);
if (depth <= 0) {
return null;
}
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + 2;
gmo.options = gmo.options + 8192;
MQMessage rcvMsg = new MQMessage();
try {
queue.get(rcvMsg, gmo);
} catch (MQException e) {
logger.info("get msg from queue fail!" + e.getMessage());
}
String[] s = null;
try {
s = (String[]) rcvMsg.readObject();
} catch (Exception e) {
logger.info("execute readObject() fail!" + e.getMessage());
}
return s;
}
public void close() {
if (queue != null) {
try {
queue.close();
logger.info("close queue Success!");
} catch (MQException e) {
logger.info("colse queue fail!");
}finally {
if (qMgr != null) {
try {
qMgr.close();
qMgr.disconnect();
logger.info("close qMgr Success!");
} catch (MQException e) {
logger.info("close qMgr fail !");
}
}
}
}
}
}
3、是否有也许有丢消息的状况?
在测试过程中经常出现队列深度queue.getCurrentDepth()一次增加2的状况,但是唯有一个应用一个线程在更改息,每取走一条消息深度必须减1啊,,,
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121852-1.html
真正的海战派不上大用的
中国发展迅速都是老百姓无形中的支持