Веб-API Visual Basic использует сообщения серии mq, но никогда не освобождает соединение - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над устаревшей системой, и мне было поручено изменить API-интерфейс Visual Basic, который использует серию mq (теперь она называется IBM websphere) для отправки и получения данных из системы мэйнфреймов.Мой сетевой администратор сообщил мне, что он видит 97 соединений из API.На уровне администратора очередей максимальное число каналов установлено равным 100. Он говорит, что это нормально, но проблема в том, что API устанавливает соединение с клиентским каналом, но никогда не освобождает его.Я бы предположил, что должно быть действие close (), которое я могу выполнить, как только получу ответ из очереди, но я не знаю, какой будет синтаксис.Это код, который я выполняю для отправки и получения данных:

    Dim passedmqRequest = mqRequest
    Dim Session_mq_put_array As Object
    Dim Session_mq_get_array As Object
    Dim Session_MqResponse As String = ""
    Dim Session_error_code As String = ""
    Dim Session_plan_id As String = Mid(passedmqRequest, 15, 4)

    Dim ipAddress As String = "xxx.xxx.xxx.xxx"

    Dim mq_get_error As String = "N"
    Dim mq_put_array(2) As String
    Dim mq_get_array(2) As String
    Dim Response_queue As String = ""
    Dim Response_queue_mgt As String = ""

    ' send messages to TOSSMQT1
    Response_queue = "ARI.GW1TEST.RESPONSES"
    Response_queue_mgt = "ARIT"
    mq_put_array(0) = "ARI.TEST.QUEUE"
    Response_queue = "ARI.TEST.RESPONSES"
    mq_put_array(1) = "VRU4300b"
    mq_put_array(2) = "SVRCONN//" & ipAddress & "(1414)" '* internal
    mq_put_array(2) = "SVRCONN//" & ipAddress & "(1414)" '* internal
    Session_mq_put_array = mq_put_array

    mq_get_array(0) = "ARI.TEST.HOST.RESPONSES"
    mq_get_array(1) = "VRU4300b"
    mq_get_array(2) = "SVRCONN//" & ipAddress & "(1414)" '* internal
    mq_get_array(2) = "SVRCONN//" & ipAddress & "(1414)" '* internal
    Session_mq_get_array = mq_get_array

    Dim CmdArgs() As String
    CmdArgs = Session_mq_put_array

    Dim CmdResponse() As String
    CmdResponse = Session_mq_get_array

    Dim mqQMgr As MQQueueManager            '* MQQueueManager instance 
    Dim mqQueue As MQQueue                  '* MQQueue instance 
    Dim responseQueue As MQQueue

    Dim mqMsg As MQMessage                  '* MQMessage instance 
    Dim responseMSG As MQMessage
    Dim mqPutMsgOpts As MQPutMessageOptions '* MQPutMessageOptions instance 
    Dim queueName As String                 '* Name of queue to use 
    Dim responsequeueName As String         '* Name of response queue to use 
    Dim message As String                   '* Message buffer 

    Dim mqError As String = ""

    queueName = CmdArgs.GetValue(0)
    responsequeueName = CmdResponse(0)

    '* 
    '* Try to create an MQQueueManager instance 
    '* 
    Dim channelDefinition As String = CmdArgs.GetValue(2)
    Dim channelName As String = ""
    Dim transportType As String = ""
    Dim connectionName As String = ""
    Dim separator As Char() = "/"
    Dim parts As String()
    Try
        '* queue name, queue manager name, channel definition all provided 
        '* Break down the channel definition, 
        '* which is of the form "channel-name/transport-type/connection-name". 
        channelDefinition = CmdArgs.GetValue(2)
        parts = channelDefinition.Split(separator)
        If (parts.Length > 0) Then
            channelName = parts(0)
        End If
        If (parts.Length > 1) Then
            transportType = parts(1)
        End If
        If (parts.Length > 2) Then
            connectionName = parts(2)
        End If
        mqQMgr = New MQQueueManager(CmdArgs.GetValue(1), channelName, connectionName)
        Try
            mqQueue = mqQMgr.AccessQueue(queueName, MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING)     '* open queue for output but not if MQM stopping 
            message = passedmqRequest
            '* put the next message to the queue 
            mqMsg = New MQMessage()
            mqMsg.WriteString(message)
            mqMsg.Format = MQC.MQFMT_STRING
            mqPutMsgOpts = New MQPutMessageOptions()
            mqMsg.ReplyToQueueName = Response_queue
            mqMsg.ReplyToQueueManagerName = Response_queue_mgt
            Try
                mqQueue.Put(mqMsg, mqPutMsgOpts)
                responseQueue = mqQMgr.AccessQueue(mq_get_array(0), MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING)
                Dim MQGetMessageOptions As New MQGetMessageOptions()
                MQGetMessageOptions.Options = IBM.WMQ.MQC.MQGMO_WAIT + IBM.WMQ.MQC.MQGMO_FAIL_IF_QUIESCING + IBM.WMQ.MQC.MQGMO_CONVERT
                MQGetMessageOptions.WaitInterval = 20000
                MQGetMessageOptions.MatchOptions = MQC.MQMO_MATCH_MSG_ID

                responseMSG = New MQMessage
                responseMSG.MessageId = mqMsg.MessageId
                Try
                    responseQueue.Get(responseMSG, MQGetMessageOptions)
                    Session_MqResponse = responseMSG.ReadString(responseMSG.DataLength)
                    Session_error_code = "0"
'
'  at this point a response has been received and I should close
'  the client channel connection
'
                Catch mqe As MQException
                    '* report the error 
                    Session_MqResponse = "MQQueue::get ended with " & mqe.Message & "<br/>"
                    mq_get_error = "Y"
                    Session_error_code = "1"
                End Try
            Catch mqe As MQException
                '* report the error 
                Session_MqResponse = "MQQueue::Put ended with " & mqe.Message & "<br/>"
                Session_error_code = "2"
            End Try
        Catch mqe As MQException
            '* stop if failed 
            Session_MqResponse = "MQQueueManager::AccessQueue ended with error message = " & mqe.Message & "<br/>"
            Session_MqResponse = Session_MqResponse & "create of MQQueueManager ended with error reason = " & mqe.Reason & "<br/>"
            Session_error_code = "3"
        End Try
    Catch mqe As MQException
        '* stop if failed 
        Session_MqResponse = "create of MQQueueManager ended with error message = " & mqe.Message & "<br/>"
        Session_MqResponse = Session_MqResponse & "create of MQQueueManager ended with error reason = " & mqe.Reason & "<br/>"
        Session_error_code = "4"
    End Try

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Просмотр вашего кода:

mqQMgr = New MQQueueManager(...)

Это создает объект MQQueueManager, но также подключается к администратору очередей назначения в качестве клиентского подключения - это будут подключения, о которых администратор сети говорит

mqQueue = mqQMgr.AccessQueue(queueName, MQC.MQOO_OUTPUT, ...)

Это открывает очередь в администраторе очередей назначения для вывода

responseQueue = mqQMgr.AccessQueue(mq_get_array(0), MQC.MQOO_INPUT_SHARED, ...)

Это открывает очередь в администраторе очереди назначения для ввода.

На данный момент у вас есть 2очереди и одно соединение открываются в администраторе очередей назначения.Если вы просто загляните в другой код, то вы держите ресурсы на сервере.Насколько я понимаю, когда объекты выходят из области видимости, они будут уничтожены, но я могу ошибаться в этом языке (из практики!).

Чтобы явно освободить ресурсы, вам нужно просто закрытьСоединение qmgr (как и любые очереди, которые оно содержит, будет освобождено) с соответствующей проверкой ошибок:

mqQMgr.Disconnect()

Если вы действительно хотите явно очистить очереди, а затем менеджер очередей, вы можете сделать следующее перед отключением(с соответствующей проверкой ошибок):

mqQueue.Close()
responseQueue.Close()
0 голосов
/ 19 сентября 2018

IBM говорит закрыть очередь, когда вы закончите с ней.

Итак,

queueName.Close ()

Доступ к очередям и темам

Надеюсь, это поможет.

...