-
Notifications
You must be signed in to change notification settings - Fork 18
Description
Hi, @matrober-uk
I've realized that current implementation of Receive* methods cause memory leakage. It can't be detected with pprof because of CGO
500mb on 100k received message
Little investigation below, Can prepare PR
func (consumer ConsumerImpl) receiveInternal(gmo *ibmmq.MQGMO)
returns TextMessageImpl/BytesMessageImpl with thisMessageHandle *ibmmq.MQMessageHandle
// Include the message properties in the msgHandle gmo.Options |= ibmmq.MQGMO_PROPERTIES_IN_HANDLE cmho := ibmmq.NewMQCMHO() **thisMsgHandle, _ := consumer.ctx.qMgr.CrtMH(cmho)** gmo.MsgHandle = thisMsgHandle ... msg = &TextMessageImpl{ bodyStr: msgBodyStr, MessageImpl: MessageImpl{ mqmd: getmqmd, **msgHandle: &thisMsgHandle,** }, }
and it should be closed/deleted with msgHandle.DltMH(ibmmq.NewMQDMHO()) after message has been processed
`// Delete message handler
func (msg *MessageImpl) CleanMH() jms20subset.JMSException {
if msg.msgHandle == nil {
return jms20subset.CreateJMSException("EmptyMessageHandler", "EmptyMessageHandler", nil)
}
if err := msg.msgHandle.DltMH(ibmmq.NewMQDMHO()); err != nil {
return jms20subset.CreateJMSException("UnexpectedDeleteMessageHandlerError", "UnexpectedDeleteMessageHandlerError", err)
}
return nil
}
`