java websphere MQ

use*_*905 5 java java-ee ibm-mq

我的目标是使用WebSphere MQ java编程将n个消息放入for循环中到WebSphere MQ队列.

我的java程序将作为独立程序运行.

如果介于两者之间,我需要回滚所有消息.

如果没有异常,那么我应该提交所有消息.

在我完全完成之前,外界不应该在队列中看到我的消息.我该如何实现这一目标?

根据T.Rob的回复更新了示例代码:

请检查示例代码是否正常?

设置MQGMO_SYNCPOINT只与我的程序调用有关吗?(因为并行运行的类似程序也会将消息放在同一队列中,并且这些消息不会受到程序的SYNCPOINT的影响.)

public void sendMsg() {
        MQQueue queue = null;
        MQQueueManager queueManager = null;
        MQMessage mqMessage = null;
        MQPutMessageOptions pmo = null;
        System.out.println("Entering..");
        try {
            MQEnvironment.hostname = "x.x.x.x";
            MQEnvironment.channel = "xxx.SVRCONN";
            MQEnvironment.port = 9999;


            queueManager = new MQQueueManager("XXXQMANAGER");
            int openOptions = MQConstants.MQOO_OUTPUT;      
            queue = queueManager.accessQueue("XXX_QUEUENAME", openOptions, null, null, null);

            pmo = new MQPutMessageOptions(); 
            pmo.options = CMQC.MQGMO_SYNCPOINT;


            String input = "testing";
            System.out.println("sending messages....");
            for (int i = 0; i < 10; i++) {
                input = input + ": " + i;
                mqMessage = new MQMessage();
                mqMessage.writeString(input);
                System.out.println("Putting message: " + i);
                queue.put(mqMessage, pmo);

            }
            queueManager.commit();
            System.out.println("Exiting..");

        } catch (Exception e) {
            e.printStackTrace();
            try {
                System.out.println("rolling back messages");
                if (queueManager != null)
                    queueManager.backout();
            } catch (MQException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                if (queue != null)
                    queue.close();
                if (queueManager != null)
                    queueManager.close();
            } catch (MQException e) {
                e.printStackTrace();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

T.R*_*Rob 5

WMQ支持本地和全球(XA)工作单元.只需指定选项即可使用本地工作单元.全局XA事务需要事务管理器,如keithkreissl在另一个答案中所述.

对于你所描述的,POJO在同步点下进行消息传递,MQC.MQGMO_SYNCPOINT在你的MQGetMessageOptions.当您准备好提交时,发出MQQManager.commit()MQQManager.backout()调用.

请注意,ggrandes提供的响应和doc是指JMS而不是Java类.Java类使用Java等价的WMQ过程API,可以支持许多线程(doc)甚至提供连接池(doc).有关正确的行为,请参阅Java文档而不是JMS文档.另外,我已经链接到WMQ V7.5文档,该文档与最新的WMQ Java V7.5客户端一起使用.后来的客户端具有更多的本地功能(跟踪,灵活的安装路径,MQClient.ini等),并使用后端QMgrs.强烈建议使用最新的客户端,免费下载.