Accept a message that was published, process and forward

        Parameters
        ----------
        msg : tuple, (str, str, str)
            The message sent over the line. The `tuple` is of the form:
            (message_type, channel, payload).

        Notes
        -----
        This method only handles messages where `message_type` is "message".

        Raises
        ------
        ValueError
            If the channel is not known.

def callback(self, msg):
        """Accept a message that was published, process and forward

        Parameters
        ----------
        msg : tuple, (str, str, str)
            The message sent over the line. The `tuple` is of the form:
            (message_type, channel, payload).

        Notes
        -----
        This method only handles messages where `message_type` is "message".

        Raises
        ------
        ValueError
            If the channel is not known.
        """
        message_type, channel, payload = msg

        if message_type != 'message':
            return

        try:
            payload = self._decode(payload)
        except ValueError:
            # unable to decode so we cannot handle the message
            return

        if channel == self.group_pubsub:
            action_f = self.action
        elif channel in self._listening_to:
            action_f = self.job_action
        else:
            raise ValueError("Callback triggered unexpectedly by %s" % channel)

        for verb, args in payload.items():
            action_f(verb, args)