Esempio n. 1
0
    def receive_and_convert(self, destination=None, timeout=1000):
        if not self.message_converter:
            raise BaseException(
                "Couldn't receive a message, no message converter set")

        return self.message_converter.from_message(
            self.receive(destination, timeout))
Esempio n. 2
0
    def receive(self, destination=None, timeout=1000):

        if destination:
            dest = destination
        elif self.default_destination:
            dest = self.default_destination
        else:
            raise BaseException('No destination given and no default destination set')

        return self.factory.receive(dest, timeout)
Esempio n. 3
0
    def send(self, message, destination=None):
        if isinstance(message, basestring):
            message = TextMessage(message)

        if destination:
            dest = destination
        elif self.default_destination:
            dest = self.default_destination
        else:
            raise BaseException('No destination given and no default destination set')

        message.jms_destination = dest

        self.factory.send(message, dest)
Esempio n. 4
0
    def connect(self):
        with self.lock:
            if self.is_connected:
                return

            self._disconnecting = False
            conn_name = '%s(%s)' % (self.host, self.port)

            logger.info('Connecting to queue manager:`%s`, channel:`%s`'
                        ', connection info:`%s`' %
                        (self.queue_manager, self.channel, conn_name))
            self.mgr = self.mq.QueueManager(None)

            kwargs = {}
            cd = self.mq.cd()
            cd.ChannelName = self.channel
            cd.ConnectionName = conn_name.encode('utf8')
            cd.ChannelType = self.CMQC.MQCHT_CLNTCONN
            cd.TransportType = self.CMQC.MQXPT_TCP

            if self.ssl:
                if not (self.ssl_cipher_spec and self.ssl_key_repository):
                    msg = 'SSL support requires setting both ssl_cipher_spec and ssl_key_repository'
                    logger.error(msg)
                    raise BaseException(msg)

                kwargs['sco'] = self.mq.sco()
                kwargs['sco'].KeyRepository = self.ssl_key_repository
                cd.SSLCipherSpec = self.ssl_cipher_spec

            if self.use_shared_connections:
                connect_options = self.CMQC.MQCNO_HANDLE_SHARE_BLOCK
            else:
                connect_options = self.CMQC.MQCNO_HANDLE_SHARE_NONE

            try:
                self.mgr.connect_with_options(self.queue_manager,
                                              cd=cd,
                                              opts=connect_options,
                                              user=self.username,
                                              password=self.password,
                                              **kwargs)
            except self.mq.MQMIError as e:
                exc = WebSphereMQException(e, e.comp, e.reason)
                raise exc
            else:
                self.is_connected = True
                logger.info(
                    'Successfully connected to queue manager:`%s`, channel:`%s`, connection info:`%s`'
                    % (self.queue_manager, self.channel, conn_name))
Esempio n. 5
0
    def _build_md(self, message):
        md = self.mq.md()

        if self.needs_jms:
            md.Format = _WMQ_MQFMT_RF_HEADER_2

        md.CodedCharSetId = _WMQ_DEFAULT_CCSID
        md.Encoding = _WMQ_DEFAULT_ENCODING

        # Map JMS headers to MQMD

        if message.jms_message_id:
            md.MsgId = message.jms_message_id

        if message.jms_correlation_id:
            if message.jms_correlation_id.startswith(_WMQ_ID_PREFIX):
                md.CorrelId = unhexlify_wmq_id(message.jms_correlation_id)
            else:
                md.CorrelId = message.jms_correlation_id.ljust(24)[:24]

        if message.jms_delivery_mode:

            if message.jms_delivery_mode == DELIVERY_MODE_NON_PERSISTENT:
                persistence = self.CMQC.MQPER_NOT_PERSISTENT
            elif message.jms_delivery_mode == DELIVERY_MODE_PERSISTENT:
                persistence = self.CMQC.MQPER_PERSISTENT
            else:
                pattern = 'jms_delivery_mode should be DELIVERY_MODE_NON_PERSISTENT or DELIVERY_MODE_PERSISTENT, not `%r`'
                info = pattern % message.jms_delivery_mode
                logger.error(info)
                exc = BaseException(info)
                raise exc

            md.Persistence = persistence

        if message.jms_priority:
            md.Priority = message.jms_priority

        if message.jms_reply_to:
            md.ReplyToQ = message.jms_reply_to

            if self.has_debug:
                logger.debug(('Set jms_reply_to. md.ReplyToQ:`%r`,' ' message.jms_reply_to:`%r`' % (
                    md.ReplyToQ, message.jms_reply_to)))

        # jms_expiration is in milliseconds, md.Expiry is in centiseconds.
        if message.jms_expiration:
            message.jms_expiration = int(message.jms_expiration)
            if message.jms_expiration / 1000 > _WMQ_MAX_EXPIRY_TIME:
                md.Expiry = self.CMQC.MQEI_UNLIMITED
            else:
                md.Expiry = int(message.jms_expiration / 10)

        # IBM MQ provider-specific JMS headers

        jmsxgroupseq = getattr(message, 'JMSXGroupSeq', None)
        if jmsxgroupseq is not None:
            md.MsgSeqNumber = jmsxgroupseq
            md.MsgFlags |= self.CMQC.MQMF_MSG_IN_GROUP

        jmsxgroupid = getattr(message, 'JMSXGroupID', None)
        if jmsxgroupid is not None:
            if jmsxgroupid.startswith(_WMQ_ID_PREFIX):
                md.GroupId = unhexlify_wmq_id(jmsxgroupid)
            else:
                md.GroupId = jmsxgroupid.ljust(24)[:24]
            md.MsgFlags |= self.CMQC.MQMF_MSG_IN_GROUP

        report_names = 'Exception', 'Expiration', 'COA', 'COD', 'PAN', 'NAN', 'Pass_Msg_ID', 'Pass_Correl_ID', 'Discard_Msg'
        for report_name in report_names:
            report = getattr(message, 'JMS_IBM_Report_' + report_name, None)
            if report is not None:
                md.Report |= report

        # Doesn't make much sense to map feedback options as we're stuffed into
        # request messages (MQMT_REQUEST) not report messages (MQMT_REPORT)
        # but different types of messages are still possible to implement in
        # the future so let's leave it.

        jms_ibm_feedback = getattr(message, 'JMS_IBM_Feedback', None)
        if jms_ibm_feedback is not None:
            md.Feedback = jms_ibm_feedback

        jms_ibm_last_msg_in_group = getattr(message, 'JMS_IBM_Last_Msg_In_Group', None)
        if jms_ibm_last_msg_in_group is not None:
            md.MsgFlags |= self.CMQC.MQMF_LAST_MSG_IN_GROUP

        return md
Esempio n. 6
0
    def convert_and_send(self, object_, destination=None):
        if not self.message_converter:
            raise BaseException(
                "Couldn't send the message, no message converter set")

        self.send(self.message_converter.to_message(object_), destination)