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))
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)
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)
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))
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
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)