由于一些新的增强功能,我们现在尝试使用 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();
}
}
这可能是一些与网络相关的配置问题,或者可能是Windows消息传递配置不正确。您可以考虑由 IBM 提供 WebSphere MQ - 消息测试实用程序,以确保不存在此类系统或网络配置问题。
MQ v5.3于2002年11月29日发布,自2007年9月28日起停止支持(将近9年)。版本可能与您的问题没有任何关系,但是我强烈建议您转到MQ客户端的受支持版本。较新的MQ客户机版本可以连接到较旧的MQ队列管理器。您可以从以下链接下载MQ 8.0或MQ 9.0 jar文件的纯java安装:
我在一些旧线程上读到,当指定超时时,发送方和接收方位于同一会话中会导致问题。尝试为接收方添加另一个会话。
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