def test_pqueue_by_servicebus_conn_str_client_iter_messages_with_abandon(live_servicebus_config, partitioned_queue):
    client = ServiceBusClient.from_connection_string(live_servicebus_config['conn_str'], debug=True)
    queue_client = client.get_queue(partitioned_queue)
    with queue_client.get_receiver(idle_timeout=5, mode=ReceiveSettleMode.PeekLock) as receiver:

        with queue_client.get_sender() as sender:
            for i in range(10):
                message = Message("Abandoned message no. {}".format(i))
                sender.send(message)

        count = 0
        for message in receiver:
            print_message(message)
            if not message.header.delivery_count:
                count += 1
                message.abandon()
            else:
                assert message.header.delivery_count == 1
                message.complete()

    assert count == 10

    with queue_client.get_receiver(idle_timeout=5, mode=ReceiveSettleMode.PeekLock) as receiver:
        count = 0
        for message in receiver:
            print_message(message)
            message.complete()
            count += 1
    assert count == 0
Пример #2
0
def test_example_create_servicebus_client(live_servicebus_config):

    client = create_servicebus_client()

    # [START create_servicebus_client_connstr]
    from azure.servicebus import ServiceBusClient
    connection_str = os.environ['SERVICE_BUS_CONNECTION_STR']

    client = ServiceBusClient.from_connection_string(connection_str)
    # [END create_servicebus_client_connstr]

    try:
        # [START get_queue_client]
        # Queue Client can be used to send and receive messages
        # from an Azure ServiceBus Service
        queue_name = 'MyQueue'
        queue_client = client.get_queue(queue_name)
        # [END get_queue_client]
    except ServiceBusResourceNotFound:
        pass

    # [START list_queues]
    queues = client.list_queues()
    # Process the queues
    for queue_client in queues:
        print(queue_client.name)
    # [END list_queues]

    try:
        # [START get_topic_client]
        # Topic Client can be used to send messages to an Azure ServiceBus Service
        topic_name = 'MyTopic'
        topic_client = client.get_topic(topic_name)
        # [END get_topic_client]
    except ServiceBusResourceNotFound:
        pass

    # [START list_topics]
    topics = client.list_topics()
    # Process topics
    for topic_client in topics:
        print(topic_client.name)
    # [END list_topics]

    try:
        # [START get_subscription_client]
        # Subscription client can receivce messages from Azure Service Bus subscription
        subscription_name = 'MySubscription'
        subscription_client = client.get_subscription(topic_name, subscription_name)
        # [END get_subscription_client]
    except ServiceBusResourceNotFound:
        pass

    # [START list_subscriptions]
    subscriptions = client.list_subscriptions(topic_name)
    # Process subscriptions
    for sub_client in subscriptions:
        print(sub_client.name)
Пример #3
0
def test_sb_client_readonly_credentials(servicebus_conn_str_readonly, standard_queue):
    client = ServiceBusClient.from_connection_string(servicebus_conn_str_readonly, debug=True)
    with pytest.raises(AzureHttpError):
        client.get_queue(standard_queue)

    client = QueueClient.from_connection_string(servicebus_conn_str_readonly, name=standard_queue)
    with client.get_receiver(idle_timeout=5) as receiver:
        messages = receiver.fetch_next()

    with pytest.raises(ServiceBusAuthorizationError):
        client.send(Message("test"))
Пример #4
0
    def test_stress_queue_check_for_dropped_messages(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, debug=False)

        stress_test = ServiceBusQueueStressTests.DroppedMessageCheckerStressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            receive_type=ReceiveType.pull,
            duration=timedelta(seconds=3000))

        result = stress_test.run()
        assert (result.total_sent > 0)
        assert (result.total_received > 0)
Пример #5
0
def send_service_bus_message(service_bus_connection_string, service_bus_queue_name, correlation_id):
    with open(CREATE_WORKSPACE_REQUEST_DATA_FILE, "r") as file:
        data = file.read().replace('\n', '')

    service_bus_client = ServiceBusClient.from_connection_string(
        conn_str=service_bus_connection_string, logging_enable=True)

    with service_bus_client:
        queue_sender = service_bus_client.get_queue_sender(queue_name=service_bus_queue_name)

        with queue_sender:
            message = ServiceBusMessage(body=data, correlation_id=correlation_id)
            queue_sender.send_messages(message)
            print(f"Service Bus message sent to queue: {data}")
Пример #6
0
    def test_stress_queue_send_and_receive(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string,
            logging_enable=LOGGING_ENABLE)

        stress_test = StressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            duration=timedelta(seconds=60))

        result = stress_test.run()
        assert (result.total_sent > 0)
        assert (result.total_received > 0)
Пример #7
0
    def test_stress_queue_long_renew_send_and_receive(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, debug=False)

        stress_test = ServiceBusQueueStressTests.LongRenewStressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            duration=timedelta(seconds=3000),
            send_delay=300)

        result = stress_test.run()
        assert (result.total_sent > 0)
        assert (result.total_received > 0)
Пример #8
0
    def test_sb_client_readonly_credentials(
            self, servicebus_authorization_rule_connection_string,
            servicebus_queue, **kwargs):
        client = ServiceBusClient.from_connection_string(
            servicebus_authorization_rule_connection_string)

        with client:
            with client.get_queue_receiver(servicebus_queue.name) as receiver:
                messages = receiver.receive_messages(max_message_count=1,
                                                     max_wait_time=1)

            with pytest.raises(ServiceBusAuthorizationError):
                with client.get_queue_sender(servicebus_queue.name) as sender:
                    sender.send_messages(ServiceBusMessage("test"))
    def test_session_by_servicebus_client_renew_client_locks(
            self, servicebus_namespace_connection_string, servicebus_queue,
            **kwargs):
        with ServiceBusClient.from_connection_string(
                servicebus_namespace_connection_string,
                logging_enable=False) as sb_client:

            session_id = str(uuid.uuid4())
            messages = []
            locks = 3
            with sb_client.get_queue_receiver(servicebus_queue.name,
                                              session_id=session_id,
                                              prefetch=10) as receiver:
                with sb_client.get_queue_sender(
                        servicebus_queue.name) as sender:
                    for i in range(locks):
                        message = Message("Test message no. {}".format(i),
                                          session_id=session_id)
                        sender.send(message)

                messages.extend(receiver.receive())
                recv = True
                while recv:
                    recv = receiver.receive(max_wait_time=5)
                    messages.extend(recv)

                try:
                    for m in messages:
                        with pytest.raises(TypeError):
                            expired = m.expired
                        assert m.locked_until_utc is None
                        assert m.lock_token is not None
                    time.sleep(5)
                    initial_expiry = receiver.session._locked_until_utc
                    receiver.session.renew_lock()
                    assert (receiver.session._locked_until_utc -
                            initial_expiry) >= timedelta(seconds=5)
                finally:
                    messages[0].complete()
                    messages[1].complete()

                    # This magic number is because of a 30 second lock renewal window.  Chose 31 seconds because at 30, you'll see "off by .05 seconds" flaky failures
                    # potentially as a side effect of network delays/sleeps/"typical distributed systems nonsense."  In a perfect world we wouldn't have a magic number/network hop but this allows
                    # a slightly more robust test in absence of that.
                    assert (receiver.session._locked_until_utc -
                            utc_now()) <= timedelta(seconds=60)
                    time.sleep((receiver.session._locked_until_utc -
                                utc_now()).total_seconds())
                    with pytest.raises(SessionLockExpired):
                        messages[2].complete()
def test_sb_client_readonly_credentials(servicebus_conn_str_readonly,
                                        standard_queue):
    client = ServiceBusClient.from_connection_string(
        servicebus_conn_str_readonly, debug=True)
    with pytest.raises(AzureHttpError):
        client.get_queue(standard_queue)

    client = QueueClient.from_connection_string(servicebus_conn_str_readonly,
                                                name=standard_queue)
    with client.get_receiver(idle_timeout=5) as receiver:
        messages = receiver.fetch_next()

    with pytest.raises(ServiceBusAuthorizationError):
        client.send(Message("test"))
Пример #11
0
    def test_sb_client_bad_entity(self, servicebus_namespace_connection_string, **kwargs):

        client = ServiceBusClient.from_connection_string(servicebus_namespace_connection_string)

        with client:
            with pytest.raises(ServiceBusAuthenticationError):
                with client.get_queue_sender("invalid") as sender:
                    sender.send_messages(ServiceBusMessage("test"))

        fake_str = "Endpoint=sb://mock.servicebus.windows.net/;" \
                   "SharedAccessKeyName=mock;SharedAccessKey=mock;EntityPath=mockentity"
        fake_client = ServiceBusClient.from_connection_string(fake_str)

        with pytest.raises(ValueError):
            fake_client.get_queue_sender('queue')

        with pytest.raises(ValueError):
            fake_client.get_queue_receiver('queue')

        with pytest.raises(ValueError):
            fake_client.get_topic_sender('topic')

        with pytest.raises(ValueError):
            fake_client.get_subscription_receiver('topic', 'subscription')

        fake_client.get_queue_sender('mockentity')
        fake_client.get_queue_receiver('mockentity')
        fake_client.get_topic_sender('mockentity')
        fake_client.get_subscription_receiver('mockentity', 'subscription')

        fake_str = "Endpoint=sb://mock.servicebus.windows.net/;" \
                   "SharedAccessKeyName=mock;SharedAccessKey=mock"
        fake_client = ServiceBusClient.from_connection_string(fake_str)
        fake_client.get_queue_sender('queue')
        fake_client.get_queue_receiver('queue')
        fake_client.get_topic_sender('topic')
        fake_client.get_subscription_receiver('topic', 'subscription')
Пример #12
0
def example_create_servicebus_sender_sync():
    servicebus_client = example_create_servicebus_client_sync()
    # [START create_servicebus_sender_from_conn_str_sync]
    import os
    from azure.servicebus import ServiceBusSender
    servicebus_connection_str = os.environ['SERVICE_BUS_CONNECTION_STR']
    queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
    queue_sender = ServiceBusSender._from_connection_string(
        conn_str=servicebus_connection_str, queue_name=queue_name)
    # [END create_servicebus_sender_from_conn_str_sync]

    # [START create_servicebus_sender_from_sb_client_sync]
    import os
    from azure.servicebus import ServiceBusClient
    servicebus_connection_str = os.environ['SERVICE_BUS_CONNECTION_STR']
    queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
    servicebus_client = ServiceBusClient.from_connection_string(
        conn_str=servicebus_connection_str)
    with servicebus_client:
        queue_sender = servicebus_client.get_queue_sender(
            queue_name=queue_name)
    # [END create_servicebus_sender_from_sb_client_sync]

    # [START create_topic_sender_from_sb_client_sync]
    import os
    from azure.servicebus import ServiceBusClient
    servicebus_connection_str = os.environ['SERVICE_BUS_CONNECTION_STR']
    topic_name = os.environ['SERVICE_BUS_TOPIC_NAME']
    servicebus_client = ServiceBusClient.from_connection_string(
        conn_str=servicebus_connection_str)
    with servicebus_client:
        topic_sender = servicebus_client.get_topic_sender(
            topic_name=topic_name)
    # [END create_topic_sender_from_sb_client_sync]

    queue_sender = servicebus_client.get_queue_sender(queue_name=queue_name)
    return queue_sender
def renew_lock_with_lock_renewal_failure_callback():
    servicebus_client = ServiceBusClient.from_connection_string(
        conn_str=CONNECTION_STR)

    with servicebus_client:
        with servicebus_client.get_queue_sender(
                queue_name=QUEUE_NAME) as sender:
            sender.send_messages(Message("message"))

        with AutoLockRenew() as renewer:
            # For this sample we're going to set the renewal recurrence of the autolockrenewer to greater than the
            # service side message lock duration, to demonstrate failure.  Normally, this should not be adjusted.
            renewer._sleep_time = 40
            with servicebus_client.get_queue_receiver(
                    queue_name=QUEUE_NAME, prefetch_count=10) as receiver:

                def on_lock_renew_failure_callback(renewable, error):
                    # If auto-lock-renewal fails, this function will be called.
                    # If failure is due to an error, the second argument will be populated, otherwise
                    # it will default to `None`.
                    # This callback can be an ideal location to log the failure, or take action to safely
                    # handle any processing on the message or session that was in progress.
                    print("Intentionally failed to renew lock on {} due to {}".
                          format(renewable, error))

                received_msgs = receiver.receive_messages(max_message_count=1,
                                                          max_wait_time=5)

                for msg in received_msgs:
                    # automatically renew the lock on each message for 120 seconds
                    renewer.register(
                        msg,
                        timeout=90,
                        on_lock_renew_failure=on_lock_renew_failure_callback)
                print('Register messages into AutoLockRenew done.')

                # Cause the messages and autorenewal to time out.
                # Other reasons for renew failure could include a network or service outage.
                time.sleep(80)

                try:
                    for msg in received_msgs:
                        msg.complete()
                except MessageLockExpired as e:
                    print(
                        'Messages cannot be settled if they have timed out. (This is expected)'
                    )

                print('Lock renew failure demonstration complete.')
def notification():
    if request.method == 'POST':
        notification = Notification()
        notification.message = request.form['message']
        notification.subject = request.form['subject']
        notification.status = 'Notifications submitted'
        notification.submitted_date = datetime.utcnow()

        try:
            db.session.add(notification)
            db.session.commit()

            ##################################################
            # TODO: Refactor This logic into an Azure Function
            # Code below will be replaced by a message queue
            #################################################
            # attendees = Attendee.query.all()

            # for attendee in attendees:
            #     subject = '{}: {}'.format(attendee.first_name, notification.subject)
            #     send_email(attendee.email, subject, notification.message)

            # notification.completed_date = datetime.utcnow()
            # notification.status = 'Notified {} attendees'.format(len(attendees))
            # db.session.commit()
            # TODO Call servicebus queue_client to enqueue notification ID
            notification_id = notification.id
            servicebus_client = ServiceBusClient.from_connection_string(
                conn_str=app.config.get("SERVICE_BUS_CONNECTION_STRING"),
                logging_enable=True)

            with servicebus_client:
                sender = servicebus_client.get_queue_sender(
                    queue_name=app.config.get("SERVICE_BUS_QUEUE_NAME"))
                with sender:
                    message = ServiceBusMessage(str(notification_id))
                    sender.send_messages(message)
                    logging.info("MSG Queue sent")

            #################################################
            # END of TODO
            #################################################

            return redirect('/Notifications')
        except:
            logging.error('log unable to save notification')

    else:
        return render_template('notification.html')
Пример #15
0
def handle_filings(handler,
                   connection_string,
                   subscription_name,
                   filter_expression="1=1"):
    """Listen for new filings from Calcbench

    Pass in a function that process each filing.

    Usage::
        >>> def filing_handler(filing):
        >>>     accession_id = filing['calcbench_id']
        >>>     data = point_in_time(
        >>>             accession_id=accession_id
        >>>             all_face=True,
        >>>             all_footnotes=True,
        >>>             )
        >>>    print(data)
        >>>
        >>> handle_filings(
        >>>     filing_handler,
        >>>     connection_string=connection_string,
        >>>     subscription_name=subscription,
        >>>     filter_expression="FilingType = 'annualQuarterlyReport'",
        >>> )


    """
    sb_client = ServiceBusClient.from_connection_string(connection_string)
    subscription = sb_client.get_subscription(TOPIC, subscription_name)
    _create_filter(
        sb_client.mgmt_client,
        subscription_name=subscription_name,
        filter_expression=filter_expression,
    )

    for message in subscription.get_receiver():
        try:
            body_bytes = b"".join(message.body)
            filing = json.loads(body_bytes)
        except Exception:
            logger.exception(f"Exception Parsing {body_bytes}")
            message.complete()
        else:
            try:
                handler(filing)
            except Exception:
                logger.exception(f"Exception handling {filing}")
            else:
                message.complete()
Пример #16
0
    def test_session_by_session_client_conn_str_receive_handler_with_inactive_session(self, servicebus_namespace_connection_string, servicebus_queue, **kwargs):
        with ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, logging_enable=False) as sb_client:

            session_id = str(uuid.uuid4())
            messages = []
            with sb_client.get_queue_session_receiver(servicebus_queue.name, 
                                              session_id=session_id, 
                                              mode=ReceiveSettleMode.ReceiveAndDelete, 
                                              idle_timeout=5) as session:
                for message in session:
                    messages.append(message)

                assert not session._running
                assert len(messages) == 0
Пример #17
0
    def test_stress_queue_peek_messages(self,
                                        servicebus_namespace_connection_string,
                                        servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, debug=False)

        stress_test = ServiceBusQueueStressTests.Peekon_receiveStressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            duration=timedelta(seconds=300),
            receive_delay=30,
            receive_type=ReceiveType.none)

        result = stress_test.run()
        assert (result.total_sent > 0)
Пример #18
0
async def receiveMessage():
    with ServiceBusClient.from_connection_string(
            EQUINIX_OUTGOING_QUEUE_CONNECTION_STRING) as client:
        # max_wait_time specifies how long the receiver should wait with no incoming messages before stopping receipt.
        # Default is None; to receive forever.
        with client.get_queue_receiver(EQUINIX_OUTGOING_QUEUE) as receiver:
            for msg in receiver:  # ServiceBusReceiver instance is a generator.
                task = json.loads(json.loads(str(msg))['Task'])
                body = task["Body"]
                if 'Attachments' in body and len(body['Attachments']) > 0:
                    body['Attachments'] = await downloadAllAttachments(
                        body['Attachments'])
                # Complete the message
                # receiver.complete_message(msg)
                print(body)
Пример #19
0
def test_stress_queue_close_and_reopen():
    sb_client = ServiceBusClient.from_connection_string(
        SERVICE_BUS_CONNECTION_STR, logging_enable=LOGGING_ENABLE)
    stress_test = RestartHandlerStressTestRunner(
        senders=[sb_client.get_queue_sender(SERVICEBUS_QUEUE_NAME)],
        receivers=[sb_client.get_queue_receiver(SERVICEBUS_QUEUE_NAME)],
        duration=timedelta(seconds=300),
        receive_delay=30,
        send_delay=10,
        azure_monitor_metric=AzureMonitorMetric(
            "test_stress_queue_close_and_reopen"))

    result = stress_test.run()
    assert (result.total_sent > 0)
    assert (result.total_received > 0)
Пример #20
0
def test_stress_queue_pull_receive_timeout():
    sb_client = ServiceBusClient.from_connection_string(
        SERVICE_BUS_CONNECTION_STR, logging_enable=LOGGING_ENABLE)
    stress_test = ReceiverTimeoutStressTestRunner(
        senders=[sb_client.get_queue_sender(SERVICEBUS_QUEUE_NAME)],
        receivers=[sb_client.get_queue_receiver(SERVICEBUS_QUEUE_NAME)],
        max_wait_time=5,
        receive_type=ReceiveType.pull,
        duration=timedelta(seconds=600),
        azure_monitor_metric=AzureMonitorMetric(
            "test_stress_queue_pull_receive_timeout"))

    result = stress_test.run()
    assert (result.total_sent > 0)
    assert (result.total_received > 0)
Пример #21
0
    def result_collector(self):
        servicebus_client = SyncClient.from_connection_string(
            conn_str=self.conn_string)

        self._no_fail_create_queue(servicebus_client, self.name)
        queue_client = servicebus_client.get_queue(self.name)

        with queue_client.get_receiver(idle_timeout=0,
                                       mode=ReceiveSettleMode.ReceiveAndDelete,
                                       prefetch=1) as receiver:
            # Receive messages as a continuous generator
            for message in receiver:
                print("Recieved result: {}".format(message))
                json_data = json.loads(str(message))
                self.results.append(json_data)
    def test_session_by_servicebus_client_session_pool(
            self, servicebus_namespace_connection_string, servicebus_queue,
            **kwargs):
        messages = []
        errors = []
        concurrent_receivers = 5

        def message_processing(sb_client):
            while True:
                try:
                    with sb_client.get_queue_receiver(
                            servicebus_queue.name,
                            session_id=NEXT_AVAILABLE,
                            idle_timeout=5) as session:
                        for message in session:
                            print("Message: {}".format(message))
                            messages.append(message)
                            message.complete()
                except NoActiveSession:
                    return
                except Exception as e:
                    errors.append(e)
                    raise

        with ServiceBusClient.from_connection_string(
                servicebus_namespace_connection_string,
                logging_enable=False) as sb_client:

            sessions = [str(uuid.uuid4()) for i in range(concurrent_receivers)]

            for session_id in sessions:
                with sb_client.get_queue_sender(
                        servicebus_queue.name) as sender:
                    for i in range(20):
                        message = Message("Test message no. {}".format(i),
                                          session_id=session_id)
                        sender.send(message)

            futures = []
            with concurrent.futures.ThreadPoolExecutor(
                    max_workers=concurrent_receivers) as thread_pool:
                for _ in range(concurrent_receivers):
                    futures.append(
                        thread_pool.submit(message_processing, sb_client))
                concurrent.futures.wait(futures)

            assert not errors
            assert len(messages) == 100
Пример #23
0
    def test_session_by_conn_str_receive_handler_with_autolockrenew(self, servicebus_namespace_connection_string, servicebus_queue, **kwargs):

        session_id = str(uuid.uuid4())
        with ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, logging_enable=False) as sb_client:

            with sb_client.get_queue_sender(servicebus_queue.name) as sender:
                for i in range(10):
                    message = Message("{}".format(i), session_id=session_id)
                    sender.send(message)

            renewer = AutoLockRenew()
            messages = []
            with sb_client.get_queue_session_receiver(servicebus_queue.name, session_id=session_id, idle_timeout=5, mode=ReceiveSettleMode.PeekLock, prefetch=10) as receiver:
                renewer.register(receiver.session, timeout=60)
                print("Registered lock renew thread", receiver.session._locked_until_utc, utc_now())
                with pytest.raises(SessionLockExpired):
                    for message in receiver:
                        if not messages:
                            print("Starting first sleep")
                            time.sleep(40)
                            print("First sleep {}".format(receiver.session._locked_until_utc - utc_now()))
                            assert not receiver.session.expired
                            with pytest.raises(TypeError):
                                message.expired
                            assert message.locked_until_utc is None
                            with pytest.raises(TypeError):
                                message.renew_lock()
                            assert message.lock_token is not None
                            message.complete()
                            messages.append(message)

                        elif len(messages) == 1:
                            print("Starting second sleep")
                            time.sleep(40) # ensure renewer expires
                            print("Second sleep {}".format(receiver.session._locked_until_utc - utc_now()))
                            sleep_until_expired(receiver.session) # and then ensure it didn't slip a renew under the wire.
                            assert receiver.session.expired
                            assert isinstance(receiver.session.auto_renew_error, AutoLockRenewTimeout)
                            try:
                                message.complete()
                                raise AssertionError("Didn't raise SessionLockExpired")
                            except SessionLockExpired as e:
                                assert isinstance(e.inner_exception, AutoLockRenewTimeout)
                            messages.append(message)

            renewer.shutdown()
            assert len(messages) == 2
Пример #24
0
def example_session_ops_sync():
    servicebus_connection_str = os.environ['SERVICE_BUS_CONNECTION_STR']
    queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
    session_id = "<your session id>"

    with ServiceBusClient.from_connection_string(
            conn_str=servicebus_connection_str) as servicebus_client:
        # [START get_session_sync]
        with servicebus_client.get_queue_receiver(
                queue_name=queue_name, session_id=session_id) as receiver:
            session = receiver.session
        # [END get_session_sync]

        # [START get_session_state_sync]
        with servicebus_client.get_queue_receiver(
                queue_name=queue_name, session_id=session_id) as receiver:
            session = receiver.session
            session_state = session.get_session_state()
        # [END get_session_state_sync]

        # [START set_session_state_sync]
        with servicebus_client.get_queue_receiver(
                queue_name=queue_name, session_id=session_id) as receiver:
            session = receiver.session
            session_state = session.set_session_state("START")
        # [END set_session_state_sync]

        # [START session_renew_lock_sync]
        with servicebus_client.get_queue_receiver(
                queue_name=queue_name, session_id=session_id) as receiver:
            session = receiver.session
            session_state = session.renew_lock()
        # [END session_renew_lock_sync]

        # [START auto_lock_renew_session_sync]
        from azure.servicebus import AutoLockRenew

        lock_renewal = AutoLockRenew(max_workers=4)
        with servicebus_client.get_queue_receiver(
                queue_name=queue_name, session_id=session_id) as receiver:
            session = receiver.session
            # Auto renew session lock for 2 minutes
            lock_renewal.register(session, timeout=120)
            for message in receiver:
                process_message(message)
                message.complete()
                # [END auto_lock_renew_session_sync]
                break
Пример #25
0
    def test_stress_queue_pull_receive_timeout(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string,
            logging_enable=LOGGING_ENABLE)

        stress_test = ServiceBusQueueStressTests.ReceiverTimeoutStressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            max_wait_time=5,
            receive_type=ReceiveType.pull,
            duration=timedelta(seconds=600))

        result = stress_test.run()
        assert (result.total_sent > 0)
        assert (result.total_received > 0)
    def test_sb_client_readonly_credentials(
            self, servicebus_authorization_rule_connection_string,
            servicebus_queue, **kwargs):
        client = ServiceBusClient.from_connection_string(
            servicebus_authorization_rule_connection_string, debug=False)
        with pytest.raises(AzureHttpError):
            client.get_queue(servicebus_queue.name)

        client = QueueClient.from_connection_string(
            servicebus_authorization_rule_connection_string,
            name=servicebus_queue.name)
        with client.get_receiver(idle_timeout=5) as receiver:
            messages = receiver.fetch_next()

        with pytest.raises(ServiceBusAuthorizationError):
            client.send(Message("test"))
Пример #27
0
    def test_stress_queue_unsettled_messages(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, debug=False)

        stress_test = StressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[sb_client.get_queue_receiver(servicebus_queue.name)],
            duration=timedelta(seconds=350),
            should_complete_messages=False)

        result = stress_test.Run()
        # This test is prompted by reports of an issue where enough unsettled messages saturate a service-side cache
        # and prevent further receipt.
        assert (result.total_sent > 2500)
        assert (result.total_received > 2500)
Пример #28
0
    def test_session_by_session_client_conn_str_receive_handler_peeklock_abandon(self, servicebus_namespace_connection_string, servicebus_queue, **kwargs):
        with ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, logging_enable=False) as sb_client:

            session_id = str(uuid.uuid4())
            with sb_client.get_queue_sender(servicebus_queue.name) as sender:
                for i in range(3):
                    message = Message("Handler message no. {}".format(i), session_id=session_id)
                    sender.send(message)

            with sb_client.get_queue_session_receiver(servicebus_queue.name, session_id=session_id, prefetch=0) as receiver:
                message = receiver.next()
                assert message.sequence_number == 1
                message.abandon()
                second_message = receiver.next()
                assert second_message.sequence_number == 1
Пример #29
0
def test_stress_queue_unsettled_messages():
    sb_client = ServiceBusClient.from_connection_string(
        SERVICE_BUS_CONNECTION_STR, logging_enable=LOGGING_ENABLE)
    stress_test = StressTestRunner(
        senders=[sb_client.get_queue_sender(SERVICEBUS_QUEUE_NAME)],
        receivers=[sb_client.get_queue_receiver(SERVICEBUS_QUEUE_NAME)],
        duration=timedelta(seconds=350),
        should_complete_messages=False,
        azure_monitor_metric=AzureMonitorMetric(
            "test_stress_queue_unsettled_messages"))

    result = stress_test.run()
    # This test is prompted by reports of an issue where enough unsettled messages saturate a service-side cache
    # and prevent further receipt.
    assert (result.total_sent > 2500)
    assert (result.total_received > 2500)
Пример #30
0
def send_users(users):
    servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR, logging_enable=False)
    with servicebus_client:
        sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
        with sender:
            batch_message = sender.create_message_batch()
            for user in users:
                try:
                    mapped_user = {"id": user["id"], "name": user["displayName"], "email": user["mail"], "jobTitle": user["jobTitle"]}
                    batch_message.add_message(ServiceBusMessage(json.dumps(mapped_user)))
                    print(mapped_user)
                except ValueError:
                    # ServiceBusMessageBatch object reaches max_size.
                    # New ServiceBusMessageBatch object can be created here to send more data.
                    break
            sender.send_messages(batch_message)
def send_and_receive_defensively():
    servicebus_client = ServiceBusClient.from_connection_string(
        conn_str=CONNECTION_STR, logging_enable=True)

    for _ in range(3):  # Connection retries.
        try:
            print("Opening")
            with servicebus_client:
                sender = servicebus_client.get_queue_sender(
                    queue_name=QUEUE_NAME)
                try:
                    with sender:
                        print("Sending")
                        send_batch_messages(sender)
                except ValueError:
                    # Handler was shut down previously.  (Cannot happen in this example, shown for completeness.)
                    pass

                receiver = servicebus_client.get_queue_receiver(
                    queue_name=QUEUE_NAME)
                try:
                    with receiver:
                        print("Receiving")
                        receive_messages(receiver)
                except ValueError:
                    # Handler was shut down previously.  (Cannot happen in this example, shown for completeness.)
                    pass

                return
        except ServiceBusConnectionError:
            # An error occurred in the connection to the service.
            # This may have been caused by a transient network issue or service problem. It is recommended to retry.
            continue
        except ServiceBusAuthorizationError:
            # An error occurred when authorizing the connection to the service.
            # This may have been caused by the credentials not having the right permission to perform the operation.
            # It is recommended to check the permission of the credentials.
            raise
        except ServiceBusAuthenticationError:
            # An error occurred when authenticate the connection to the service.
            # This may have been caused by the credentials being incorrect. It is recommended to check the credentials.
            raise
        except ServiceBusCommunicationError:
            # Unable to communicate with the specified servicebus.  Ensure that the FQDN is correct,
            # and that there is no firewall or network issue preventing connectivity.
            raise
Пример #32
0
    def test_stress_queue_receive_large_batch_size(
            self, servicebus_namespace_connection_string, servicebus_queue):
        sb_client = ServiceBusClient.from_connection_string(
            servicebus_namespace_connection_string, debug=False)

        stress_test = StressTestRunner(
            senders=[sb_client.get_queue_sender(servicebus_queue.name)],
            receivers=[
                sb_client.get_queue_receiver(servicebus_queue.name,
                                             prefetch=50)
            ],
            duration=timedelta(seconds=60),
            max_batch_size=50)

        result = stress_test.Run()
        assert (result.total_sent > 0)
        assert (result.total_received > 0)
Пример #33
0
def test_stress_queue_receive_large_batch_size():
    sb_client = ServiceBusClient.from_connection_string(
        SERVICE_BUS_CONNECTION_STR, logging_enable=LOGGING_ENABLE)
    stress_test = StressTestRunner(
        senders=[sb_client.get_queue_sender(SERVICEBUS_QUEUE_NAME)],
        receivers=[
            sb_client.get_queue_receiver(SERVICEBUS_QUEUE_NAME,
                                         prefetch_count=50)
        ],
        duration=timedelta(seconds=60),
        max_message_count=50,
        azure_monitor_metric=AzureMonitorMetric(
            "test_stress_queue_receive_large_batch_size"))

    result = stress_test.run()
    assert (result.total_sent > 0)
    assert (result.total_received > 0)
Пример #34
0
def test_sb_client_writeonly_credentials(servicebus_conn_str_writeonly, standard_queue):
    client = ServiceBusClient.from_connection_string(servicebus_conn_str_writeonly)
    with pytest.raises(AzureHttpError):
        client.get_queue(standard_queue)

    client = QueueClient.from_connection_string(servicebus_conn_str_writeonly, name=standard_queue, debug=True)
    with pytest.raises(ServiceBusAuthorizationError):
        with client.get_receiver(idle_timeout=5) as receiver:
            messages = receiver.fetch_next()

    client.send([Message("test1"), Message("test2")])
    with pytest.raises(TypeError):
        client.send("cat")
    with pytest.raises(TypeError):
        client.send(1234)
    with pytest.raises(TypeError):
        client.send([1,2,3])
    with pytest.raises(TypeError):
        client.send([Message("test1"), "test2"])
Пример #35
0
def test_sb_client_wrong_conn_str(queue_servicebus_conn_str, standard_queue):
    client = ServiceBusClient.from_connection_string(queue_servicebus_conn_str)
    with pytest.raises(AzureHttpError):
        client.get_queue(standard_queue)