ASG
IBM
Zystems
Cressida
Icon
Netflexity
 
  MQSeries.net
Search  Search       Tech Exchange      Education      Certifications      Library      Info Center      SupportPacs      LinkedIn  Search  Search                                                                   FAQ  FAQ   Usergroups  Usergroups
 
Register  ::  Log in Log in to check your private messages
 
RSS Feed - WebSphere MQ Support RSS Feed - Message Broker Support

MQSeries.net Forum Index » IBM MQ API Support » MQRC_HCONN_ERROR

Post new topic  Reply to topic
 MQRC_HCONN_ERROR « View previous topic :: View next topic » 
Author Message
kendras
PostPosted: Fri Oct 13, 2006 1:27 am    Post subject: MQRC_HCONN_ERROR Reply with quote

Novice

Joined: 31 Jan 2006
Posts: 12

I've made a windows service called DuplicationWMQ.
This service take a message in a file, and put it in others file.
It's work in cluster and my WMQ Server too.

When the WMQ server pass on the other node of the cluster, my application lost the connection, and can't open it again.

This is my error :

Code:
Type de l'événement :   Erreur
Source de l'événement :   DuplicationWmq
Catégorie de l'événement :   Aucun
ID de l'événement :   0
Date :      28/09/2006
Heure :      11:23:48
Utilisateur :   N/A
Ordinateur :   *********
Description :
La description pour l'ID d'événement ( 0 ) dans la source (DuplicationWmq) est introuvable. L'ordinateur local n'a peut-être pas les informations de Registre ou les librairies requises pour afficher les messages émanant d'un ordinateur distant. Vous pourrez peut-être utiliser l'option /AUXSOURCE= pour récupérer cette description. Reportez-vous aux rubriques Aide et support pour plus de détails. Les informations suivantes font partie de l'événement : MQRC_HCONN_ERROR [   at IBM.WMQ.MQQueue..ctor(MQQueueManager qMgr, String queueName, Int32 openOptions, String queueManagerName, String dynamicQueueName, String alternateUserId)
   at IBM.WMQ.MQQueueManager.AccessQueue(String queueName, Int32 openOptions, String queueManagerName, String dynamicQueueName, String alternateUserId)
   at IBM.WMQ.MQQueueManager.AccessQueue(String queueName, Int32 openOptions)
   at DuplicationWmq.WmqComponent.ExternalDupliq(ArrayList extQueues, MQMessage MessageIN)].


This is my code source :

Code:
      private void ExternalDupliq(ArrayList extQueues, MQMessage MessageIN, string logFileName, string inQueueName)
      {
         MQPutMessageOptions pmo = new MQPutMessageOptions();

         foreach(ExternalQueue extQueue in extQueues)
         {
            MQQueueManager extQMgr = null;
            MQQueue myExtQueue = null;
            try
            {
                  MQEnvironment.Port     = extQueue.Port;
                  MQEnvironment.Channel  = extQueue.Canal;
                  MQEnvironment.Hostname = extQueue.Machine;
                  extQMgr = new MQQueueManager(extQueue.ManagerName);
                  myExtQueue = extQMgr.AccessQueue(extQueue.QueueName, openOutOptions);
                  myExtQueue.Put(MessageIN, pmo);
            }
            catch(Exception ex)
            {
               string message = "InQueue Name : " + inQueueName
                  + "\nOutQueue Name : " + extQueue.QueueName
                  + "\nType Erreur : External Dupliq"
                  + "\nMessage d'erreur : " + ex.Message
                  + "\nStackTrace : " + ex.StackTrace;

               Common.WriteThreadXml(logFileName,inQueueName, message ,1);
               Log.Error(message);
               goto EXIT;
            }
         
         EXIT:
            try
            {
               if ((myExtQueue != null) && myExtQueue.IsOpen)
                  myExtQueue.Close();
               CloseMQ(ref extQMgr);

            }
            catch(Exception ex)
            {
               string message = "Queue Name : " + inQueueName
                  + "\nType Erreur : External Dupliq [CLEAR]"
                  + "\nMessage d'erreur : " + ex.Message
                  + "\nStackTrace : " + ex.StackTrace;

               Common.WriteThreadXml(logFileName,inQueueName, message ,1);
               Log.Error(message);
            }
         }

         return;

      }
Back to top
View user's profile Send private message
jefflowrey
PostPosted: Fri Oct 13, 2006 1:29 am    Post subject: Reply with quote

Grand Poobah

Joined: 16 Oct 2002
Posts: 19981

http://publib.boulder.ibm.com/infocenter/wmqv6/v6r0/index.jsp?topic=/com.ibm.mq.amqzao.doc/csq05rea3.htm
_________________
I am *not* the model of the modern major general.
Back to top
View user's profile Send private message
kendras
PostPosted: Fri Oct 13, 2006 2:20 am    Post subject: Reply with quote

Novice

Joined: 31 Jan 2006
Posts: 12

i've already read this, and there no answer for me...
Back to top
View user's profile Send private message
Vitor
PostPosted: Fri Oct 13, 2006 2:34 am    Post subject: Reply with quote

Grand High Poobah

Joined: 11 Nov 2005
Posts: 26093
Location: Texas, USA

Quote:
2018 (X'07E2')MQRC_HCONN_ERROR
Explanation:
The connection handle Hconn is not valid, for one of the following reasons:

The parameter pointer is not valid, or (for the MQCONN or MQCONNX call) points to read-only storage. (It is not always possible to detect parameter pointers that are not valid; if not detected, unpredictable results occur.)
The value specified was not returned by a preceding MQCONN or MQCONNX call.
The value specified has been made invalid by a preceding MQDISC call.
The handle is a shared handle that has been made invalid by another thread issuing the MQDISC call.
The handle is a shared handle that is being used on the MQBEGIN call (only nonshared handles are valid on MQBEGIN).
The handle is a nonshared handle that is being used a thread that did not create the handle.
The call was issued in the MTS environment in a situation where the handle is not valid (for example, passing the handle between processes or packages; note that passing the handle between library packages is supported).
Completion Code:
MQCC_FAILED

Programmer Response:
Ensure that a successful MQCONN or MQCONNX call is performed for the queue manager, and that an MQDISC call has not already been performed for it. Ensure that the handle is being used within its valid scope (see the description of MQCONN in the WebSphere MQ Application Programming Guide).


kendras wrote:
When the WMQ server pass on the other node of the cluster, my application lost the connection, and can't open it again.


Do you mean the other node of a failover cluster? If so, are you sure the connection object is properly recreated (the old one won't work).
_________________
Honesty is the best policy.
Insanity is the best defence.
Back to top
View user's profile Send private message
kendras
PostPosted: Fri Oct 13, 2006 2:43 am    Post subject: Reply with quote

Novice

Joined: 31 Jan 2006
Posts: 12

yes, the over node of a failover cluster.

On an exception, i close properly my connection (with the method CloseMQ), to recreate it.
Code:

      private void CloseMQ(ref MQQueueManager mqQMgr)
      {
         if(mqQMgr.IsConnected==true || mqQMgr!=null)
         {
            mqQMgr.Disconnect();
            mqQMgr = null;
         }
      }


It seems to have a thing like a cache, and it can't open a new connection...
Back to top
View user's profile Send private message
Vitor
PostPosted: Fri Oct 13, 2006 2:51 am    Post subject: Reply with quote

Grand High Poobah

Joined: 11 Nov 2005
Posts: 26093
Location: Texas, USA

Ok, my Java is very, very weak so please bear that in mind.

The error that MQ is throwing is when the program presents a connection object that is no longer valid. This (I think but see above) is in the MQEnvironment object where the port & the channel are set. I don't see where that's being reset in your code. Are you sure all the objects are properly rebuilt on failover? What happens it, when you catch this error, you drop and recreate the connection via MQEnvironment?
_________________
Honesty is the best policy.
Insanity is the best defence.
Back to top
View user's profile Send private message
fjb_saper
PostPosted: Fri Oct 13, 2006 2:59 am    Post subject: Reply with quote

Grand High Poobah

Joined: 18 Nov 2003
Posts: 20756
Location: LI,NY

You really need to get more out of the exception handling and more specifically the reason code.

This is the only indicator that will tell you what is wrong with the connection attempt.

Remember as well that the environment variable MQEnvironment is a singleton and may affect your current connection. Use the hashtable to create multiple connections in the same CLR/JVM.

Enjoy
_________________
MQ & Broker admin
Back to top
View user's profile Send private message Send e-mail
kendras
PostPosted: Fri Oct 13, 2006 3:16 am    Post subject: Reply with quote

Novice

Joined: 31 Jan 2006
Posts: 12

Ok, I'll use the MQException to get more information about my error.

Thanks for the help
Back to top
View user's profile Send private message
jefflowrey
PostPosted: Fri Oct 13, 2006 3:20 am    Post subject: Reply with quote

Grand Poobah

Joined: 16 Oct 2002
Posts: 19981

This is C#, not Java.

AccessQueue is a giveaway. In Java it would be "accessQueue".

The same with "string" vs "String". And "IBM.WMQ." and not "com.ibm."

Plus, Java applications don't usually get 2018s. Particularly not in threading situations.

Also, as a suggestion, you probably want to reorganize the OR clause in your CloseMQ, to ensure that you don't try and run IsConnected on a null object.
_________________
I am *not* the model of the modern major general.
Back to top
View user's profile Send private message
Vitor
PostPosted: Fri Oct 13, 2006 3:24 am    Post subject: Reply with quote

Grand High Poobah

Joined: 11 Nov 2005
Posts: 26093
Location: Texas, USA

jefflowrey wrote:
This is C#, not Java.


My level of C# knowledge is eloquently displayed by the fact I couldn't tell the difference...
_________________
Honesty is the best policy.
Insanity is the best defence.
Back to top
View user's profile Send private message
kendras
PostPosted: Mon Oct 16, 2006 4:49 am    Post subject: Reply with quote

Novice

Joined: 31 Jan 2006
Posts: 12

So.....

I've tried to get more informations about my WMQ error..

And this is what I get :

CompletionCode : 2
ReasonCode : 2018

How can I clean my connection to reconnect properly ?

I got this :

Code:
      private void ExternalDupliq(ArrayList extQueues, MQMessage MessageIN, string logFileName, string inQueueName)
      {
         MQPutMessageOptions pmo = new MQPutMessageOptions();

         foreach(ExternalQueue extQueue in extQueues)
         {
            MQQueueManager extQMgr = null;
            MQQueue myExtQueue = null;
            try
            {
               MQEnvironment.Port     = extQueue.Port;
               MQEnvironment.Channel  = extQueue.Canal;
               MQEnvironment.Hostname = extQueue.Machine;
               extQMgr = new MQQueueManager(extQueue.ManagerName);
               myExtQueue = extQMgr.AccessQueue(extQueue.QueueName, openOutOptions);
               myExtQueue.Put(MessageIN, pmo);
            }
            catch (MQException ex)
            {
               string message = "InQueue Name : " + inQueueName
                  + "\nOutQueue Name : " + extQueue.QueueName
                  + "\nType Erreur : External Dupliq"
                  + "\nCompletionCode : " + ex.CompletionCode
                  + "\nReasonCode : " + ex.ReasonCode;

               Common.WriteThreadXml(logFileName,inQueueName, message ,1);
               Log.Error(message);
               goto EXIT;
            }

            catch(Exception ex)
            {
               string message = "InQueue Name : " + inQueueName
                  + "\nOutQueue Name : " + extQueue.QueueName
                  + "\nType Erreur : External Dupliq"
                  + "\nMessage d'erreur : " + ex.Message
                  + "\nStackTrace : " + ex.StackTrace;

               Common.WriteThreadXml(logFileName,inQueueName, message ,1);
               Log.Error(message);
               goto EXIT;
            }
         
         EXIT:
            try
            {
               if ((myExtQueue != null) && myExtQueue.IsOpen)
                  myExtQueue.Close();
               CloseMQ(ref extQMgr);

            }
            catch(Exception ex)
            {
               string message = "Queue Name : " + inQueueName
                  + "\nType Erreur : External Dupliq [CLEAR]"
                  + "\nMessage d'erreur : " + ex.Message
                  + "\nStackTrace : " + ex.StackTrace;

               Common.WriteThreadXml(logFileName,inQueueName, message ,1);
               Log.Error(message);
            }
            MQEnvironment.Channel  = null;
            MQEnvironment.Hostname = null;
         }

         return;

      }



Code:
      private void CloseMQ(ref MQQueueManager mqQMgr)
      {
         if(mqQMgr.IsConnected==true || mqQMgr!=null)
         {
            mqQMgr.Disconnect();
            mqQMgr = null;
         }
      }


Any suggestion ?
Back to top
View user's profile Send private message
fjb_saper
PostPosted: Mon Oct 16, 2006 2:57 pm    Post subject: Reply with quote

Grand High Poobah

Joined: 18 Nov 2003
Posts: 20756
Location: LI,NY

Your exception handling is still dirty:
Quote:
EXIT:
try
{
if ((myExtQueue != null) && myExtQueue.IsOpen)
myExtQueue.Close();
CloseMQ(ref extQMgr);

}
catch(Exception ex)
{
string message = "Queue Name : " + inQueueName
+ "\nType Erreur : External Dupliq [CLEAR]"
+ "\nMessage d'erreur : " + ex.Message
+ "\nStackTrace : " + ex.StackTrace;

Common.WriteThreadXml(logFileName,inQueueName, message ,1);
Log.Error(message);
}
MQEnvironment.Channel = null;
MQEnvironment.Hostname = null;

So now what happens if you have an exception on myExtQueue.Close(); ?
What is the state of your connection variables?
_________________
MQ & Broker admin
Back to top
View user's profile Send private message Send e-mail
jefflowrey
PostPosted: Mon Oct 16, 2006 3:38 pm    Post subject: Reply with quote

Grand Poobah

Joined: 16 Oct 2002
Posts: 19981

What happens if an exception occurs at new MQQueueManager?
_________________
I am *not* the model of the modern major general.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic  Reply to topic Page 1 of 1

MQSeries.net Forum Index » IBM MQ API Support » MQRC_HCONN_ERROR
Jump to:  



You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
Protected by Anti-Spam ACP
 
 


Theme by Dustin Baccetti
Powered by phpBB © 2001, 2002 phpBB Group

Copyright © MQSeries.net. All rights reserved.