我正在Delphi中编写一个应用程序来连接远程MQ Server并获取消息
我在我的comp上安装了一个MQ服务器并编写了一个测试应用程序
所有这些都很好。连接,打开,放置,获取,......一切正常
然后我尝试通过更改地址连接到远程MQ,它工作但不正确,它仍然适用于本地MQ仍然从本地获取信息。没有切换到其他远程服务器!!!!
我的消息来源如下,我该怎么办?谢谢
var
QMgrName : MQCHAR48;
ConnectOpts : TMQCNO;
ClientConn : TMQCD;
Compcode : MQLONG;
Reason : MQLONG;
begin
StrPCopy(QMgrName, AQueueManager+#0);
ConnectOpts.StrucId := MQCNO_STRUC_ID;
ConnectOpts.Version := MQCNO_VERSION_1;
ConnectOpts.Options := MQCNO_STANDARD_BINDING;
ConnectOpts.ClientConnOffset := 0;
ConnectOpts.ClientConnPtr := @ClientConn;
with ClientConn do begin
StrPCopy(ClientConn.ConnectionName, format('%s(%s)'#0, [AIP,APort]));
Version := MQCD_VERSION_6;
ChannelType := MQCHT_CLNTCONN;
TransportType := MQXPT_TCP;
Desc := '';
QMgrName := '';
XmitQName := '';
ShortConnectionName := '';
MCAName := '';
ModeName := '';
TpName := '';
BatchSize := 50;
DiscInterval := 6000;
ShortRetryCount := 10;
ShortRetryInterval := 60;
LongRetryCount := 999999999;
LongRetryInterval := 1200;
SecurityExit := '';
MsgExit := '';
SendExit := '';
ReceiveExit := '';
SeqNumberWrap := 999999999;
MaxMsgLength := 4194304;
PutAuthority := MQPA_DEFAULT;
DataConversion := MQCDC_NO_SENDER_CONVERSION;
SecurityUserData := '';
MsgUserData := '';
SendUserData := '';
ReceiveUserData := '';
UserIdentifier := '';
Password := '';
MCAUserIdentifier := '';
MCAType := MQMCAT_PROCESS;
ConnectionName := '';
RemoteUserIdentifier := '';
RemotePassword := '';
MsgRetryExit := '';
MsgRetryUserData := '';
MsgRetryCount := 10;
MsgRetryInterval := 1000;
HeartbeatInterval := 1;
BatchInterval := 0;
NonPersistentMsgSpeed := MQNPMS_FAST;
StrucLength := MQCD_LENGTH_6;
ExitNameLength := MQ_EXIT_NAME_LENGTH;
ExitDataLength := MQ_EXIT_DATA_LENGTH;
MsgExitsDefined := 0;
SendExitsDefined := 0;
ReceiveExitsDefined := 0;
MsgExitPtr := nil;
MsgUserDataPtr := nil;
SendExitPtr := nil;
SendUserDataPtr := nil;
ReceiveExitPtr := nil;
ReceiveUserDataPtr := nil;
ClusterPtr := nil;
ClustersDefined := 0;
NetworkPriority := 0;
LongMCAUserIdLength := 0;
LongRemoteUserIdLength := 0;
LongMCAUserIdPtr := nil;
LongRemoteUserIdPtr := nil;
// MCASecurityId := MQSID_NONE_ARRAY;
// RemoteSecurityId := MQSID_NONE_ARRAY;
end;
MQCONNX(@QMgrName, ConnectOpts, HConn,Compcode,Reason);
if CompCode <> MQCC_OK then
raise Exception.Create(format('MQCONNX Fail, Completion Code: %d, Reason: %d',[CompCode,Reason]));
答案 0 :(得分:3)
代码段不显示uses
语句。根据{{3}},
SupportPac包含两个名为“MQI.PAS”和“MQIC.PAS”的文件。 这些是应该放在搜索中某处的Pascal源 Delphi的路径将包含在您的Pascal程序中。通往的方式 包括它就像使用Pascal中的任何单位:
使用MQI;
或
使用MQIC;
MQI
是绑定模式(共享内存)连接,MQIC
是网络堆栈上的客户端连接。
可以同时使用并让应用程序确定在运行时使用哪个。根据{{3}}:
如果要链接到mqm库,则使用标准服务器 首先尝试使用默认绑定类型的连接。如果 底层服务器库无法加载,客户端连接是 试图改为。
这向我建议你在路径中有两个库,连接首先找到本地QMgr并忽略客户端连接参数,或者你正在使用MQI库来获取MQIC库。确保MQIC库在路径中并更改uses
语句。
如果切换库并不能单独解决问题,请考虑指定MQCNO_CLIENT_BINDING
而不是MQCNO_STANDARD_BINDING
。
答案 1 :(得分:3)
通过测试其他应用来验证连接。当我在做MQ时,我总是从他们的一个C示例中获取get / put。让它工作,然后担心我的程序是否有效。您的问题可能与连接字符串,身份验证,防火墙等有关,因此在验证连接之前,您的代码无关紧要。
更新:如果您从库存MQ样本应用程序中收到错误,请谷歌获取示例应用程序的名称以及错误代码!