如何获取WebsphereMQ连接状态以及如何重置连接:1.)从.net客户端,如何测试客户端是否是连接到服务器(即可以发送和接收)是的,我可以在try块内发送消息并捕获随后的异常,但我想要一个更优雅的解决方案。2)如何打开、关闭和重新打开连接?当我试图解决上面的问题1时,我发现如果我打开连接然后调用connection.Close()我无法从连接工厂获得另一个连接(请参见下面的代码片段)。我收到错误消息XMSCC0008我正在使用非常标准的原始MQ配置。这是我的客户端连接的方式:ISessionsession=MQAccess.GetSession(MQAccess.Connection);IDestinationdestination=session.CreateTopic(SubTopicName);消费者=MQAccess.GetConsumer(会话,目的地);Consumer.MessageListener=newMessageListener(HandleMQSubEvent);MQAccess.Connection.Start();其中MQAccess是一个小型实用程序类。编辑了添加MQAccess代码的问题:publicstaticclassMQAccess{publicstaticreadonlyMQConfigurationSectionHandlerConfigSettings;公共静态只读IConnectionFactoryConnectionFactory;私有静态只读IConnection连接;公共静态IConnection连接{获取{返回连接;}}staticMQAccess(){ConfigSettings=(MQConfigurationSectionHandler)ConfigurationManager.GetSection("mq-configuration");XMSFactoryFactory工厂=XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);ConnectionFactory=factory.CreateConnectionFactory();ConnectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME,ConfigSettings.Hostname);ConnectionFactory.SetIntProperty(XMSC.WMQ_PORT,ConfigSettings.Port);ConnectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL,ConfigSettings.Channel);如果(ConfigSettings.QueueManager==string.Empty){ConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER,"");}else{ConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANA德国,ConfigSettings.QueueManager);}连接=GetConnection();}publicstaticIConnectionGetConnection(){returnConnectionFactory.CreateConnection();}publicstaticISessionGetSession(IConnectionconnection){returnconnection.CreateSession(false,AcknowledgeMode.AutoAcknowledge);}publicstaticIMessageProducerGetProducer(ISessionsession,IDestinationdestination){returnsession.CreateProducer(destination);}publicstaticIMessageConsumerGetConsumer(ISessionsession,IDestinationdestination){returnsession.CreateConsumer(destination);}publicstaticvoidMQPub(stringTopicURI,stringmessage){using(varsession=GetSession(Connection)){using(vardestination=session.CreateTopic(TopicURI)){using(varproducer=GetProducer(session,destination)){producer.Send(session.CreateTextMessage(消息));}}}}publicstaticvoidMQPub(stringTopicURI,IEnumerablemessages){使用(varsession=GetSession(Connection)){使用(vardestination=session.CreateTopic(TopicURI)){使用(varproducer=GetProducer(session,destination)){foreach(varmessageinmessages){producer.发送(会话。CreateTextMessage(消息));}}}}}}编辑:将MQAccess类重命名为MQClient按照TRob的建议使其成为实例类。断连接方法仍然与上面列表出现的错误消息崩溃publicclassMQClient:IDisposable{publicMQConfigurationSectionHandlerConfigSettings{get;私有集;}公共IConnectionFactoryConnectionFactory{得到;私有集;}公共IConnection连接{得到;私有集;}公共IMessageConsumer消费者{得到;私有集;}公共IMessageProducer生产者{得到;私有集;}//将会话保存为用于处理和未来订阅功能的字段privateISessionProducerSession;私有ISessionConsumerSession;publicstringSubTopicName{get;私有集;}publicstringPubTopicName{get;私有集;}publicboolIsConnected{得到;私有集;}公共事件ActionConnectionError;私人行动IncomingMessageHandler;publicMQClient(stringsubTopicName,stringpubTopicName,ActionincomingMessageHandler){//不要将连接逻辑放在构造函数中。如果我们失去连接,我们可能需要重新连接。SubTopicName=subTopicName;发布话题名称=pubTopicName;IncomingMessageHandler=incomingMessageHandler;}publicstringConnect(){IsConnected=false;stringerrorMsg=string.Empty;ConfigSettings=(MQConfigurationSectionHandler)ConfigurationManager.GetSection("mq-configuration");XMSFactoryFactory工厂=XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);ConnectionFactory=factory.CreateConnectionFactory();ConnectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME,ConfigSettings.Hostname);ConnectionFactory.SetIntProperty(XMSC.WMQ_PORT,ConfigSettings.Port);ConnectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL,ConfigSettings.Channel);如果(ConfigSettings.QueueManager==string.Empty)ConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER,"");否则ConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER,ConfigSettings.QueueManager);Connection=ConnectionFactory.CreateConnection();如果(!string.IsNullOrEmpty(PubTopicName)){ProducerSession=Connection.CreateSession(false,AcknowledgeMode.AutoAcknowledge);生产者=ProducerSession.CreateProducer(ProducerSession.CreateTopic(PubTopicName));}if(!string.IsNullOrEmpty(SubTopicName)&&IncomingMessageHandler!=null){ConsumerSession=Connection.CreateSession(false,AcknowledgeMode.AutoAcknowledge);消费者=ConsumerSession.CreateConsumer(ConsumerSession.CreateTopic(SubTopicName));Consumer.MessageListener=newMessageListener(IncomingMessageHandler);}尝试{Connection.Start();Connection.ExceptionListener=newExceptionListener(ConnectionExceptionHandler);已连接=真;}catch(TypeInitializationExceptionex){errorMsg="ATypeInitializationExceptionerroroccurredwhiletryingtoconnecttoMQ.ChecktheQueueconfigurationinApp.config.theerrormessageis:"+ex.Message;}catch(IllegalStateExceptionex){errorMsg="尝试连接MQ时发生IllegalStateException错误。请检查App中的队列配置。配置。错误信息是:"+ex.Message;}returnerrorMsg;}publicvoidDisconnect(){if(Producer!=null){Producer.Close();Producer.Dispose();Producer=null;}if(ProducerSession!=null){//如果订阅持久ProducerSession.Close();ProducerSession.Dispose();ProducerSession=null;}if(Connection!=null){Connection.Stop();//if(Connection.ExceptionListener!=null)//Connection.ExceptionListener=null;//PerShashi......//if(Consumer.MessageListener!=null)//Consumer.MessageListener=null;Connection.Close();Connection.Dispose();Connection=null;}if(Consumer!=null){if(Consumer.MessageListener!=null)Consumer.MessageListener=null;Consumer.Close();Consumer.Dispose();Consumer=null;}if(ConsumerSession!=null){//如果订阅持久ConsumerSession.Close();ConsumerSession.Dispose();ConsumerSession=null;}IsConnected=fal硒;}publicvoidPublish(stringmessage){Producer.Send(ProducerSession.CreateTextMessage(message));}publicvoidPublish(string[]messages){foreach(stringmsginmessages)Publish(msg);}publicvoidConnectionExceptionHandler(Exceptionex){Disconnect();//清理if(ConnectionError!=null)ConnectionError(ex);}#regionIDisposableMembersprivatebooldisposed;publicvoidDispose(){Dispose(真);GC.SuppressFinalize(这个);}protectedvirtualvoidDispose(booldisposing){if(!this.disposed){if(disposing)Disconnect();处置=真;}}#endregion}问题出在这里->MQAccess是一个小型实用程序类。问题的第一部分询问如何判断连接是否处于活动状态。WebSphereMQ的XMS类是非Java平台的JMS规范的实现。它们非常严格地遵循JMS规范,而JMS规范在连接或会话上没有isConnected的等效项,因此XMS也没有。但是,所有GET和PUT活动都应在try/catch块中发生,以便捕获JMS异常。(从中始终打印linkedException,对吗?)当抛出JMSexception时,应用程序要么将其视为致命异常并终止,要么关闭除连接工厂之外的所有JMS对象,等待几秒钟,然后重新驱动连接序列。根据问题中的新信息进行更新:感谢您发布MQAccess类。根据问题的第2部分,这提供了对正在发生的事情的相当多的洞察力,尽管仍然没有代码显示连接关闭和重新打开的位置。但是,代码显示MQAccess类在实例化MQAccess类时创建了ICONNECTION连接的私有实例,然后将其公开为MQAccess.GetConnection。目前发布的MQAccess类没有公有或者私有的类方法可以替换连接持有的连接句柄,所以如果MQAccess.Connection.Close(),那么MQAccess类中的IConnection对象实例在连接句柄保留后将永远存在无效的。关闭连接后,MQAccess实例实际上就死了。您必须删除并重新实例化MQAccess才能获得新连接。MQAccess类确实公开了一个连接工厂,因此理论上可以从类外部调用MQAccess.GetConnection并获得一个有效的新IConnection对象,即使在关闭原始对象之后也是如此。但是,该实例将存在于MQAccess类的范围之外,因此对MQAccess的任何后续调用都将引用其已停止的实例变量连接,而不是在该类之外创建的新连接实例。如果您需要关闭并重新创建连接,您可以考虑从MQAccess中执行MQAccess。一种技术含量较低的方法可能是为连接编写MQAccess.Close()方法,这将关闭现有连接,然后立即调用connection=GetConnection();这样私有连接变量总是持有一个有效的连接句柄。如果这不能解决问题,请发布关闭并重新创建连接的代码。顺便说一句,网络连接上的非事务性会话打开了丢失或复制来自任何JMS提供程序(包括WMQ)的消息的可能性。这是你的意图吗?我在这里解释为什么这是另一个SOpost。添加T.Rob的评论。问题1:我希望您能够访问MQAccess源代码。如果是,您可以在MQAccess中公开一个属性,指示连接是否处于活动状态。如果您没有访问权限,则可能需要请求类的作者添加此属性。您可以执行以下操作来设置/重置属性。1)createConnection方法返回成功后设置属性。2)为连接设置异常侦听器。3)在异常处理程序中重置属性。如果是连接中断错误,请检查原因代码并重置属性(XMSWMQ1107和链接的异常可能有MQRC2009)。问题2如果您能告诉我们您如何关闭和重新打开连接,将会很有帮助。我关闭连接的建议是:1)首先进行connection.Stop()。2)删除所有消息监听器,基本上做一个consumer.MessageListener=null。3)然后执行connection.Close()。4)Makeaconnection=nullAdditionalinfo以下是我用于测试的示例。privatevoidOnException(Exceptionex){XMSExceptionxmsex=(XMSException)ex;Console.WriteLine("出现异常");//检查错误代码。if(xmsex.ErrorCode=="XMSWMQ1107"){Console.WriteLine("这是连接中断错误");停止处理=真;//这是一个类成员变量}}在创建连接的方法中,设置异常监听器。//创建连接.connectionWMQ=cf.CreateConnection();connectionWMQ.ExceptionListener=newExceptionListener(OnException);每当出现连接错误时,都会调用异常侦听器并将标志设置为true。好的做法是在不再需要对象时将其丢弃。存在父子关系,Consumer、Producer等是Session的孩子,Session是Connection的孩子。所以处理的顺序可以是先孩子,然后是父母。但是如果父母被处置,孩子也会自动被处置。以上就是C#学习教程:如何获取WebsphereMQ连接状态以及如何重置连接:分享的全部内容,如果对你有用,还需要进一步了解C#学习教程,希望大家多多关照多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
