在应用程序中使用 IBM MQ 客户机 jar 连接到 IBM MQ 服务器时无响应
我正在处理的应用程序需要与远程位置的 IBM MQ 服务器进行通信。我们目前有一个使用活动 MQ 的工作系统,它使用代理,以及一个桥连接到这个远程 IBM MQ 服务器,并且工作正常。
由于一些新的增强功能,我们现在正试图使用 IBM 客户端 jar 而不是 Active MQ 来实现相同的目标。
我面临的问题是我可以连接到远程服务器的入站Q并发送消息。但我总是从远程服务器出站队列收到空值。但是我无法检查消息是否在远程位置收到。但是,如果通过旧的 ActiveMQ 系统发送相同的消息,则会从远程 MQ 服务器获得响应。
旧的 Active MQ 在内部使用桥连接到远程 IBM MQ 服务器,该服务器的配置与我使用的新代码完全相同。
我已经尝试了来自互联网和堆栈溢出本身的多个代码,并且始终能够连接但没有得到任何响应。
此外,在尝试从远程 IBM MQ 发送或接收时,我没有收到任何错误或异常。
我将粘贴一个我正在尝试工作的示例代码。我更改了代码中的一些配置值。
我的疑虑如下。
为此,我所要做的就是将 IBM MQ 客户端 jar 复制到应用程序中,并使用代码将消息发送到远程 MQ。我没有安装任何其他应用程序。这样的系统会工作,还是应该总是有一些中间程序,如活跃的MQ?
相同的代码能够从 IBM MQ 服务器发送和接收,我将其安装在本地网络中,但无法从远程服务器获得响应?这使我相信如果我在配置中缺少任何内容?除了在代码中之外,是否还应该配置其他任何东西?
我没有看到任何错误或异常。始终发送消息,但响应为空。我没有看到任何用户名密码或公钥 - 私钥身份验证的使用。是否有任何通常用于检查源的身份验证。?
我使用的是 IBM MQ 客户端 5.3 版本,我知道它很旧。但是使用它,因为他们工作活跃的MQ设置使用相同的并且工作正常。我无法知道远程机器上存在 IBM MQ 服务器上的哪个版本。如果我们使用与服务器 MQ 版本不同的客户端 MQ 版本,是否存在问题。?
在本地环境中为我工作的示例代码,即能够从我在本地网络中的另一台机器中安装的 IBM MQ 服务器发送和接收。当我尝试将其与远程 IBM MQ 服务器一起使用时,相同的代码将获取 null 响应。
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();
}
}