code: func NewMessageStoreExpirable(pol common.MessageReplacingPolicy, trigger invalidationTrigger, msgTTL time.Duration, externalLock func(), externalUnlock func(), externalExpire func(interface{})) MessageStore {
  	store := newMsgStore(pol, trigger)
  	store.msgTTL = msgTTL
  
  	if externalLock != nil {
  		store.externalLock = externalLock
  	}
  
  	if externalUnlock != nil {
  		store.externalUnlock = externalUnlock
  	}
  
  	if externalExpire != nil {
  		store.expireMsgCallback = externalExpire
  	}
  
  	go store.expirationRoutine()
  	return store
  }
docs: // NewMessageStoreExpirable returns a new MessageStore with the message replacing
  // policy and invalidation trigger passed. It supports old message expiration after msgTTL, during expiration first external
  // lock taken, expiration callback invoked and external lock released. Callback and external lock can be nil.