当前位置: 首页 > 知识库问答 >
问题:

在应用程序中使用 IBM MQ 客户机罐连接到 IBM MQ 服务器时没有响应

吕利
2023-03-14

由于一些新的增强功能,我们现在尝试使用 IBM 客户端 jar 而不是 Active MQ 来实现相同的目标。

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

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

我已经尝试了来自互联网和堆栈溢出本身的多个代码,我总是能够连接,但没有得到任何回应。

此外,我在尝试从远程 IBM MQ 发送或接收时没有收到任何错误或异常

我将粘贴一个样本代码,我试图让工作。我已经更改了代码中的一些配置值。

我的疑惑如下。

>

  • 为此,我所做的就是将 IBM MQ 客户端 jar 复制到应用程序中,并使用代码将消息发送到远程 MQ。我没有安装任何其他应用程序。这样的系统会工作吗,还是应该总是有一些中间程序,比如主动MQ?

    相同的代码能够从我安装在本地网络中的 IBM MQ 服务器发送和接收,但无法从远程服务器获得响应?这使我相信如果我在配置中缺少任何内容?除了在代码中之外,是否还应配置其他任何内容?

    我没有看到任何错误或例外。总是发送消息,但响应为空。我没有看到任何用户名-密码或公钥-私钥认证的用法。是否有任何认证通常用于检查来源。?

    我使用的是IBM MQ client 5.3版本,我知道这是旧版本。但是使用了它,因为它们工作的活动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();
        }
    
    }
    
  • 共有2个答案

    有翰海
    2023-03-14

    这可能是一些与网络相关的配置问题,或者可能是Windows消息传递配置不正确。您可以考虑由 IBM 提供 WebSphere MQ - 消息测试实用程序,以确保不存在此类系统或网络配置问题。

    王昊
    2023-03-14

    MQ v5.3于2002年11月29日发布,自2007年9月28日起停止支持(将近9年)。版本可能与您的问题没有任何关系,但是我强烈建议您转到MQ客户端的受支持版本。较新的MQ客户机版本可以连接到较旧的MQ队列管理器。您可以从以下链接下载MQ 8.0或MQ 9.0 jar文件的纯java安装:

    • IBM MQ v8.0 客户端
    • IBM MQ v9.0 客户端

    我在一些旧线程上读到,当指定超时时,发送方和接收方位于同一会话中会导致问题。尝试为接收方添加另一个会话。

        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=基数 -DMQJMS_TRACE_DIR=/跟踪目录 JavaApp

    这应该会生成一个文件,我相信该文件以< code >结尾。trc放在您指定的目录中。

    您可以查看这些错误,以帮助您找到正确的方向。

    建议:

    尝试更改程序以强制其发送空白用户名:

    connection = (MQQueueConnection) connectionFactory.createQueueConnection("", "");
    

    尝试在调用< code>sender.send后关闭发送器

    sender.close(); 
    

    没有进一步的信息,很难确定原因。你收集的信息越多越好。

     类似资料:
    • 我有一个问题,我用套接字构建了服务器部分和客户机,没有收到任何错误。当我在浏览器中键入本地地址时,它会在cmd中显示信息,但当我在emulator或mobile中运行Android应用程序时,它不会连接到服务器。 我使用的权限: 服务器代码: Main Activity.java是: 请引导我。

    • 我正在尝试从Spring Boot服务向IBM MQ队列发送消息。我可以从安装在笔记本电脑上的IBM MQ发送/接收消息。 但是,当我替换配置以连接到IBM MQ云时,这不起作用 配置如下: 得到以下错误 注: > 我可以远程进入主机 我尝试了以下用户名 使用APIKey 我的IBM用户名

    • 我是编码和Java的新手,我已经创建了一个简单的客户端-服务器程序,客户端可以请求一个文件。它的内容将显示在浏览器页面中,还有一些细节,如数据类型和长度。我现在有一个问题,我不确定如何在浏览器中显示正确连接的服务器响应,如“HTTP/1.1 200 OK”和关闭的连接,如“Connection: close”。我有一个处理响应的方法,如下所示: 对我如何做到这一点有什么建议吗?非常感谢。

    • 我有一个Spring Boot应用程序,它使用IBMSpring Boot启动器连接到IBMMessageQueue服务: 我有一个组件类侦听队列,它有以下注释来启用/禁用连接到队列: 我的应用程序中还有以下属性。属性: 当我连接到ActiveMQ时,此注释用于禁用队列连接,但在将代码库更改为连接到IBM MQ时,连接似乎不受ConditionalUnproperty的影响,并且总是尝试连接。 是

    • 我需要侦听多个队列(存在于同一队列管理器中)。我有用于侦听单个队列的可用Spring Boot应用程序代码。但是,有没有任何方法可以从单个Spring Boot应用程序连接到多个队列? 还有,是否可以在运行时将侦听器从一个队列切换到另一个队列? 我有从单个队列读取的代码,如下所示:

    • 我有一个react本机应用程序,它使用与。NET Core2.1通信的signalR。 套接字连接没有任何错误。一切都很好。但是服务器不能响应客户端的ping消息,并返回504给客户端。当返回504时,客户端的连接关闭。在hubconnection.onclose()处理。然后客户端需要重新连接。 proxy_read_timeout可以设置为高毫秒。但很乱。 所以我不能在客户机上有效地使用kee