vivait / delayed-event-bundle
一个延迟事件在可配置的时间段(例如24小时)的事件包
2.2.0
2023-06-30 09:59 UTC
Requires
- php: ^7.4|^8.0
- ext-json: *
- leezy/pheanstalk-bundle: 4.x-dev@dev
- symfony/config: ^4.4|^5.4
- symfony/console: ^4.4|^5.4
- symfony/dependency-injection: ^4.4|^5.4
- symfony/event-dispatcher: ^4.4|^5.4
- symfony/framework-bundle: ^4.4|^5.4
- symfony/monolog-bundle: ~3.0
- symfony/process: ^4.4|^5.4
- symfony/uid: ^5.2|^6.0
- vivait/backoff: ^1.1
- wrep/daemonizable-command: ~3.1
Requires (Dev)
- behat/behat: ^3.0
- doctrine/doctrine-bundle: ^2.0
- doctrine/orm: ~2.2
- matthiasnoback/symfony-config-test: ^4.0
- phpunit/phpunit: ^9.0
- psalm/plugin-symfony: ^3.1
- symfony/phpunit-bridge: ^6.0
- symfony/polyfill-php74: ^1.26
- symfony/polyfill-php80: ^1.26
- symfony/polyfill-php81: ^1.26
- symfony/symfony: ^4.4|^5.4
- videlalvaro/php-amqplib: ~2.2
- vimeo/psalm: ^4.23
- yogarine/doctrine-annotation-autoload: ^0
- 2.x-dev
- 2.2.0
- 2.1.0
- 2.0.1
- 2.0.0
- 1.x-dev
- 1.0.0
- 0.x-dev
- 0.14.2
- 0.14.1
- 0.14.0
- 0.13.1
- 0.13.0
- 0.12.0
- 0.11.2
- 0.11.1
- 0.11
- 0.10.5
- 0.10.4
- 0.10.3
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.0
- 0.5.0
- 0.4.4
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.1
- 0.3.0
- 0.2.0
- 0.1.0
- dev-fix/adhoc-2812-store-job-id
- dev-feature/synchronous
- dev-bump-symfony-uid
This package is auto-updated.
Last update: 2024-08-30 01:05:56 UTC
README
在原始事件后任意时间段触发一个Symfony事件
配置服务
vivait_delayed_event: queue_transport: beanstalkd # default
Beanstalkd队列传输
这依赖于 pheanstalk 已经安装并设置在你的配置中。你可以使用 configuration
参数向beanstalk队列传递额外信息
注意:TTR(任务尝试时间)是指一个进程在真正重试之前可以运行的时间,如果它太短,则存在一个真实的情况,即一个工作将处理两次。
vivait_delayed_event: queue_transport: name: beanstalkd configuration: tube: my_tube ttr: 60
创建一个延迟事件
而不是用内核标签标记事件,用 delayed_event
标签标记事件并提供一个延迟
# app/config/services.yml services: app.your_listener_name: class: AppBundle\EventListener\AcmeListener tags: - { name: delayed_event.event_listener, delay: '24 hours', event: app.my_event, method: onMyEvent }
默认情况下,任何整数都将被视为秒。该包将使用 PHP的文本日期时间解析 将文本日期时间字符串解析为秒,如上例所示。
转换器
如果你正在延迟一个事件,而不是存储事件发生时实体的确切状态,你可能希望接收实体的最新版本。该包允许使用转换器,它们在序列化事件属性之前运行。默认情况下,该包启用了一个实体转换器,它将检测事件中的任何实体并存储一个实体引用。这意味着当实体被反序列化以延迟事件时,将从一个数据库中加载一个新鲜实体。
你可以在全局级别上启用/禁用转换器
# app/config.yml vivait_delayed_event: storage: delayed_event_cache transformers: doctrine: disabled
你还可以在标记事件监听器时启用/禁用它们
# app/config/services.yml services: app.your_listener_name: class: AppBundle\EventListener\AcmeListener tags: - { name: delayed_event.event_listener, delay: '24 hours', event: app.my_event, method: onMyEvent, transformers: [doctrine] }
注意: enabled
部分是可选的,在上面的例子中已经省略,以简化内容。
你可以通过实现 TransformerInterface
接口创建自定义转换器,如下所示
class AcmeTransformer implements TransformerInterface { /** * @param ReflectionProperty $property * @return bool */public function supports(\ReflectionProperty $property) { $property->getValue(); return is_object($data) && $this->doctrine->contains($data); } /** * @param $data * @return array */public function serialize($data) { // Get the ID $id = $this->doctrine->getMetaData($data)->getIdentifierFieldNames(); $class = get_class($data); /* @var UnitOfWork $uow */ $uow = $this->doctrine->getUnitOfWork(); $id = $uow->getDocumentIdentifier($data); return [ $class, $id ]; } /** * @param $data * @return mixed */public function deserialize($data) { [$class, $id] = $data; return $this->doctrine->getRepository($class)->find($id); } }
然后你必须标记自定义转换器
# app/config/services.yml services: app.your_transformer_name: class: AppBundle\EventTransformer\AcmeTransformer tags: - { name: your_transformer_name }