|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
Invalid Length in RFH2 variable area - data skipped |
« View previous topic :: View next topic » |
Author |
Message
|
mqnet |
Posted: Tue Mar 24, 2009 10:55 pm Post subject: Invalid Length in RFH2 variable area - data skipped |
|
|
Newbie
Joined: 24 Mar 2009 Posts: 6
|
Hello All,
I am using IBM MQ Classes for .Net and built below MQmessage with RFH2 header. However, when the msg is browsed through RFHUtil, it gives me the error "Invalid Length in RFH2 variable area - data skipped".
Here is the code in VB.Net
qMsg = New MQMessage
qMsg.Format = MQC.MQFMT_RF_HEADER_2
qMsg.MessageType = MQC.MQMT_DATAGRAM 'value = 8
qMsg.CharacterSet = 1208
qMsg.Expiry = -1
Dim strMCD As String = "<mcd><Msd>jms_text</Msd></mcd>"
Dim strJMS As String = "<jms><Dst>queue://TAHRTS05/QA.HRIS.RSS.REQUEST</Dst><Tms>1227656333170</Tms><Dlv>0</Dlv></jms>"
'make the lengths multiples of 4
Dim iMCDLen As Integer = (CInt((strMCD.Length - 1) / 4)) * 4 + 4
Dim iJMSLen As Integer = (CInt((strJMS.Length - 1) / 4)) * 4 + 4
'padding of spaces
strMCD = strMCD.PadRight(iMCDLen, " ")
strJMS = strJMS.PadRight(iJMSLen, " ")
qMsg.WriteBytes(MQC.MQRFH_STRUC_ID) 'struc id
qMsg.WriteInt(MQC.MQRFH_VERSION_2) 'version
qMsg.WriteInt(MQC.MQRFH_STRUC_LENGTH_FIXED_2 + iMCDLen + iJMSLen) 'struc length
qMsg.WriteInt(MQC.MQENC_NATIVE) 'encoding
qMsg.WriteInt(MQC.MQCCSI_INHERIT) 'code character set id
qMsg.WriteBytes(MQC.MQFMT_STRING) 'format
qMsg.WriteInt(MQC.MQRFH_NO_FLAGS) 'flags
qMsg.WriteInt(1208) 'name value ccsid
'variable portion
qMsg.WriteLong(iMCDLen)
qMsg.WriteBytes(strMCD)
qMsg.WriteLong(iJMSLen)
qMsg.WriteBytes(strJMS)
qPutMsgOpts = New MQPutMessageOptions
qMsg.WriteBytes("here is the actual text")
Can anyone tell me what am I doing wrong ? I have already spent good amount of time and didn't find any reason of this error .
Thanks for any suggestions. |
|
Back to top |
|
 |
mqnet |
Posted: Thu Mar 26, 2009 9:48 am Post subject: I fixed it myself. |
|
|
Newbie
Joined: 24 Mar 2009 Posts: 6
|
Here is the solution.
qMsg = New MQMessage
'************************************************************
' FOR JMS/RFH2 HEADER
'************************************************************
'to set up JMS format - define RFH2 header
'MQMD (Message Descriptor) header
qMsg.Format = MQC.MQFMT_RF_HEADER_2 'format: MQHRF2
qMsg.MessageType = MQC.MQMT_DATAGRAM 'value = 8
qMsg.CharacterSet = 1208
qMsg.Expiry = -1
'RFH header
'Define JMS folders - it has 1) mcd 2) jms
'mcd - Message Content
'Msd - message domain
'jms - jave messaging system
'Dst - Destination
'Tms - Timestamp
'Dlv - Delivery mode
'these strings defined below must be constant, case sensitive and must be exactly the same
Dim strMCD As String = "<mcd><Msd>jms_text</Msd></mcd>"
Dim strJMS As String = "<jms><Dst>queue://" & qManager & "/" & qName & "</Dst><Tms>" & DateTime.Now.ToString("HHmmssffff") & "</Tms><Dlv>2</Dlv></jms>"
'get the byte length of the above strings
Dim strMCDBytes As Byte() = Text.Encoding.ASCII.GetBytes(strMCD)
Dim strJMSBytes As Byte() = Text.Encoding.ASCII.GetBytes(strJMS)
Dim strMsgBytes As Byte() = Text.Encoding.ASCII.GetBytes(message)
'those lengths have to be in multiples of 4
'this can be achieved by adding spaces and making their lengths multiples of 4
Dim iMCDLen As Integer = (CInt((strMCDBytes.Length - 1) / 4)) * 4 + 4 '32
Dim iJMSLen As Integer = (CInt((strJMSBytes.Length - 1) / 4)) * 4 + 4 '96
Dim iMsgLen As Integer = (CInt((strMsgBytes.Length - 1) / 4)) * 4 + 4
'padding of spaces
strMCD = strMCD.PadRight(iMCDLen, " ")
strJMS = strJMS.PadRight(iJMSLen, " ")
'RFH Header - fixed portion
qMsg.WriteString(MQC.MQRFH_STRUC_ID) 'struc id : MQRFH_STRUC_ID
qMsg.WriteInt4(MQC.MQRFH_VERSION_2) 'version : MQC.MQRFH_VERSION_2
'struc length : MQC.MQRFH_STRUC_LENGTH_FIXED_2 + JMS folders(mcd, jms) length + add 4 bytes for each folder mdc - 4, jms - 4
qMsg.WriteInt4(MQC.MQRFH_STRUC_LENGTH_FIXED_2 + iMCDLen + iJMSLen + 4 + 4)
qMsg.WriteInt4(MQC.MQENC_NATIVE) 'encoding : MQC.MQENC_NATIVE
qMsg.WriteInt4(MQC.MQCCSI_INHERIT) 'code character set id : MQC.MQCCSI_INHERIT
qMsg.WriteString(MQC.MQFMT_STRING) 'format: MQSTR
qMsg.WriteInt4(MQC.MQRFH_NO_FLAGS) 'flags: 0
qMsg.WriteInt4(1208) 'name value ccsid : 1208 = UTF-8
''RFH Header - variable portion
qMsg.WriteInt4(iMCDLen) 'namevaluelength
qMsg.WriteString(strMCD) 'namevaluedata
qMsg.WriteInt4(iJMSLen) 'namevaluelength
qMsg.WriteString(strJMS) 'namevaluedata
'************************************************************
'JMS/RFH2 header ends here
'************************************************************
qPutMsgOpts = New MQPutMessageOptions
qMsg.Write(System.Text.Encoding.ASCII.GetBytes(message)) 'actual msg from xml
' Place the message on the queue, using default put message options. |
|
Back to top |
|
 |
fjb_saper |
Posted: Thu Mar 26, 2009 2:51 pm Post subject: |
|
|
 Grand High Poobah
Joined: 18 Nov 2003 Posts: 20756 Location: LI,NY
|
Or you could use the XMS package that does all the RFH handling for you.  _________________ MQ & Broker admin |
|
Back to top |
|
 |
|
|
 |
|
Page 1 of 1 |
|
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
|
|
|
|