Envìo de mensajes XML desde Visual Basic a cola MQ

Todo lo relacionado con MQ en ambiente OS/390 o z/OS
RobertoRC

Cadena XML en Mensaje MQ series

Mensaje por RobertoRC » 10 Abr 2008, 15:04

Saludos:

Gracias por su ayuda con su guía pude resolver mi problema de MQ, lo que hice fué generar el MessageId y asignarlo y este mismo leo en el CorrelId, me funciona bien.

Pero tengo una consulta mas que se me hace muy extraña.
Cuando hago un put en la cola envío en un string la cadena XML y debugueando mi código verifico que la cadena es correcta. Por ejemplo envío esta:
Cadena XML
-----------------------------------------------------------------------------
<xml>
<s>
<s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
</s>
</s>
<rs>
<z>
</rs>
</xml>

-----------------------------------------------------------------------------
Pero cuando se hace el get a esta cadena tiene otra cadena de mas al final esto se me hace muy raro porque en el put eso no esta, para esta cadena aumento lo siguiente:

Cadena XML obtenida con el Get
--------------------------------------------------------------------------------
<xml>
<s>
<s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
<s>
</s>
<s>
</s>
</s>
<rs>
<z>
</rs>
</xml>
F _ T 2 4 _ C o n t r a t o _ B a s i c o _ F e c h a " r s : k e y c o l u m n = " t r u e " >

<s>

</s>

<s>

< s : d a t a t y p e d t : t y p e = " s t r i n g " r s : d b t y p e = " s t r " d t : m a x L e n g t h = " 1 0 " r s : m a y b e n u l l = " f a





















-------------------------------------------------------------------------------------

Este es mi código Visual Basic para el PUT
-------------------------------------------------------------------------------------
Private Function PutQueue(ByVal pvstrPathXML As String, ByVal pvintSIIFT24Id As Integer, ByVal pvstrUsuarioId As String, ByVal pvdtmSIIFT24Fecha As Date, ByVal pvintParametrosMensajeId As Integer) As Boolean

Dim llngCompCode As Long ' Código de conexión
Dim llngReason As Long ' Razón de código
Dim lstrCC As String ' Código de conexión
Dim lstrrc As String ' Razón de código Dim xDoc As MSXML.DOMDocument
Dim lstrBuffer As String ' Buffer Mensaje
Dim lstrCadena As String ' Cadena del Mensaje
Dim lstrMenId As String ' MensajeId
Dim lmqmd As MQMD ' message descriptor
Dim lmqpmo As MQPMO ' put message options
Dim lxmlDoc As MSXML.DOMDocument ' Objeto XML

On Local Error Resume Next

PutQueue = False

fbolErrorBuffer = False
Set lxmlDoc = New MSXML.DOMDocument

If cargaXML(lxmlDoc, pvstrPathXML) Then
MQMD_DEFAULTS lmqmd
MQPMO_DEFAULTS lmqpmo
lmqpmo.Options = MQPMO_FAIL_IF_QUIESCING
If fbolRequiereResp Then
lmqmd.MsgType = MQMT_REQUEST
lmqmd.ReplyToQMgr = fstrQueueManager
lmqmd.ReplyToQ = fstrQueueResp
lmqmd.MsgId = ObtenMessageID(pvintSIIFT24Id, pvstrUsuarioId, pvdtmSIIFT24Fecha)
End If
lstrCadena = Trim(lxmlDoc.xml)
lstrBuffer = GSTR_NULL_STRING
lstrBuffer = lstrCadena
Call ActualizaFechaSolicitud(pvintSIIFT24Id, pvstrUsuarioId, pvdtmSIIFT24Fecha, pvintParametrosMensajeId)
MQPUT fHcon, fHobj, lmqmd, lmqpmo, fintBufferLen, lstrBuffer, llngCompCode, llngReason
lstrCC = llngCompCode
lstrrc = llngReason

If llngCompCode <> MQCC_OK Then
If llngReason = MQRC_BUFFER_LENGTH_ERROR Then
fstrMensajeError = "El tamaño del buffer no es suficiente " & Len(lxmlDoc.xml)
fbolErrorBuffer = True
Exit Function
End If
fstrMensajeError = "No se pudo insertar la información " & lstrrc
Exit Function
Else
lstrMenId = lmqmd.MsgId
If fbolRequiereResp Then
Call ActualizaMessageId(pvintSIIFT24Id, pvstrUsuarioId, pvdtmSIIFT24Fecha, pvintParametrosMensajeId, lstrMenId)
End If
PutQueue = True
End If
Else
fstrMensajeError = "No se pudo cargar la información del archivo XML"
Exit Function
End If

End Function
-------------------------------------------------------------------------------------
El get lo hago con otra aplicación así:
-------------------------------------------------------------------------------------
Private Sub cmdGetStructure_Click()
Dim md As MQMD ' Message descriptor
Dim gmo As MQGMO ' Put message options
Dim BufLen As Long ' Length of message to be put
Dim MessLen As Long ' Length of returned message
Dim CompCode As Long ' Completion code
Dim Reason As Long ' Reason code
Dim lstrBuffer As String * GITN_BUFFER_LEN1 ' Got message
Dim lstrCadena As String
Dim xmlDoc As New MSXML.DOMDocument
Dim PathXML As String
Dim lstrExisteArchivo As String

' Setup Get Message Options to the required values
PathXML = "C:\PruebasMQ\respu.xml"
lstrExisteArchivo = Dir(PathXML)
If Not (lstrExisteArchivo = "") Then
Kill PathXML
End If

MQGMO_DEFAULTS gmo
gmo.Options = MQGMO_WAIT + MQGMO_ACCEPT_TRUNCATED_MSG
gmo.WaitInterval = 1000

' Setup message descriptor to the required values
MQMD_DEFAULTS md


BufLen = 25000

' Show get is in progess
cmdGetStructure.Enabled = False

' Get message from the queue
MQGET gHcon, gHobj, md, gmo, BufLen, lstrBuffer, MessLen, CompCode, Reason

CC.Text = CompCode
RC.Text = Reason
lstrCadena = lstrBuffer

' Show get has ended
cmdGetStructure.Enabled = True

If CompCode = 0 Then
' Update message boxes from get data
If (GuardaXML(xmlDoc, lstrCadena, PathXML)) Then
If Not Genera_RecordSetXML(PathXML) Then
Exit Sub
Else
TbId.Text = fdbResSQLRecordSet.Fields(0).Value
TbUsuario.Text = fdbResSQLRecordSet.Fields(1).Value
TbFecha.Text = fdbResSQLRecordSet.Fields(2).Value
TbContrato.Text = fdbResSQLRecordSet.Fields(3).Value
TbStatus.Text = fdbResSQLRecordSet.Fields(4).Value
TbMessgeId.Text = md.MsgId
statusLabel.Caption = "Structure successfully retrieved from queue"
End If
End If
Else
Beep
If Reason = MQRC_NO_MSG_AVAILABLE Then
statusLabel.Caption = "The queue is empty"
Else
statusLabel.Caption = "Unable to retrieve structure from the queue"
End If
End If
End Sub
------------------------------------------------------------------------------------

Muchas gracias de antemano y espero su ayuda.
En verdad no tengo idea por que lo hace así (agregar datos de mas que no se de donde salen)

Avatar de Usuario
LuisFer
Colaborador Senior
Colaborador Senior
Mensajes: 367
Registrado: 27 May 2006, 16:06
País: España
Ciudad: Madrid
Ocupación: IT Specialist

Re: Cadena XML en Mensaje MQ series

Mensaje por LuisFer » 10 Abr 2008, 16:11

BufLen = 25000

' Get message from the queue
MQGET gHcon, gHobj, md, gmo, BufLen, lstrBuffer, MessLen, CompCode, Reason

CC.Text = CompCode
RC.Text = Reason
lstrCadena = lstrBuffer
Lista el MessLen, esa es la longitud del Mensaje, si coincide con el de la MQPUT ese es el tamaño del mensaje y deberías truncar lo que vaya dedesde 25000- Messlen.
Inicializas a Blancos lstrBuffer antes de hacer la Get?? creo que se hace con lstrBuffer = spaces(25000), es una buena practica ya que internamente VB debe reservar el area de memoria (los 25Kb) con lo que contiene en ese momento (que ahora puede ser lo del contrato y un segundo mas tarde otra cosa diferente (o lo mismo ya que puede no haberse reutilizado la memoria y se queda siempre con lo ultimo que paso por alli). No es anormal , en C puedes sobrecargar las variables, pero los resultados pueden ser como éste, impredecibles.
Tambien puedes ver el mensaje antes de recogerlo con otra aplicacion (como el SupportPac MO71 disponible en la web de IBM) y podrás comprobar de manera independiente el mensaje que has puesto en la cola
No me sigas, puedo no guiarte, no vayas delante , puedo no seguirte, caminemos juntos y sé simplemente, mi amigo.

RobertoRC

Mensaje por RobertoRC » 10 Abr 2008, 20:11

Saludos:

Muchas gracias por su guía, ya quedo solucionado.

Lo que sucedía es que ha la hora de hacer el put el tamaño del buffer lo tenía fijo, por lo que por alguna razón pasaba basura en el espacio que no ocupaba para el mensaje. Lo que hice fué determinar el tamaño del buffer según la longitud de la cadena que voy a insertar en la cola y con eso ya no me inserta basura.

De esta forma lo resolví
---------------------------------------------------------------------------------

lstrBuffer = GSTR_NULL_STRING
lstrBuffer = lxmlDoc.xml
llngBuffer = Len(lstrBuffer)
MQPUT fHcon, fHobj, lmqmd, lmqpmo, llngBuffer, lstrBuffer, llngCompCode, llngReason

-------------------------------------------------------------------------------------
Gracias

ldlbBuffel = Len(lstrBuffer)

Responder