2011-10-28 27 views
8

इसलिए मैंने पिछले कुछ दिनों में इसे हल करने की कोशिश की है, जो कि भूल गए हैं क्योंकि दो पीईसीएल एक्सटेंशन उपलब्ध नहीं हैं (एसएएम और एमसीएसरीज़) को लंबे समय तक अपडेट किया गया है। मैंने दोनों कोशिश की है और mqseries मुझे इस बिंदु पर सबसे दूरगामी लगता है क्योंकि एसएएम मुझे कनेक्शन पाने से इंकार कर देता है, भले ही एमक्यू कमांड लाइन से पूरी तरह से काम करता है। मैं सफलतापूर्वक मेरी QueueManager से कनेक्शन बना लिया है और यह अगले कदम (MQOPEN) है कि मैं बुरी तरह असफल दौरान बताया गया है:PHP का उपयोग कर एमक्यू से कनेक्ट करने का प्रयास कर रहा है; लगभग

$mqcno = array(
     'Version' => MQSERIES_MQCNO_VERSION_2, 
     'Options' => MQSERIES_MQCNO_STANDARD_BINDING, 
     'MQCD' => array('ChannelName' => '[channel]', 
     'ConnectionName' => '[ipnumber]([port])', 
     'TransportType' => MQSERIES_MQXPT_TCP) 
    ); 

mqseries_connx('MQED', $mqcno, $conn, $comp_code,$reason); 
if ($comp_code !== MQSERIES_MQCC_OK) { 
    printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, $reason); 
    exit; 
} 

$mqods = array('ObjectName'=>'MYPUTQUEUE', 'ObjectType'=>MQOT_Q, 'ObjectQMgrName'=>'MYQUEUEMANAGER'); 
mqseries_open($conn, $mqods, 
      MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT, 
      $obj, $comp_code,$reason); 

इस $ कारण परिणाम में 2044 के साथ डाला जा रहा है, जो MQRC_OD_ERROR करने के लिए अनुवाद, या अंग्रेजी में: 'MQOPEN या MQPUT1 कॉल पर, ऑब्जेक्ट डिस्क्रिप्टर MQOD मान्य नहीं है'।

तो सवाल यह है कि, मेरे एमक्यूओडी के साथ क्या गलत है?

अद्यतन # 1: इस बिंदु पर यह हल नहीं किया गया है। मैंने बिल्ड समय पर किसी भी मुद्दे को हल करने के लिए जमीन से परियोजना को पुनर्निर्मित किया। मैं अभी भी MQOPEN 2044 लौटने पर फंस गया हूं। नमूने अभी भी सीएलआई से निर्दोष रूप से चलते हैं, इसलिए यह निश्चित रूप से पीईसीएल एक्सटेंशन की स्थापना से जुड़ा हुआ है। यदि वहां कोई भी व्यक्ति है जिसने सफलतापूर्वक स्थापित किया है और हाल ही में 64-बिट PHP5 वातावरण में एमक्यू के खिलाफ PHP चला रहे हैं तो कृपया मुझे बताएं ...

अद्यतन # 2: MQPUT1 समस्या के साथ निर्दोष रूप से काम करता है जो मैं नहीं कर सकता मेरी प्रतिक्रिया प्राप्त करें। इस बिंदु पर, यह सिर्फ MQOPEN है जो काम नहीं करता है। सवाल है; MQPUT1 काम करता है जब MQOPUT 2044 लौटने के कारण क्या है, जिसे मैं समझता हूं MQOPEN शामिल है?

+0

* मैंने सफलतापूर्वक अपने कतार प्रबंधक के साथ एक कनेक्शन बनाया है और यह अगले चरण (एमक्यूकॉनएन) के दौरान है कि मैं बुरी तरह विफल रहता हूं ... * क्या आप किसी भी मौके से यह मानते हैं कि यह एमक्यू पर है कि यह विफल हो जाता है? –

+1

हां, क्षमा करें। मैंने अपना प्रश्न संपादित कर लिया है। – eriben

+0

मैं PHP मॉड्यूल से परिचित नहीं हूं लेकिन 'डिवाइस नाम' कतार नाम के लिए एक अजीब कुंजी प्रतीत होता है। –

उत्तर

1

cmqch फ़ाइल में MQOD इस तरह दिखता है:

/****************************************************************/ 
/* MQOD Structure -- Object Descriptor       */ 
/****************************************************************/ 


typedef struct tagMQOD MQOD; 
typedef MQOD MQPOINTER PMQOD; 
typedef PMQOD MQPOINTER PPMQOD; 

struct tagMQOD { 
    MQCHAR4 StrucId;    /* Structure identifier */ 
    MQLONG Version;    /* Structure version number */ 
    MQLONG ObjectType;   /* Object type */ 
    MQCHAR48 ObjectName;   /* Object name */ 
    MQCHAR48 ObjectQMgrName;  /* Object queue manager name */ 
    MQCHAR48 DynamicQName;   /* Dynamic queue name */ 
    MQCHAR12 AlternateUserId;  /* Alternate user identifier */ 
    /* Ver:1 */ 
    MQLONG RecsPresent;   /* Number of object records 
             present */ 
    MQLONG KnownDestCount;  /* Number of local queues opened 
             successfully */ 
    MQLONG UnknownDestCount;  /* Number of remote queues opened 
             successfully */ 
    MQLONG InvalidDestCount;  /* Number of queues that failed to 
             open */ 
    MQLONG ObjectRecOffset;  /* Offset of first object record 
             from start of MQOD */ 
    MQLONG ResponseRecOffset; /* Offset of first response record 
             from start of MQOD */ 
    MQPTR  ObjectRecPtr;   /* Address of first object record */ 
    MQPTR  ResponseRecPtr;  /* Address of first response 
             record */ 
    /* Ver:2 */ 
    MQBYTE40 AlternateSecurityId; /* Alternate security identifier */ 
    MQCHAR48 ResolvedQName;  /* Resolved queue name */ 
    MQCHAR48 ResolvedQMgrName;  /* Resolved queue manager name */ 
    /* Ver:3 */ 
    MQCHARV ObjectString;   /* Object long name */ 
    MQCHARV SelectionString;  /* Message Selector */ 
    MQCHARV ResObjectString;  /* Resolved long object name*/ 
    MQLONG ResolvedType;   /* Alias queue resolved object type */ 
    /* Ver:4 */ 
}; 

#define MQOD_DEFAULT {MQOD_STRUC_ID_ARRAY},\ 
         MQOD_VERSION_1,\ 
         MQOT_Q,\ 
         {""},\ 
         {""},\ 
         {"AMQ.*"},\ 
         {""},\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         NULL,\ 
         NULL,\ 
         {MQSID_NONE_ARRAY},\ 
         {""},\ 
         {""},\ 
         {MQCHARV_DEFAULT},\ 
         {MQCHARV_DEFAULT},\ 
         {MQCHARV_DEFAULT},\ 
         MQOT_NONE 

मैं अगर मॉड्यूल चूक में भर जाता है सोच रहा हूँ और दे रहा है आप हैश के साथ तो ओवरराइड। यदि हां, तो 'डिवाइस नाम' वास्तव में सही कुंजी है? मुझे लगता है कि यह डब्लूएमक्यू फील्ड नाम या स्थिर से मेल खाएगा।

अद्यतन: प्रदान किए गए लिंक पर the example प्रति, हैश कुंजी वास्तव में cmqc.h से फ़ील्ड नाम से मेल खाती है।

अद्यतन टिप्पणी करने के लिए # 2 जवाब: ऑब्जेक्ट प्रकार के रूप में cmqc.h में परिभाषित कर रहे हैं:

/* Object Types */ 
#define MQOT_NONE  0 
#define MQOT_Q   1 
#define MQOT_NAMELIST 2 
#define MQOT_PROCESS 3 
#define MQOT_STORAGE_CLASS 4 
#define MQOT_Q_MGR  5 
#define MQOT_CHANNEL 6 
#define MQOT_AUTH_INFO 7 
#define MQOT_TOPIC  8 
#define MQOT_CF_STRUC 10 
#define MQOT_LISTENER 11 
#define MQOT_SERVICE 12 
#define MQOT_RESERVED_1 999 

PHP, पर्ल और सबसे अन्य इसी तरह के प्रयासों का मेरे समझ है कि वे अधिक एक बहुत पतली आवरण हो रहा है सी एपीआई पर्ल एक बस cmqc.h से सीधे अधिकांश कोड उत्पन्न करता है और अन्य सी में फाइलें शामिल होती हैं और इसलिए सभी फील्ड नाम और डिफ़ॉल्ट रूप से उन फ़ाइलों से मेल खाते हैं जिनमें फाइलें शामिल हैं। ऐसा लगता है कि यह मॉड्यूल एक समान दृष्टिकोण लेता है और जहां आवश्यक हो वहां परिभाषित नामों और फ़ील्ड डिफ़ॉल्ट का उपयोग करने की उम्मीद है। अतिरिक्त टिप्पणी करने के लिए

$mqods = array(
       'StrucID'=>'OD ', 
       'Version'=>1. 
       'ObjectType'=>1, 
       'ObjectName'=>'MYPUTQUEUE', 
       'ObjectQMgrName'=>'MYQUEUEMANAGER' 
       'DynamicQName'='', 
       'AlternateUserId'='', 
       'RecsPresent'=>0, 
       'KnownDestCount'=>0, 
       'UnknownDestCount'=>0, 
       'InvalidDestCount'=>0, 
       'ObjectRecOffset'=>0, 
       'ResponseRecOffset'=>0, 
       'ObjectRecPtr'=>NULL, 
       'ResponseRecPtr'=>NULL 
); 

अद्यतन # 3 जवाब:

मैं की तरह कुछ सोच रहा हूँ

क्यू एमजीआर MQOD के किसी भी संस्करण को स्वीकार करेंगे लेकिन कार्यक्षमता के उस स्तर पर वापस आ जाएगा। यदि आप v1 का उपयोग करते हैं तो आप यह जांच सकते हैं कि यह काम करता है। यदि आप एमक्यूओडी के बाद के संस्करणों का उपयोग करना चाहते हैं तो आपको हैश में अतिरिक्त फ़ील्ड जोड़ना होगा।

200 9 "कनेक्शन टूटा हुआ" है। अनिवार्य रूप से क्यूएमग्री को कुछ पसंद नहीं आया और आपका कनेक्शन समाप्त हो गया। आमतौर पर उस वापसी कोड के लिए सार्थक त्रुटि संदेश /var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOG में हैं।

+0

वे करते हैं। किसी भी लाभ के लिए हैश तालिका को निम्न में परिवर्तित नहीं किया गया: $ mqods = array ('ऑब्जेक्टनाम' => 'MYPUTQUEUE', 'ऑब्जेक्ट टाइप' => MQOT_Q, 'ऑब्जेक्ट QMgrName' => 'MYQUEUEMANAGER'); – eriben

+0

जब तक निरंतर MQOT_Q परिभाषित नहीं किया जाता है, तो वह मान 1. –

+0

बदलना संस्करण 4 को एक और त्रुटि का कारण बनता है; 200 9, जिसका कम से कम मतलब है कि यह एमक्यूओडी स्वीकार करता है। 4 का मतलब है 'वर्तमान संस्करण' अगर मैं cmqc.h सही ढंग से पढ़ता हूं – eriben

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^