我正在处理的应用程序需要与远程位置的IBM MQ服务器通信。当前,我们有一个使用 Activity MQ的工作系统,该系统使用了代理,并有一个桥接器连接到此远程IBM MQ服务器,并且工作正常。

由于进行了一些新的增强,我们现在尝试使用IBM客户端jar代替Active MQ来实现相同的功能。

我面临的问题是我可以连接到远程服务器的inboundQ并发送消息。但是我总是从远程服务器出站队列接收到null。但是我无法检查是否在远程位置收到了邮件。但是,如果通过旧的ActiveMQ系统发送相同的消息,则会从远程MQ服务器获得响应。

旧的Active MQ在内部使用网桥连接到远程IBM MQ服务器,该服务器的配置与我正在使用的新代码完全相同。

我已经尝试了来自互联网的多个代码,并且堆栈本身溢出了,并且始终可以连接但没有任何响应。

另外,在尝试从远程IBM MQ发送或接收消息时,没有任何错误或异常。

我将粘贴一个示例代码,尝试开始工作。我在代码中更改了一些配置值。

我的怀疑如下。

  • 我要做的就是将IBM MQ客户端jar复制到应用程序中,并使用代码将消息发送到远程MQ。我尚未安装任何其他应用程序。这样的系统会工作吗?还是应该总是有一些中间程序,例如 Activity MQ?
  • 相同的代码能够从我安装在本地网络中的IBM MQ服务器发送和接收,但是无法从远程服务器获得响应吗?这使我相信是否丢失了配置中的任何内容?除了代码以外,还应该配置其他东西吗?
  • 我没有看到错误或异常。始终发送消息,但响应为空。我还没有看到任何用户名密码或公私钥身份验证的用法。是否有通常用于检查源的任何身份验证。 ?
  • 我使用的IBM MQ客户端5.3版本很旧。但是使用了它们,因为它们可以工作, Activity 的MQ设置使用相同的方法并且可以正常工作。我无法知道远程机器上存在IBM MQ服务器上的哪个版本。如果我们使用与服务器MQ版本不同的客户端MQ版本,是否有问题。 ?

  • 在本地环境中对我有用的示例代码,即能够从我已经安装在本地网络中另一台机器上的IBM MQ服务器发送和接收的示例代码。当我尝试将其与远程IBM MQ服务器一起使用时,相同的代码将获取空响应。
    import javax.jms.*;
    import javax.jms.JMSException;
    import com.ibm.mq.jms.*;
    import com.ibm.jms.JMSMessage;
    import javax.jms.TextMessage;
    
    public class SendReceive {
        private MQQueueConnectionFactory connectionFactory;
        private MQQueueConnection connection;
    
        private void runTest() {
            try {
                connect();
                connection.start();
                MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");     /* values  replaced with correct values in deployment server */
                MQQueue queue2 = (MQQueue) session.createQueue("OUTBOUND_QUEUE");   /* values  replaced with correct values in deployment server */
                MQQueueSender sender = (MQQueueSender) session.createSender(queue);
    
                MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue2);
    
                //TextMessage message = session.createTextMessage("yesyesyes");
                String stt = "Test Message";        //
    
                TextMessage message = session.createTextMessage(stt);
                message.setJMSReplyTo(queue2);
                sender.send(message);
                System.out.println("Sent: " + message);
    
                Message msg1 = receiver.receive(5000);
                if(msg1!=null){
                    String responseMsg = ((TextMessage) msg1).getText();
                    System.out.println("Received: " + responseMsg);
                }else{
                    System.out.println("Message received is null");
                }
            }catch(Exception e){
                System.out.println("Exception caught in program : " + e);
                e.printStackTrace();
            }
        }
    
        public boolean connect() {
            boolean connected = false;
            try {
                /* values below are replaced with correct values in deployment server */
    
                connectionFactory = new MQQueueConnectionFactory();
                connectionFactory.setPort(1515);
                connectionFactory.setHostName("192.168.1.23"); //
                connectionFactory.setQueueManager("QCCMGR");
                connectionFactory.setChannel("QCHANNEL");
                connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
    
                connection = (MQQueueConnection) connectionFactory.createQueueConnection();
                connected = true;
            } catch (Exception e) {
                connected = false;
            }
            return connected;
        }
    
        public static void main(String[] args) {
            new SendReceive().runTest();
        }
    
    }
    

    最佳答案

    MQ v5.3于2002年11月29日发布,自2007年9月28日(将近9年)以来不再提供支持。该版本可能与您的问题无关,但我强烈建议您使用MQ客户端的受支持版本。较新的MQ客户端版本可以连接到较旧的MQ队列管理器。您可以在以下链接中下载仅Java安装的MQ 8.0或MQ 9.0 jar文件:

  • IBM MQ v8.0 Client
  • IBM MQ v9.0 Client


  • 我在一些旧线程上读到,在指定超时时,在同一 session 上具有发送方和接收方会导致问题。尝试为接收者添加另一个 session 。
        private void runTest() {
            try {
                connect();
                connection.start();
                MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                MQQueueSession session2 = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");     /* values  replaced with correct values in deployment server */
                MQQueue queue2 = (MQQueue) session2.createQueue("OUTBOUND_QUEUE");  /* values  replaced with correct values in deployment server */
                MQQueueSender sender = (MQQueueSender) session.createSender(queue);
    
                MQQueueReceiver receiver = (MQQueueReceiver) session2.createReceiver(queue2);
    
                //TextMessage message = session.createTextMessage("yesyesyes");
                String stt = "Test Message";        //
    
                TextMessage message = session.createTextMessage(stt);
                message.setJMSReplyTo(queue2);
                sender.send(message);
                System.out.println("Sent: " + message);
    
                Message msg1 = receiver.receive(5000);
                if(msg1!=null){
                    String responseMsg = ((TextMessage) msg1).getText();
                    System.out.println("Received: " + responseMsg);
                }else{
                    System.out.println("Message received is null");
                }
            }catch(Exception e){
                System.out.println("Exception caught in program : " + e);
                e.printStackTrace();
            }
        }
    

    通过在Java应用程序的执行中添加以下内容,尝试进行JMS跟踪:
    -DMQJMS_TRACE_LEVEL=base
    -DMQJMS_TRACE_DIR=/tracedirectory
    

    例如:java -DMQJMS_TRACE_LEVEL=base -DMQJMS_TRACE_DIR=/tracedirectory JavaApp
    这应该会产生一个文件,我相信该文件以您指定的目录中的.trc结尾。

    您可以查看此错误,以帮助您指出正确的方向。

    意见建议:

    尝试更改程序以强制其发送空白用户名:
    connection = (MQQueueConnection) connectionFactory.createQueueConnection("", "");
    

    尝试在调用sender.send后关闭发件人
    sender.close();
    

    没有更多信息,很难确定原因。您可以收集的信息越多越好。

    关于java - 在应用程序中使用IBM MQ客户端jar连接到IBM MQ服务器时无响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42370717/

    10-11 22:27
    查看更多