我正在处理的应用程序需要与远程位置的IBM MQ服务器通信。当前,我们有一个使用 Activity MQ的工作系统,该系统使用了代理,并有一个桥接器连接到此远程IBM MQ服务器,并且工作正常。
由于进行了一些新的增强,我们现在尝试使用IBM客户端jar代替Active MQ来实现相同的功能。
我面临的问题是我可以连接到远程服务器的inboundQ并发送消息。但是我总是从远程服务器出站队列接收到null。但是我无法检查是否在远程位置收到了邮件。但是,如果通过旧的ActiveMQ系统发送相同的消息,则会从远程MQ服务器获得响应。
旧的Active MQ在内部使用网桥连接到远程IBM MQ服务器,该服务器的配置与我正在使用的新代码完全相同。
我已经尝试了来自互联网的多个代码,并且堆栈本身溢出了,并且始终可以连接但没有任何响应。
另外,在尝试从远程IBM 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文件:
我在一些旧线程上读到,在指定超时时,在同一 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/