diff --git a/lib/DependencyInjection/Configuration.php b/lib/DependencyInjection/Configuration.php index 8e7107f..b147253 100644 --- a/lib/DependencyInjection/Configuration.php +++ b/lib/DependencyInjection/Configuration.php @@ -20,6 +20,13 @@ class Configuration implements ConfigurationInterface $treeBuilder->getRootNode() ->children() ->scalarNode('windows_local_encoding')->defaultValue('ISO-8859-15')->end() + ->scalarNode('project_code')->isRequired()->cannotBeEmpty()->info('Project specific code to distinguish service ID') + ->validate() + ->ifTrue(function ($value) { + return \is_string($value) === false || \strlen($value) > 5 || \strlen($value) < 2; + })->thenInvalid('Invalid project code (string length between 2 and 5 chars)') + ->end() + ->end() ->arrayNode('logging_extra') ->addDefaultsIfNotSet() ->children() diff --git a/lib/DependencyInjection/Win32ServiceExtension.php b/lib/DependencyInjection/Win32ServiceExtension.php index 1d66ae1..d3f575d 100644 --- a/lib/DependencyInjection/Win32ServiceExtension.php +++ b/lib/DependencyInjection/Win32ServiceExtension.php @@ -22,7 +22,7 @@ use Win32ServiceBundle\Model\MessengerServiceRunner; class Win32ServiceExtension extends Extension { - public function load(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container): void { $configuration = new Configuration(); @@ -30,7 +30,7 @@ class Win32ServiceExtension extends Extension $config = $this->processMessengerConfig($config); $container->setParameter('win32service.config', $config); - $this->processMessenger($config['messenger'], $container); + $this->processMessenger($config['messenger'], $config['project_code'], $container); $loader = new YamlFileLoader($container, new FileLocator(\dirname(__DIR__).'/Resources/config')); $loader->load('services.yaml'); @@ -71,10 +71,14 @@ class Win32ServiceExtension extends Extension $definition->addTag('monolog.processor'); } - public function processMessenger(array $messengerConfig, ContainerBuilder $container): void + public function processMessenger(array $messengerConfig, string $projectCode, ContainerBuilder $container): void { foreach ($messengerConfig as $service) { - $name = sprintf(MessengerServiceRunner::SERVICE_TAG_PATTERN, implode('_', $service['receivers'])); + $name = sprintf( + MessengerServiceRunner::SERVICE_TAG_PATTERN, + $projectCode, + implode('_', $service['receivers']) + ); $arguments = [ $service, new AbstractArgument('Routable message bus'), @@ -96,6 +100,15 @@ class Win32ServiceExtension extends Extension private function processMessengerConfig(array $config): array { foreach ($config['messenger'] as $service) { + $strlen = \strlen((string) ($service['thread_count'] - 1)) - 2; + $templatedName = sprintf( + MessengerServiceRunner::SERVICE_TAG_PATTERN, + $config['project_code'], + implode('_', $service['receivers']) + ); + if (($totalLength = $strlen + \strlen($templatedName)) > 80) { + throw new \Win32ServiceException(sprintf('The future service identity length "%s" is over 80 chars (%d). Reduce the project code or "receivers" number or name length to keep less than 80 chars.', sprintf($templatedName, $service['thread_count'] - 1), $totalLength)); + } $config['services'][] = [ 'machine' => $service['machine'], 'displayed_name' => $service['displayed_name'], @@ -105,7 +118,7 @@ class Win32ServiceExtension extends Extension 'thread_count' => $service['thread_count'], 'script_path' => null, 'script_params' => '', - 'service_id' => sprintf(MessengerServiceRunner::SERVICE_TAG_PATTERN, implode('_', $service['receivers'])), + 'service_id' => $templatedName, 'recovery' => [ 'enable' => true, 'delay' => 100, diff --git a/lib/Model/MessengerServiceRunner.php b/lib/Model/MessengerServiceRunner.php index 28bd0f7..73bc26c 100644 --- a/lib/Model/MessengerServiceRunner.php +++ b/lib/Model/MessengerServiceRunner.php @@ -33,7 +33,7 @@ use Win32ServiceBundle\MessengerSubscriber\StopWorkerOnTimeLimitListener; final class MessengerServiceRunner extends AbstractServiceRunner { - public const SERVICE_TAG_PATTERN = 'win32service.messenger.%s.%%s'; + public const SERVICE_TAG_PATTERN = 'win32service.%s.messenger.%s.%%s'; /** * @var array */ diff --git a/tests/Application/config/packages/win32service.yaml b/tests/Application/config/packages/win32service.yaml index 32ae6d9..2ab5393 100644 --- a/tests/Application/config/packages/win32service.yaml +++ b/tests/Application/config/packages/win32service.yaml @@ -1,7 +1,9 @@ win32_service: + project_code: demo messenger: - receivers: [async] limit: 10 displayed_name: Demo Messenger Consumer Async thread_count: 2 +