DefStream-RabbitMQ 0.1.24__tar.gz → 0.1.26__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/PKG-INFO +2 -2
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/build/RabbitMQ/DefStream_RabbitMQ.egg-info/SOURCES.txt +30 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/README.en.md +1 -1
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/README.md +1 -1
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/RabbitMQ.en.md +125 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/RabbitMQ.md +116 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Tasks.en.md +40 -3
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Tasks.md +38 -3
- defstream_rabbitmq-0.1.26/issues/feature/55/CHANGELOG.md +7 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/IMPLEMENTS.md +26 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/PLAN.md +77 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/README.md +81 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/REQUIREMENTS.md +67 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/TASKS.md +22 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/implements/1793714914193.md +7 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/implements/1793717149425.md +7 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/tasks/1793705387888.md +7 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/tasks/1793714914194.md +9 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/tasks/1793715537355.md +5 -0
- defstream_rabbitmq-0.1.26/issues/feature/55/tasks/1793717149426.md +9 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/CHANGELOG.md +26 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/IMPLEMENTS.md +26 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/PLAN.md +175 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/README.md +69 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/REQUIREMENTS.md +122 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/TASKS.md +35 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/implements/1793777682327.md +8 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/implements/1793778339166.md +7 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793772101827.md +17 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793774701691.md +13 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793775544541.md +13 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793775771772.md +13 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793777337621.md +15 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793777847993.md +11 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793778003070.md +21 -0
- defstream_rabbitmq-0.1.26/issues/feature/62/tasks/1793778440735.md +9 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/RabbitMQ/Sample.Stream.py +7 -11
- defstream_rabbitmq-0.1.26/samples/Broker/RabbitMQ/Sample.Timer.py +90 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Connection.py +35 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Connection.py +37 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/__init__.py +2 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/__init__.py +6 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Message.py +93 -13
- defstream_rabbitmq-0.1.26/tests/rabbitmq/test_rabbitmq_timers.py +288 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_protocol_contracts.py +99 -2
- defstream_rabbitmq-0.1.26/tests/test_task_messages.py +533 -0
- defstream_rabbitmq-0.1.24/tests/test_task_messages.py +0 -251
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.dev/scripts/editable_view.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.dev/scripts/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.dev/scripts/tests/test_editable_view.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.distribution-target +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/ISSUE_TEMPLATE/01.feature.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/ISSUE_TEMPLATE/02.bug.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/ISSUE_TEMPLATE/03.fix.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/ISSUE_TEMPLATE/04.task.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/build_backend.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/build_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/check_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/create-issues-from-reviews.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/create-pr-from-issue.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/prepare_upload.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/run_core_tests.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/create-issues-from-reviews.test.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/create-pr-from-issue.test.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/test_build_backend.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/test_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/scripts/tests/test_release.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/workflows/ci.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/workflows/create-issues-from-reviews.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.github/workflows/create-pr-from-issue.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/.gitignore +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/LICENSE +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/README.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/README.setup.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Contracts.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Contracts.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/GettingStarted.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/GettingStarted.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/LifecycleHooks.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/LifecycleHooks.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Operations.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Operations.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Packaging.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Packaging.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Redis.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/docs/Redis.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/instructions/CODE.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/instructions/DOCS.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/instructions/README.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/bug/16/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/bug/16/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/bug/16/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/bug/16/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/1/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/1/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/1/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/1/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/1/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793274693488.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793275218996.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793275899489.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793276075771.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793276518340.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793277364116.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793278267422.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793278764701.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/implements/1793279849390.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793272872217.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793274121654.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793274231988.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793275218995.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793275501812.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793275955973.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793276099601.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793276518341.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793277424063.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793278267423.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793278764702.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/46/tasks/1793279849391.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/implements/1793271568985.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/implements/1793272077065.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/tasks/1793271236067.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/tasks/1793271384432.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/tasks/1793271506089.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/tasks/1793271819682.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/47/tasks/1793272077066.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/8/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/8/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/8/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/feature/8/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/10/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/10/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/10/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/13/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/21/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/21/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/21/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/21/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/24/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/24/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/24/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/24/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/25/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/25/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/25/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/25/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/25/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/26/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/26/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/26/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/26/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/29/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/29/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/29/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/29/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/3/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/3/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/3/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/3/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/implements/1793257519898.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/implements/1793257826069.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/tasks/1793256929057.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/tasks/1793256990072.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/tasks/1793257216492.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/tasks/1793257519899.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/41/tasks/1793257826068.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/implements/1793260818660.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/implements/1793261447018.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/tasks/1793260818661.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/tasks/1793261447019.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/43/tasks/1793262314955.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/implements/1793282630353.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/50/tasks/1793282630354.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793294516720.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793295445979.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793295838896.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793296500296.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793299630936.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793301537859.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793301829543.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793302547669.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793327181557.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793329241422.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793516005517.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793516879583.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793517548589.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/implements/1793518878753.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793294230195.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793295445976.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793295838893.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793296500299.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793297795667.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793299630939.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793301829546.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793302844699.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793327181558.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793327685707.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793328011412.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793329241423.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793516005518.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793516879584.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793517548590.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/53/tasks/1793518878754.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/6/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/6/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/fix/6/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/18/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/18/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/18/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/32/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/34/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/34/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/34/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/34/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/34/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/36/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/36/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/36/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/36/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/36/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/docs/CopilotReviewIssues.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/docs/CopilotReviewIssuesSetup.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/implements/1793291844133.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/tasks/1793291844134.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/38/tasks/1793292234123.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793623390266.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793625464717.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793626388737.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793626820522.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793627348502.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793628366252.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793629199999.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/implements/1793631035346.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793620359610.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793621161604.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793621502459.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793621903677.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793623390265.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793625269565.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793626388737.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793626820522.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793627348502.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793627590185.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793628366252.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793629199998.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/39/tasks/1793631035345.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/implements/1793395003714.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/tasks/1793395003713.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/issues/task/57/tasks/1793395058100.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/pyproject.toml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/rabbitmq/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/rabbitmq/enabled_plugins +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/rabbitmq/rabbitmq-3.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/rabbitmq/rabbitmq-4.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/redis/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/redis/redis-6.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/res/docker/redis/redis-7.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/RabbitMQ/Sample.RPC.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/RabbitMQ/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/Redis/Sample.Stream.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/Redis/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Broker/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Worker/RabbitMQ/Client.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Worker/RabbitMQ/Tasks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Worker/RabbitMQ/Worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Worker/Redis/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/samples/Worker/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/setup.cfg +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/setup.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Errors.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Exchange.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Queue.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Serializer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Stream.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/RabbitMQ/Subscription.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Connection.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Queue.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Serializer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/Subscription.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/Redis/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Implements/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Priority.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Broker/Protocol.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Descriptor/DataObject.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Descriptor/Types.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Descriptor/Value.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Descriptor/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extension.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Metrics.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Ping.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Play.html +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Status.html +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/Status.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Extensions/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/Response.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Inspector/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Pattern.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Array.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Common.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Compare.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Condition.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/DataObject.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/DateTime.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Number.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Object.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Size.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/String.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/Type.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Patterns/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Validate.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/Validator.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Validator/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Executor.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Pool.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Run.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Specification.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Startup.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/Worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/Worker/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/src/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/_support.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/_support_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/_support_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/_support_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_broker_methods.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_rpc.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_rpc_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_timeouts.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_rabbitmq_worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/rabbitmq/test_task_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_redis.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_redis_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_redis_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/redis/test_task_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_broker_packaging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_descriptor.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_inspector_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_lifecycle_hooks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_pool_callbacks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_process_signals.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_runner_hooks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_status.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_status_ui.cjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_validator_patterns.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_worker_recovery.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.26}/tests/test_worker_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DefStream-RabbitMQ
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.26
|
|
4
4
|
Summary: Synchronous message processing with pluggable broker adapters
|
|
5
5
|
Home-page: https://github.com/yong5eon/DefStream
|
|
6
6
|
Author: Heo Yongseon
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
|
-
Requires-Dist: DefStream==0.1.
|
|
19
|
+
Requires-Dist: DefStream==0.1.26
|
|
20
20
|
Requires-Dist: pika>=1.3.2
|
|
21
21
|
Dynamic: author
|
|
22
22
|
Dynamic: classifier
|
|
@@ -100,6 +100,34 @@ issues/feature/47/tasks/1793271384432.md
|
|
|
100
100
|
issues/feature/47/tasks/1793271506089.md
|
|
101
101
|
issues/feature/47/tasks/1793271819682.md
|
|
102
102
|
issues/feature/47/tasks/1793272077066.md
|
|
103
|
+
issues/feature/55/CHANGELOG.md
|
|
104
|
+
issues/feature/55/IMPLEMENTS.md
|
|
105
|
+
issues/feature/55/PLAN.md
|
|
106
|
+
issues/feature/55/README.md
|
|
107
|
+
issues/feature/55/REQUIREMENTS.md
|
|
108
|
+
issues/feature/55/TASKS.md
|
|
109
|
+
issues/feature/55/implements/1793714914193.md
|
|
110
|
+
issues/feature/55/implements/1793717149425.md
|
|
111
|
+
issues/feature/55/tasks/1793705387888.md
|
|
112
|
+
issues/feature/55/tasks/1793714914194.md
|
|
113
|
+
issues/feature/55/tasks/1793715537355.md
|
|
114
|
+
issues/feature/55/tasks/1793717149426.md
|
|
115
|
+
issues/feature/62/CHANGELOG.md
|
|
116
|
+
issues/feature/62/IMPLEMENTS.md
|
|
117
|
+
issues/feature/62/PLAN.md
|
|
118
|
+
issues/feature/62/README.md
|
|
119
|
+
issues/feature/62/REQUIREMENTS.md
|
|
120
|
+
issues/feature/62/TASKS.md
|
|
121
|
+
issues/feature/62/implements/1793777682327.md
|
|
122
|
+
issues/feature/62/implements/1793778339166.md
|
|
123
|
+
issues/feature/62/tasks/1793772101827.md
|
|
124
|
+
issues/feature/62/tasks/1793774701691.md
|
|
125
|
+
issues/feature/62/tasks/1793775544541.md
|
|
126
|
+
issues/feature/62/tasks/1793775771772.md
|
|
127
|
+
issues/feature/62/tasks/1793777337621.md
|
|
128
|
+
issues/feature/62/tasks/1793777847993.md
|
|
129
|
+
issues/feature/62/tasks/1793778003070.md
|
|
130
|
+
issues/feature/62/tasks/1793778440735.md
|
|
103
131
|
issues/feature/8/IMPLEMENTS.md
|
|
104
132
|
issues/feature/8/README.md
|
|
105
133
|
issues/feature/8/REQUIREMENTS.md
|
|
@@ -280,6 +308,7 @@ res/docker/redis/redis-7.yml
|
|
|
280
308
|
samples/Broker/Sample.py
|
|
281
309
|
samples/Broker/RabbitMQ/Sample.RPC.py
|
|
282
310
|
samples/Broker/RabbitMQ/Sample.Stream.py
|
|
311
|
+
samples/Broker/RabbitMQ/Sample.Timer.py
|
|
283
312
|
samples/Broker/RabbitMQ/Sample.py
|
|
284
313
|
samples/Broker/Redis/Sample.Stream.py
|
|
285
314
|
samples/Broker/Redis/Sample.py
|
|
@@ -390,6 +419,7 @@ tests/rabbitmq/test_rabbitmq_priorities.py
|
|
|
390
419
|
tests/rabbitmq/test_rabbitmq_rpc.py
|
|
391
420
|
tests/rabbitmq/test_rabbitmq_rpc_integration.py
|
|
392
421
|
tests/rabbitmq/test_rabbitmq_timeouts.py
|
|
422
|
+
tests/rabbitmq/test_rabbitmq_timers.py
|
|
393
423
|
tests/rabbitmq/test_rabbitmq_worker.py
|
|
394
424
|
tests/rabbitmq/test_specifications.py
|
|
395
425
|
tests/rabbitmq/test_task_messages.py
|
|
@@ -35,5 +35,5 @@ Messages published by a producer pass through the broker to a Worker Consumer, a
|
|
|
35
35
|
- [Lifecycle hooks](./LifecycleHooks.en.md): hook order and resource management across Workers, pools, and tasks
|
|
36
36
|
- [Request/reply contracts and validation](./Contracts.en.md): schemas, validators, and task contracts
|
|
37
37
|
- [Operations and monitoring](./Operations.en.md): Inspector, logging, and operational broker considerations
|
|
38
|
-
- [RabbitMQ](./RabbitMQ.en.md): queues, exchanges, streams, RPC, and RabbitMQ workers
|
|
38
|
+
- [RabbitMQ](./RabbitMQ.en.md): queues, exchanges, streams, RPC, connection timers, and RabbitMQ workers
|
|
39
39
|
- [Redis Streams](./Redis.en.md): messages, consumer groups, acknowledgements, and Redis workers
|
|
@@ -35,5 +35,5 @@ Producer가 발행한 메시지는 브로커를 거쳐 Worker의 Consumer로 전
|
|
|
35
35
|
- [생명주기 훅](./LifecycleHooks.md): Worker·풀·작업 훅의 실행 순서와 자원 관리
|
|
36
36
|
- [요청·응답 계약과 검증](./Contracts.md): 스키마, validator와 작업 계약
|
|
37
37
|
- [운영과 모니터링](./Operations.md): Inspector, 로깅, 브로커 선택과 운영 고려사항
|
|
38
|
-
- [RabbitMQ](./RabbitMQ.md): 큐, Exchange, 스트림, RPC
|
|
38
|
+
- [RabbitMQ](./RabbitMQ.md): 큐, Exchange, 스트림, RPC, 연결 타이머와 RabbitMQ Worker
|
|
39
39
|
- [Redis Streams](./Redis.md): 메시지, consumer group, ACK와 Redis Worker
|
|
@@ -88,6 +88,116 @@ Call `ack()` on success, `nack()` for redelivery, or `reject()` to reject.
|
|
|
88
88
|
Rejected messages go to the broker-configured dead-letter destination or are
|
|
89
89
|
discarded when none is configured.
|
|
90
90
|
|
|
91
|
+
### Connection timers
|
|
92
|
+
|
|
93
|
+
RabbitMQ connections support the optional `SetTimer` protocol.
|
|
94
|
+
`set_timer(cb, seconds)` schedules a one-shot callback using integer seconds
|
|
95
|
+
from registration and returns a cancelable `Timer`. The callback takes no
|
|
96
|
+
arguments and returns no value. Code using a connection can check support
|
|
97
|
+
with `isinstance(connection, SetTimer)`. Timer support is not required by
|
|
98
|
+
the base `Connection` contract or Redis connections.
|
|
99
|
+
|
|
100
|
+
This example consumes an empty queue and stops consumption from a callback
|
|
101
|
+
after five seconds. It requires local RabbitMQ and leaves
|
|
102
|
+
`defstream.example.timer` in place. Messages sent to this queue by other
|
|
103
|
+
producers are printed and acknowledged.
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from DefStream.Broker import Event, SetTimer
|
|
107
|
+
from DefStream.Broker.Implements.RabbitMQ import Configuration, Connection
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def receive(event: Event) -> None:
|
|
111
|
+
print(event.body)
|
|
112
|
+
event.ack()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
connection = Connection(Configuration(
|
|
116
|
+
host='127.0.0.1',
|
|
117
|
+
port=5672,
|
|
118
|
+
username='guest',
|
|
119
|
+
password='guest',
|
|
120
|
+
))
|
|
121
|
+
try:
|
|
122
|
+
connection.connect()
|
|
123
|
+
if not isinstance(connection, SetTimer):
|
|
124
|
+
raise TypeError('Connection does not support timers')
|
|
125
|
+
connection.create_queue('defstream.example.timer')
|
|
126
|
+
consumer = connection.consumer()
|
|
127
|
+
consumer.subs('defstream.example.timer', receive)
|
|
128
|
+
|
|
129
|
+
def expired() -> None:
|
|
130
|
+
print('Timer fired')
|
|
131
|
+
consumer.stop()
|
|
132
|
+
|
|
133
|
+
timer = connection.set_timer(cb=expired, seconds=5)
|
|
134
|
+
try:
|
|
135
|
+
consumer.run()
|
|
136
|
+
finally:
|
|
137
|
+
timer.remove()
|
|
138
|
+
consumer.close()
|
|
139
|
+
finally:
|
|
140
|
+
connection.close()
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Call `timer.remove()` before execution to cancel the scheduled callback.
|
|
144
|
+
The handle belongs to the connection that registered it; reopening a connection
|
|
145
|
+
does not redirect cancellation to the new connection.
|
|
146
|
+
Already-fired or canceled timers, closed connections, and negative or zero
|
|
147
|
+
delays retain Pika's behavior and errors. `remove()` does not interrupt a
|
|
148
|
+
callback that is already running.
|
|
149
|
+
|
|
150
|
+
For repetition, register the next timer inside the callback.
|
|
151
|
+
The following excerpt replaces the `expired` definition and the one-shot
|
|
152
|
+
registration, execution, and consumer cleanup above, after preparing the
|
|
153
|
+
subscription through `consumer.subs(...)`. Keep the outer `finally` that
|
|
154
|
+
closes the connection. It fires three times at five-second intervals, then
|
|
155
|
+
stops, retaining the latest handle for cancellation.
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
from DefStream.Broker import Consumer, SetTimer, Timer
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def run_repeated(connection: SetTimer, consumer: Consumer) -> None:
|
|
162
|
+
remaining = 3
|
|
163
|
+
timer: Timer
|
|
164
|
+
|
|
165
|
+
def tick() -> None:
|
|
166
|
+
nonlocal remaining, timer
|
|
167
|
+
print('Timer fired')
|
|
168
|
+
remaining -= 1
|
|
169
|
+
if remaining:
|
|
170
|
+
timer = connection.set_timer(tick, 5)
|
|
171
|
+
else:
|
|
172
|
+
consumer.stop()
|
|
173
|
+
|
|
174
|
+
timer = connection.set_timer(tick, 5)
|
|
175
|
+
try:
|
|
176
|
+
consumer.run()
|
|
177
|
+
finally:
|
|
178
|
+
timer.remove()
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
run_repeated(connection, consumer)
|
|
183
|
+
finally:
|
|
184
|
+
consumer.close()
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
The implementation delegates directly to Pika's `call_later` and
|
|
188
|
+
`remove_timeout`. Callbacks run only while Pika processes events, such as
|
|
189
|
+
during `consumer.run()`. Registering a timer and calling `sleep()` alone
|
|
190
|
+
does not dispatch it. Long message handlers and other event-loop work can
|
|
191
|
+
delay execution. Callbacks run on the connection owner thread, and their
|
|
192
|
+
exceptions propagate through the existing event-processing path.
|
|
193
|
+
|
|
194
|
+
Registration and cancellation follow Pika's owner-thread restrictions;
|
|
195
|
+
no additional thread safety is provided. Consumer exit does not automatically
|
|
196
|
+
cancel connection timers, so callers must cancel reservations when appropriate.
|
|
197
|
+
The examples cancel before closing the connection; cancellation on a closed
|
|
198
|
+
connection is not guaranteed to succeed. No separate timer thread,
|
|
199
|
+
general-purpose scheduler, or automatic cleanup layer is provided.
|
|
200
|
+
|
|
91
201
|
### Logging
|
|
92
202
|
|
|
93
203
|
`Connection`, `Consumer`, `Queue`, `Exchange`, `Stream`, and `Event` expose a class
|
|
@@ -383,3 +493,18 @@ publishing the reply but before ACK, the task may be redelivered and run again.
|
|
|
383
493
|
- [Sample.py](../samples/Broker/RabbitMQ/Sample.py)
|
|
384
494
|
- [Sample.Stream.py](../samples/Broker/RabbitMQ/Sample.Stream.py)
|
|
385
495
|
- [Sample.RPC.py](../samples/Broker/RabbitMQ/Sample.RPC.py)
|
|
496
|
+
- [Sample.Timer.py](../samples/Broker/RabbitMQ/Sample.Timer.py): one-shot cancellation and repetition by re-registering callbacks
|
|
497
|
+
|
|
498
|
+
The timer sample uses local RabbitMQ at `127.0.0.1:5672` with the `guest` account.
|
|
499
|
+
Enable the RabbitMQ implementation in your development environment and run it
|
|
500
|
+
from the repository root.
|
|
501
|
+
|
|
502
|
+
```shell
|
|
503
|
+
python samples/Broker/RabbitMQ/Sample.Timer.py
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Each run creates a uniquely named empty queue, cancels one callback before
|
|
507
|
+
execution, then logs three timer callbacks at one-second intervals and stops
|
|
508
|
+
consumption. It cleans up the latest timer, consumer channel, sample queue,
|
|
509
|
+
and connection. The Stream sample also uses the connection's `set_timer`
|
|
510
|
+
instead of a separate timer thread to stop consumption.
|
|
@@ -103,6 +103,109 @@ finally:
|
|
|
103
103
|
일반 연결의 heartbeat는 애플리케이션 작업·유휴 시간에 맞게 설정하고 처리되도록 관리하세요.
|
|
104
104
|
연결과 그 리소스는 **소유 스레드에서만 사용**해야 하며, 스레드·프로세스 사이에 공유하지 마세요.
|
|
105
105
|
|
|
106
|
+
### 연결 타이머
|
|
107
|
+
|
|
108
|
+
RabbitMQ 연결은 선택적 `SetTimer` 프로토콜을 지원합니다.
|
|
109
|
+
`set_timer(cb, seconds)`는 등록 시점부터 정수 초 단위로 일회성 콜백을 예약하고,
|
|
110
|
+
취소할 수 있는 `Timer`를 반환합니다. 콜백은 인자 없이 호출되며 반환값이 없습니다.
|
|
111
|
+
연결을 사용하는 코드에서 `isinstance(connection, SetTimer)`로 지원 여부를 확인할 수 있습니다.
|
|
112
|
+
기본 `Connection` 계약과 Redis 연결에는 타이머 지원이 강제되지 않습니다.
|
|
113
|
+
|
|
114
|
+
다음 예제는 메시지가 없는 큐를 소비하면서 5초 뒤 콜백으로 소비를 중단합니다.
|
|
115
|
+
로컬 RabbitMQ가 필요하며 `defstream.example.timer` 큐는 실행 후에도 유지합니다.
|
|
116
|
+
다른 생산자가 이 큐에 보낸 메시지는 출력한 뒤 ACK합니다.
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from DefStream.Broker import Event, SetTimer
|
|
120
|
+
from DefStream.Broker.Implements.RabbitMQ import Configuration, Connection
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def receive(event: Event) -> None:
|
|
124
|
+
print(event.body)
|
|
125
|
+
event.ack()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
connection = Connection(Configuration(
|
|
129
|
+
host='127.0.0.1',
|
|
130
|
+
port=5672,
|
|
131
|
+
username='guest',
|
|
132
|
+
password='guest',
|
|
133
|
+
))
|
|
134
|
+
try:
|
|
135
|
+
connection.connect()
|
|
136
|
+
if not isinstance(connection, SetTimer):
|
|
137
|
+
raise TypeError('Connection does not support timers')
|
|
138
|
+
connection.create_queue('defstream.example.timer')
|
|
139
|
+
consumer = connection.consumer()
|
|
140
|
+
consumer.subs('defstream.example.timer', receive)
|
|
141
|
+
|
|
142
|
+
def expired() -> None:
|
|
143
|
+
print('Timer fired')
|
|
144
|
+
consumer.stop()
|
|
145
|
+
|
|
146
|
+
timer = connection.set_timer(cb=expired, seconds=5)
|
|
147
|
+
try:
|
|
148
|
+
consumer.run()
|
|
149
|
+
finally:
|
|
150
|
+
timer.remove()
|
|
151
|
+
consumer.close()
|
|
152
|
+
finally:
|
|
153
|
+
connection.close()
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
실행 전에 `timer.remove()`를 호출하면 해당 예약을 취소합니다.
|
|
157
|
+
핸들은 등록 당시 연결에 연결되며, 연결을 다시 열어도 새 연결의 타이머를 취소하지 않습니다.
|
|
158
|
+
이미 실행·취소된 예약, 닫힌 연결, 음수·0초 지연의 동작과 오류는 Pika API를 그대로 따릅니다.
|
|
159
|
+
`remove()`는 실행 중인 콜백을 강제로 중단하지 않습니다.
|
|
160
|
+
|
|
161
|
+
반복 실행은 콜백 안에서 다음 타이머를 등록하면 됩니다.
|
|
162
|
+
아래는 반복 실행용 발췌입니다. 위 예제에서 `consumer.subs(...)`까지 준비한 뒤,
|
|
163
|
+
`expired` 정의와 일회성 타이머 등록·실행·소비자 정리 부분을 아래 코드로 교체합니다.
|
|
164
|
+
바깥쪽 `finally`의 연결 종료는 유지합니다.
|
|
165
|
+
5초 간격으로 세 번 실행하고 중단하며, 취소할 때 사용할 최신 핸들을 보관합니다.
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from DefStream.Broker import Consumer, SetTimer, Timer
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def run_repeated(connection: SetTimer, consumer: Consumer) -> None:
|
|
172
|
+
remaining = 3
|
|
173
|
+
timer: Timer
|
|
174
|
+
|
|
175
|
+
def tick() -> None:
|
|
176
|
+
nonlocal remaining, timer
|
|
177
|
+
print('Timer fired')
|
|
178
|
+
remaining -= 1
|
|
179
|
+
if remaining:
|
|
180
|
+
timer = connection.set_timer(tick, 5)
|
|
181
|
+
else:
|
|
182
|
+
consumer.stop()
|
|
183
|
+
|
|
184
|
+
timer = connection.set_timer(tick, 5)
|
|
185
|
+
try:
|
|
186
|
+
consumer.run()
|
|
187
|
+
finally:
|
|
188
|
+
timer.remove()
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
run_repeated(connection, consumer)
|
|
193
|
+
finally:
|
|
194
|
+
consumer.close()
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
RabbitMQ 구현은 Pika의 `call_later`·`remove_timeout`에 직접 위임합니다.
|
|
198
|
+
`consumer.run()`과 같은 Pika 이벤트 처리가 진행되어야 콜백이 실행됩니다.
|
|
199
|
+
단순히 등록 후 `sleep()`하는 것만으로는 실행되지 않으며,
|
|
200
|
+
긴 메시지 처리나 이벤트 루프 작업 때문에 실행이 늦어질 수 있습니다.
|
|
201
|
+
콜백은 연결 소유 스레드에서 실행되고, 예외는 기존 이벤트 처리 경로로 전파됩니다.
|
|
202
|
+
|
|
203
|
+
등록·취소는 Pika의 소유 스레드 제약을 따르며 추가 스레드 안전성을 제공하지 않습니다.
|
|
204
|
+
Consumer 종료 시 연결 타이머를 자동으로 취소하지 않으므로,
|
|
205
|
+
필요한 예약은 호출자가 적절한 시점에 취소해야 합니다.
|
|
206
|
+
위 예제는 연결을 닫기 전에 취소하며, 닫힌 연결에서 취소가 항상 성공한다고 보장하지 않습니다.
|
|
207
|
+
별도 타이머 스레드·범용 스케줄러·자동 정리 계층은 제공하지 않습니다.
|
|
208
|
+
|
|
106
209
|
### 로깅
|
|
107
210
|
|
|
108
211
|
여섯 클래스는 `Broker.RabbitMQ.ClassName` 이름의 클래스 멤버
|
|
@@ -370,3 +473,16 @@ sequenceDiagram
|
|
|
370
473
|
- [Sample.py](../samples/Broker/RabbitMQ/Sample.py)
|
|
371
474
|
- [Sample.Stream.py](../samples/Broker/RabbitMQ/Sample.Stream.py)
|
|
372
475
|
- [Sample.RPC.py](../samples/Broker/RabbitMQ/Sample.RPC.py)
|
|
476
|
+
- [Sample.Timer.py](../samples/Broker/RabbitMQ/Sample.Timer.py): 일회성 예약 취소와 콜백 재등록에 의한 반복 실행
|
|
477
|
+
|
|
478
|
+
타이머 샘플은 로컬 RabbitMQ의 `127.0.0.1:5672`와 `guest` 계정을 사용합니다.
|
|
479
|
+
개발 환경에서 RabbitMQ 구현체를 사용할 수 있어야 하며, 저장소 루트에서 실행하세요.
|
|
480
|
+
|
|
481
|
+
```shell
|
|
482
|
+
python samples/Broker/RabbitMQ/Sample.Timer.py
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
실행마다 고유한 빈 큐를 만들고, 취소한 콜백은 실행하지 않으며,
|
|
486
|
+
1초 간격으로 세 번 출력한 뒤 소비를 중단합니다.
|
|
487
|
+
종료 시 최신 타이머·소비 채널·샘플 큐·연결을 정리합니다.
|
|
488
|
+
Stream 샘플의 소비 중단도 별도 스레드 타이머 대신 연결의 `set_timer`를 사용합니다.
|
|
@@ -11,8 +11,8 @@ Task APIs, delivery policies, pools, and lifecycle hooks.
|
|
|
11
11
|
| Function | Purpose | Connection ownership |
|
|
12
12
|
| --- | --- | --- |
|
|
13
13
|
| `declare(task=..., broker=...)` | Declare task queues and subscription resources | Caller connects and closes |
|
|
14
|
-
| `emit(body, task=..., broker
|
|
15
|
-
| `request(body, task=..., broker=..., timeout=5)` | Request a task result synchronously | Caller connects and closes; RabbitMQ only |
|
|
14
|
+
| `emit(body, task=..., broker=..., retry=None, interval=1)` | Publish a one-way message to a task | Caller connects and closes |
|
|
15
|
+
| `request(body, task=..., broker=..., timeout=5, retry=None, interval=1)` | Request a task result synchronously | Caller connects and closes; RabbitMQ only |
|
|
16
16
|
|
|
17
17
|
Import these functions from `DefStream.Worker`. They do not connect or close
|
|
18
18
|
the supplied connection. Neither `emit()` nor `request()` declares destinations.
|
|
@@ -118,6 +118,43 @@ result = request(
|
|
|
118
118
|
- Priority affects delivery of waiting messages within the same queue. It does not
|
|
119
119
|
preempt delivered or running tasks or guarantee execution and completion order.
|
|
120
120
|
|
|
121
|
+
### Publication and request retries
|
|
122
|
+
|
|
123
|
+
`emit()` and `request()` can optionally retry a broker call that raises an exception.
|
|
124
|
+
The default `retry=None` preserves the existing single-call behavior. The value
|
|
125
|
+
counts additional attempts after the first call, so `retry=3` allows up to four
|
|
126
|
+
calls. The default `interval` is one second; it is applied only after a failure
|
|
127
|
+
when another attempt remains. `retry` must be `None` or a non-negative integer
|
|
128
|
+
other than `bool`, and `interval` must be a finite non-negative number other
|
|
129
|
+
than `bool`. To stay within the platform's supported wait range, `interval` is capped
|
|
130
|
+
at `threading.TIMEOUT_MAX` seconds. Out-of-range values raise `ValueError` before the broker call.
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
emit(
|
|
134
|
+
{'a': 10, 'b': 20},
|
|
135
|
+
task=Add,
|
|
136
|
+
broker=broker,
|
|
137
|
+
retry=3,
|
|
138
|
+
interval=0.5,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# The request timeout applies to each call independently of the retry count.
|
|
142
|
+
result = request(
|
|
143
|
+
{'a': 10, 'b': 20},
|
|
144
|
+
task=Add,
|
|
145
|
+
broker=broker,
|
|
146
|
+
timeout=5,
|
|
147
|
+
retry=2,
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
A successful attempt returns immediately. If every attempt fails, the final exception
|
|
152
|
+
is re-raised. Exceptions raised by broker `emit()` and `request()` calls are retried,
|
|
153
|
+
including `RemoteError`; therefore a request may run again even if its remote task
|
|
154
|
+
already executed before returning an error. Retries do not prevent duplicate
|
|
155
|
+
publication or execution, so tasks using retries should be safe to run more than once.
|
|
156
|
+
Invalid inputs and unsupported broker operations are not retried.
|
|
157
|
+
|
|
121
158
|
### Success, failures, and retries
|
|
122
159
|
|
|
123
160
|
- ACK follows successful execution and completion hooks. RabbitMQ RPC also publishes the reply before ACK.
|
|
@@ -125,7 +162,7 @@ result = request(
|
|
|
125
162
|
- `Policy` is the shared broker contract. Import `Requeue` and `Reject` from the selected broker package; behavior can differ by broker.
|
|
126
163
|
- Rejection is broker-specific: RabbitMQ dead-letters to a configured DLQ or discards the message;
|
|
127
164
|
Redis acknowledges it for the group while preserving stream history.
|
|
128
|
-
-
|
|
165
|
+
- Consumer message redelivery has no automatic retry-count limit. Choose a policy that avoids endless redelivery of permanently invalid messages.
|
|
129
166
|
- Publication and ACK are not one transaction. **Make tasks idempotent and safe to execute more than once.**
|
|
130
167
|
|
|
131
168
|
The common resource operations below apply when accessing a broker directly.
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
| 함수 | 역할 | 연결 관리 |
|
|
12
12
|
| --- | --- | --- |
|
|
13
13
|
| `declare(task=..., broker=...)` | 작업의 큐·구독 리소스 선언 | 호출자가 연결·종료 |
|
|
14
|
-
| `emit(body, task=..., broker
|
|
15
|
-
| `request(body, task=..., broker=..., timeout=5)` | 작업 결과를 동기 RPC로 요청 | 호출자가 연결·종료; RabbitMQ만 지원 |
|
|
14
|
+
| `emit(body, task=..., broker=..., retry=None, interval=1)` | 작업 목적지로 단방향 메시지 발행 | 호출자가 연결·종료 |
|
|
15
|
+
| `request(body, task=..., broker=..., timeout=5, retry=None, interval=1)` | 작업 결과를 동기 RPC로 요청 | 호출자가 연결·종료; RabbitMQ만 지원 |
|
|
16
16
|
|
|
17
17
|
세 함수는 `DefStream.Worker`에서 가져옵니다. 전달된 연결을 자동으로 열거나 닫지 않으며,
|
|
18
18
|
`emit()`와 `request()`는 목적지를 자동 선언하지 않습니다.
|
|
@@ -116,6 +116,41 @@ result = request(
|
|
|
116
116
|
- 우선순위는 같은 큐의 대기 메시지 전달에 적용됩니다. 이미 전달·실행 중인
|
|
117
117
|
작업을 선점하거나 여러 작업의 실행·완료 순서를 보장하지 않습니다.
|
|
118
118
|
|
|
119
|
+
### 발행·요청 재시도
|
|
120
|
+
|
|
121
|
+
`emit()`과 `request()`는 브로커 호출이 예외로 실패하면 선택적으로 다시 시도할 수 있습니다.
|
|
122
|
+
기본 `retry=None`은 기존처럼 한 번만 호출합니다. 횟수는 최초 시도 이후의
|
|
123
|
+
추가 횟수이므로 `retry=3`은 최대 네 번 호출합니다. 실패 후 다음 시도가 남았을 때만
|
|
124
|
+
`interval`초를 기다리며 기본 간격은 1초입니다.
|
|
125
|
+
`retry`는 `None` 또는 bool이 아닌 0 이상의 정수이고, `interval`은 bool이 아닌
|
|
126
|
+
유한한 0 이상의 숫자여야 합니다. 플랫폼의 대기 시간 범위를 넘지 않도록 `interval`의 상한은
|
|
127
|
+
`threading.TIMEOUT_MAX`초로 제한합니다. 범위를 벗어난 값은 브로커 호출 전에 `ValueError`로 거부합니다.
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
emit(
|
|
131
|
+
{'a': 10, 'b': 20},
|
|
132
|
+
task=Add,
|
|
133
|
+
broker=broker,
|
|
134
|
+
retry=3,
|
|
135
|
+
interval=0.5,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# 요청의 timeout은 재시도 횟수와 별도로 매 호출에 적용됩니다.
|
|
139
|
+
result = request(
|
|
140
|
+
{'a': 10, 'b': 20},
|
|
141
|
+
task=Add,
|
|
142
|
+
broker=broker,
|
|
143
|
+
timeout=5,
|
|
144
|
+
retry=2,
|
|
145
|
+
)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
중간 호출이 성공하면 결과를 바로 반환하고, 모든 호출이 실패하면 마지막 예외를 그대로
|
|
149
|
+
전파합니다. `RemoteError`를 포함해 브로커의 발행·요청 호출에서 발생한 예외를 재시도하므로,
|
|
150
|
+
원격 작업이 이미 실행된 뒤 오류 응답을 받은 요청도 다시 실행될 수 있습니다. 중복 전송이나
|
|
151
|
+
작업 실행을 방지하지 않으므로 재시도가 필요한 작업은 중복 실행에 안전하도록 설계하세요.
|
|
152
|
+
잘못된 입력이나 브로커 기능 미지원 오류는 재시도하지 않습니다.
|
|
153
|
+
|
|
119
154
|
### 성공, 실패와 재시도
|
|
120
155
|
|
|
121
156
|
- 작업 실행과 완료 훅이 성공한 뒤 ACK합니다. RabbitMQ RPC는 응답 발행도 ACK보다 먼저 수행합니다.
|
|
@@ -124,7 +159,7 @@ result = request(
|
|
|
124
159
|
패키지에서 가져오며, 같은 이름의 정책도 동작은 브로커마다 다를 수 있습니다.
|
|
125
160
|
- `Reject()`의 실제 효과는 브로커에 따라 다릅니다. RabbitMQ는 설정된 DLQ로 보내거나 폐기하며,
|
|
126
161
|
Redis는 해당 그룹에서 ACK하고 스트림 이력은 유지합니다.
|
|
127
|
-
-
|
|
162
|
+
- 소비자 측 메시지 재전달 횟수에는 자동 제한이 없습니다. 영구적인 오류가 무한 재전달되지 않도록 정책을 선택하세요.
|
|
128
163
|
- 전송과 ACK는 하나의 트랜잭션이 아닙니다. **중복 실행에 안전한 멱등 작업**을 작성해야 합니다.
|
|
129
164
|
|
|
130
165
|
브로커 리소스를 직접 사용할 때의 공통 메서드는 다음과 같습니다.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도
|
|
2
|
+
|
|
3
|
+
`emit()`과 `request()`에 `retry`와 `interval` 옵션을 추가했습니다. 기본 설정은 기존처럼 한 번만 호출하며, 재시도 횟수를 설정하면 실패한 브로커 호출을 지정 횟수까지 다시 시도합니다. `request()`의 `timeout`은 각 호출에 적용됩니다.
|
|
4
|
+
|
|
5
|
+
브로커 호출에서 발생한 `RemoteError`를 포함한 예외도 재시도 대상입니다. 원격 작업이 이미 실행된 뒤 오류 응답을 받은 요청도 다시 실행될 수 있으므로, 중복 요청이나 부작용에 안전한 작업에만 재시도를 설정하세요.
|
|
6
|
+
|
|
7
|
+
`interval`은 0 이상 `threading.TIMEOUT_MAX`초 이하로 제한합니다. 지나치게 큰 간격은 브로커 호출 전에 `ValueError`로 거부하여 대기 중 오버플로가 브로커 오류를 가리는 상황을 방지합니다.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 구현
|
|
2
|
+
|
|
3
|
+
## 결과
|
|
4
|
+
|
|
5
|
+
[요구사항 명세](./REQUIREMENTS.md)에 따라 [Worker 메시지 함수](../../../src/Worker/Message.py)의 `emit()`과 `request()`에 `retry`와 `interval` 키워드 인자를 추가했습니다. 기본값은 각각 `None`과 1초입니다. `None` 또는 `0`은 한 번 호출하며, `N`은 최초 호출 후 최대 `N`번 추가 호출합니다.
|
|
6
|
+
|
|
7
|
+
입력 설정은 브로커 호출 전에 검증합니다. 재시도는 브로커의 `emit()`·`request()` 호출에만 적용하고, 실패 후 시도가 남은 때만 대기하며, 최종 예외를 그대로 전파합니다. `request()`의 `timeout`과 두 API의 기존 우선순위 전달을 재시도마다 유지합니다. 모든 `Exception`을 대상으로 하므로 `RemoteError`도 재시도되며, 중복 요청·작업 실행 방지는 제공하지 않습니다.
|
|
8
|
+
|
|
9
|
+
브로커 인터페이스나 구현체, 연결 생성·종료 동작은 변경하지 않았습니다.
|
|
10
|
+
|
|
11
|
+
PR 리뷰 후 `interval`을 `threading.TIMEOUT_MAX` 이하로 제한하고 범위 비교를 실수 변환보다 먼저 수행하도록 보완했습니다. 지나치게 큰 간격은 브로커 호출 전에 `ValueError`로 거부합니다. 경계값 테스트 2개를 추가하여 현재 메시지 API 테스트 15개가 통과했습니다.
|
|
12
|
+
|
|
13
|
+
초기 구현 후 공개 인자명을 `retry`와 `interval`로 변경했습니다. 현재 API와 문서에는 이전 이름을 남기지 않았습니다.
|
|
14
|
+
|
|
15
|
+
## 검증
|
|
16
|
+
|
|
17
|
+
- [메시지 API 회귀 테스트](../../../tests/test_task_messages.py): 15개 테스트 통과. 재시도 횟수·대기, 기본값·0회, 중간 성공, 최종 예외 객체 보존, `RemoteError`, priority·timeout, 입력 검증과 간격 경계값을 확인했습니다.
|
|
18
|
+
- Pylance 함수 시그니처 호환성 검사에서 `emit()`·`request()`의 기존 호출부가 각각 호환됨을 확인했습니다.
|
|
19
|
+
- Pylance 진단에서 오류가 없고, 변경한 Python 소스와 테스트의 syntax 검사도 통과했습니다.
|
|
20
|
+
- 한국어·영어 작업 매뉴얼과 고객용 [변경 로그](./CHANGELOG.md)를 갱신했습니다.
|
|
21
|
+
- 실제 RabbitMQ·Redis 연결 장애에 대한 통합 검증은 수행하지 않았습니다.
|
|
22
|
+
|
|
23
|
+
## 단계별 기록
|
|
24
|
+
|
|
25
|
+
- [Worker 재시도 구현](./implements/1793714914193.md)
|
|
26
|
+
- [재시도 간격 오버플로 사전 차단](./implements/1793717149425.md)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 계획
|
|
2
|
+
|
|
3
|
+
작업 범위와 진행 상태는 [이슈 기록](./README.md), 목표 동작과 미확정 사항은 [요구사항 명세](./REQUIREMENTS.md)를 따릅니다. 구현과 대상 단위 테스트, 한국어·영어 작업 매뉴얼 갱신을 완료했습니다. 최종 검증 결과와 남은 제한은 [작업 종합](./TASKS.md) 및 [구현 종합](./IMPLEMENTS.md)에 반영했습니다.
|
|
4
|
+
|
|
5
|
+
## 수행 단계와 진행 상태
|
|
6
|
+
|
|
7
|
+
### 1. 공개 인자와 입력 계약 확정
|
|
8
|
+
|
|
9
|
+
상태: 완료
|
|
10
|
+
|
|
11
|
+
- `emit()`·`request()`의 키워드 전용 인자는 `retry`와 `interval`로 확정했습니다.
|
|
12
|
+
- 재시도 횟수는 `None` 또는 bool이 아닌 0 이상의 정수, 간격은 bool이 아닌 유한한 0 이상의 정수·실수로 제한하고, 브로커 호출 전에 검증합니다.
|
|
13
|
+
- 재시도 범위가 모든 브로커 호출 예외, `RemoteError` 포함이라는 결정을 유지합니다.
|
|
14
|
+
|
|
15
|
+
대응: R-01·R-04, AC-05·AC-07
|
|
16
|
+
|
|
17
|
+
### 2. Worker 계층 재시도 구현
|
|
18
|
+
|
|
19
|
+
상태: 완료 / 선행: 1단계
|
|
20
|
+
|
|
21
|
+
대상: [Message.py](../../../src/Worker/Message.py)
|
|
22
|
+
|
|
23
|
+
- 기존 입력·지원 기능 확인과 `priority_parameters()` 처리는 재시도 루프 바깥에 유지합니다.
|
|
24
|
+
- `emit()`과 `request()`의 실제 브로커 호출에 동일한 횟수·간격 정책을 적용합니다.
|
|
25
|
+
- 성공값을 그대로 반환하고, 실패 후 시도가 남아 있는 때만 대기하며, 최종 예외를 변환하지 않고 다시 발생시킵니다.
|
|
26
|
+
- 기존 `request(timeout=...)` 및 우선순위 호출 경로의 전달값을 유지합니다.
|
|
27
|
+
- 브로커 Protocol·구현체와 연결 소유권은 변경하지 않습니다.
|
|
28
|
+
|
|
29
|
+
대응: R-02~R-08, AC-01~AC-07
|
|
30
|
+
|
|
31
|
+
### 3. 단위 회귀 테스트
|
|
32
|
+
|
|
33
|
+
상태: 완료 / 선행: 2단계
|
|
34
|
+
|
|
35
|
+
대상: [test_task_messages.py](../../../tests/test_task_messages.py)
|
|
36
|
+
|
|
37
|
+
- Mock 브로커의 성공·실패 순서를 제어해 최초 성공, 중간 성공, 최대 횟수 실패, 마지막 예외 객체 보존을 검증합니다.
|
|
38
|
+
- `sleep` 등 실제 시간 대기는 Mock 처리하고, 기본·사용자 지정 간격 및 대기 횟수를 확인합니다.
|
|
39
|
+
- `emit()`·`request()` 각각에서 `priority`와 `timeout`이 모든 호출에 유지되는지 확인합니다.
|
|
40
|
+
- 기존 입력·기능 지원 검증이 브로커 호출 전에 실패하고 재시도하지 않는지 확인합니다.
|
|
41
|
+
|
|
42
|
+
대응: AC-01~AC-08
|
|
43
|
+
|
|
44
|
+
### 4. 매뉴얼과 고객용 변경 로그 갱신
|
|
45
|
+
|
|
46
|
+
상태: 완료 / 선행: 2·3단계
|
|
47
|
+
|
|
48
|
+
- [한국어 작업 매뉴얼](../../../docs/Tasks.md)과 [영어 작업 매뉴얼](../../../docs/Tasks.en.md)에 API 옵션·사용 예·기본값·시도 횟수 의미를 함께 반영합니다.
|
|
49
|
+
- 호출 재시도와 소비자 메시지 재전달을 구분하고, `RemoteError` 포함 재시도가 중복 요청·작업 실행을 일으킬 수 있음을 설명합니다.
|
|
50
|
+
- 구현 결과를 기준으로 이슈별 [변경 로그](./CHANGELOG.md)를 작성했습니다.
|
|
51
|
+
|
|
52
|
+
대응: R-09, AC-09
|
|
53
|
+
|
|
54
|
+
### 5. 검증 및 완료 확인
|
|
55
|
+
|
|
56
|
+
상태: 완료 / 선행: 2~4단계
|
|
57
|
+
|
|
58
|
+
- 저장소의 focused unittest 명령으로 메시지 API 회귀 테스트를 실행했습니다.
|
|
59
|
+
- 변경된 문서와 인수 기준의 일치, 한국어·영어 매뉴얼 간 내용 일치, 새 예제의 실제 공개 API 적합성을 확인했습니다.
|
|
60
|
+
- 실제 브로커 장애·전송 후 중복 처리 동작은 검증하지 않았으며, 테스트 결과로 주장하지 않고 제한사항으로 남겼습니다.
|
|
61
|
+
- 실제 수행 결과를 작업 기록 및 `TASKS.md`에 반영하고, 구현 종합과 단계별 기록을 작성했습니다.
|
|
62
|
+
|
|
63
|
+
## 검증 계획
|
|
64
|
+
|
|
65
|
+
| 범위 | 방법 | 결과 |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| Worker 메시지 API 회귀 | `tests.test_task_messages` 단위 테스트 | PR 리뷰 경계값 보완 후 15개 테스트 통과 |
|
|
68
|
+
| 재시도 횟수·대기 | Mock 브로커와 Mock 대기 함수로 호출 수·대기 인자·횟수 확인 | 기본·0회, 최대 3회 추가 재시도, 중간 성공 및 대기 횟수 검증 통과 |
|
|
69
|
+
| 기존 전달 계약 | Mock 호출 인자로 본문·작업 설정·priority·timeout 확인 | `emit()`·`request()` 재시도 호출에서 전달 유지 확인 |
|
|
70
|
+
| 공개 시그니처·정적 검사 | Pylance 호출 호환성·진단·syntax 검사 | 기존 호출부 호환, 진단·syntax 오류 없음 |
|
|
71
|
+
| 문서 계약 | `Tasks.md`·`Tasks.en.md`의 API 설명·예·중복 처리 주의사항 대조 | 한영 매뉴얼 및 이슈별 변경 로그 갱신 |
|
|
72
|
+
|
|
73
|
+
## 계획의 한계
|
|
74
|
+
|
|
75
|
+
- 모든 브로커 호출 예외를 재시도하므로 일시적인 전송 오류뿐 아니라 `RemoteError`와 같은 영구적 원격 작업 오류도 반복할 수 있습니다. 이 범위는 사용자 결정이며, 중복 방지는 별도 범위입니다.
|
|
76
|
+
- 실제 브로커 통합 검증은 단위 테스트와 별개입니다. 구현 시 로컬 브로커 환경이 준비되지 않았다면 실행하지 않은 사실을 기록합니다.
|
|
77
|
+
- 전체 검증 결과와 실행 환경 제약은 [작업 종합](./TASKS.md)을 기준으로 갱신합니다.
|