断开连接时自动连接


你瞎啊!撞我心了
2025-03-10 01:41:43 (11天前)
  1. 客户端连接到IBM 6.x.


远程
</跨度>
MQ服务器(没有选项

升级
</跨度>
7x MQ服务器)。

我试过了

如果Manager断开连接,则停止并重新连接

但这不断失去 的价值

3 条回复
  1. 0# 哈哈哈哈 | 2019-08-31 10-32



    为MQ应用程序创建重新连接逻辑非常简单。我喜欢有一个控制器类和一个工人类来处理重新连接逻辑。去看看Universal File Mover(UFM),

    http://www.capitalware.biz/ufm_overview.html

    特别是MQReceive Action。是的,UFM是用Java编写的,但Java / MQ代码和C#/ MQ代码之间也没有区别。 UFM是一个开源项目,源代码可供下载。



    特别是,请查看MQReceiveAction.java和MQGetMsg.java类。 MQReceiveAction.java是控制器类,MQGetMsg.java是工作类。 MQReceiveAction通过MQGetMsg类连接到队列管理器。发生MQException时,MQReceiveAction将通过MQGetMsg与队列管理器断开连接并休眠1分钟,然后尝试重新连接到队列管理器。




    但这会不断失去相关ID的价值。




    那么,你把它保存在一个没有被丢弃/清理的课程中吗?在我的示例中,如果我需要临时保存CorrelID,我只需让MQReceiveAction从worker类中检索它,并且当MQReceiveAction成功重新连接时,将CorrelID推送到新的worker类中。



    最好从10,000英尺处查看问题并将其分开的组件分开。


  2. 1# Moso31 | 2019-08-31 10-32



    将所有MQ方法调用放在try / catch块和catch块中总是好的,确定异常是否是连接错误,然后重新连接并重新打开之前打开的所有MQ对象。例如:




    1. public static void GetQueueName()
      {
      Hashtable mqProps = new Hashtable();
      MQQueueManager qm = null;
      String strCorrelId = 00123456789”;
      MQQueue importQ = null;

    2.     Reconnect:
    3.     try
    4.     {
    5.         mqProps.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
    6.         mqProps.Add(MQC.CHANNEL_PROPERTY, "NET.CHL");
    7.         mqProps.Add(MQC.HOST_NAME_PROPERTY, "localhost");
    8.         mqProps.Add(MQC.PORT_PROPERTY, 2099);
    9.         qm = new MQQueueManager("QM1", mqProps);
    10.     }
    11.     catch (MQException mqex)
    12.     {
    13.         // Handle any exception appropriately
    14.     }
    15.     try
    16.     {
    17.         importQ = qm.AccessQueue("Q1", MQC.MQOO_INPUT_SHARED | MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);
    18.         MQMessage mqPutMsg = new MQMessage();
    19.         mqPutMsg.WriteString("This is an import message");
    20.         mqPutMsg.CorrelationId = System.Text.Encoding.UTF8.GetBytes(strCorrelId);
    21.         MQPutMessageOptions mqpmo = new MQPutMessageOptions();
    22.         mqpmo.Options = MQC.MQPMO_NEW_CORREL_ID;
    23.         importQ.Put(mqPutMsg,mqpmo);
    24.         MQMessage respMsg = new MQMessage();
    25.         MQGetMessageOptions gmo = new MQGetMessageOptions();
    26.         gmo.WaitInterval = 3000;
    27.         gmo.Options = MQC.MQGMO_WAIT;
    28.             importQ.Get(respMsg, gmo);
    29.         }
    30.         catch (MQException ex)
    31.         {
    32.             switch(ex.ReasonCode)
    33.             {
    34.                 case MQC.MQRC_CONNECTION_BROKEN:
    35.                 case MQC.MQRC_CONNECTION_ERROR:
    36.                 case MQC.MQRC_CONNECTION_QUIESCING:
    37.                     {
    38.                         try
    39.                         {
    40.                             importQ.Close();
    41.                             qm.Disconnect();
    42.                         }
    43.                         catch (Exception ex1)
    44.                         {
    45.                             // Ignore any exception
    46.                         }
    47.                         goto Reconnect;
    48.                     }
    49.             }
    50.         }
    51.         importQ.Close();                
    52.         qm.Disconnect();
    53. }
    54. </code>

登录 后才能参与评论