Exemplo n.º 1
0
$connectionRegistry = new ConnectionRegistry();
$channelRegistry = new ChannelRegistry();
$exchangeRegistry = new ExchangeRegistry();
$queueRegistry = new QueueRegistry();
$contextRegistry = new ContextRegistry();
$connectionFactory = new ConnectionFactory($connectionRegistry, ['default' => ['host' => 'rabbitmq', 'port' => 5672, 'login' => 'admin', 'password' => 'admin', 'vhost' => '/', 'read_timeout' => 0.5, 'write_timeout' => 0.5, 'conntect_timeout' => 0.5]]);
$channelFactory = new ChannelFactory($connectionRegistry, $channelRegistry, $channelFactory);
$connection = $connectionFactory->createNamed('default');
$contextRegistry->addExchangeContext('exchange_a', new Context(AMQP_EX_TYPE_DIRECT));
$contextRegistry->addExchangeContext('exchange_b', new Context(AMQP_EX_TYPE_DIRECT));
$contextRegistry->addExchangeContext('exchange_c', new Context(AMQP_EX_TYPE_DIRECT));
$contextRegistry->addQueueContext('queue_a_foo', new \Evaneos\Hector\Queue\Context('a.foo', AMQP_AUTOACK));
$contextRegistry->addQueueContext('queue_a_bar', new \Evaneos\Hector\Queue\Context('a.bar', AMQP_AUTOACK));
$contextRegistry->addQueueContext('queue_b', new \Evaneos\Hector\Queue\Context('', AMQP_AUTOACK));
$exchangeFactory = new ExchangeFactory($contextRegistry, $exchangeRegistry);
$channelProcess1 = $channelFactory->createFromConnectionName('default', new Identity());
$channelProcess2 = $channelFactory->createFromConnectionName('default', new Identity());
$channelProcess3 = $channelFactory->createFromConnectionName('default', new Identity());
$exchangeAProcess1 = $exchangeFactory->createNamed('exchange_a', $channelProcess1);
$exchangeAProcess2 = $exchangeFactory->createNamed('exchange_a', $channelProcess2);
$exchangeBProcess3 = $exchangeFactory->createNamed('exchange_b', $channelProcess3);
$queueFactory = new QueueFactory($contextRegistry, $queueRegistry);
$consumerFactory = new ConsumerFactory($channelFactory, $queueFactory, $exchangeFactory, $connectionRegistry, $exchangeRegistry, $queueRegistry);
//all of these consumer work in different channel
$consumerAFoo = $consumerFactory->create('default', 'exchange_a', 'queue_a_foo');
$consumerABar = $consumerFactory->create('default', 'exchange_a', 'queue_a_bar');
$consumerB = $consumerFactory->create('default', 'exchange_b', 'queue_b');
//now publish some messages
$publisherFactory = new PublisherFactory($connectionRegistry, $exchangeFactory, $channelFactory, null, $exchangeRegistry);
$publisherAP1 = $publisherFactory->create('default', 'exchange_a', $channelProcess1);
$publisherAP2 = $publisherFactory->create('default', 'exchange_a', $channelProcess2);
Exemplo n.º 2
0
$exchangeRegistry = new ExchangeRegistry();
$queueRegistry = new QueueRegistry();
$contextRegistry = new ContextRegistry();
$connectionFactory = new ConnectionFactory($connectionRegistry, ['default' => ['host' => 'rabbitmq', 'port' => 5672, 'login' => 'admin', 'password' => 'admin', 'vhost' => '/', 'read_timeout' => 0.5, 'write_timeout' => 0.5, 'conntect_timeout' => 0.5]]);
$channelFactory = new ChannelFactory($connectionRegistry, $channelRegistry, $channelFactory);
$connection = $connectionFactory->createNamed('default');
$contextRegistry->addExchangeContext('exchange_a', new Context(\AMQP_DURABLE));
$contextRegistry->addExchangeContext('exchange_b', new Context(\AMQP_DURABLE));
$contextRegistry->addExchangeContext('exchange_c', new Context(\AMQP_DURABLE));
$contextRegistry->addQueueContext('queue_a_foo', new \Evaneos\Hector\Queue\Context('a.foo'));
$contextRegistry->addQueueContext('queue_a_bar', new \Evaneos\Hector\Queue\Context('a.bar'));
$contextRegistry->addQueueContext('queue_b', new \Evaneos\Hector\Queue\Context());
$exchangeFactory = new ExchangeFactory($contextRegistry, $exchangeRegistry);
// A channel is a virtual connection to insulate work process inside her.
// Our worker will process across 3 queues from different exchange, all communication between the broker and worker will be through this channel
$channel = $channelFactory->createFromConnectionName('default', new Identity());
$exchangeA = $exchangeFactory->createNamed('exchange_a', $channel);
$exchangeB = $exchangeFactory->createNamed('exchange_b', $channel);
$queueFactory = new QueueFactory($contextRegistry, $queueRegistry);
/**
 * exchange_a is bind to queue_a_foo and queue_a_bar and communicate over the same channel
 *
 * If you have a worker who consume from multiple queue via get() with an event loop, you should aggregate in only one channel
 */
$queueAFoo = $queueFactory->createNamed('queue_a_foo', $channel, $exchangeA);
$queueABar = $queueFactory->createNamed('queue_a_bar', $channel, $exchangeA);
$queueB = $queueFactory->createNamed('queue_b', $channel, $exchangeB);
$consumerFactory = new ConsumerFactory($channelFactory, $queueFactory, $exchangeFactory, $connectionRegistry, $exchangeRegistry, $queueRegistry);
//all of these consumer work through the same channel
$consumerAFoo = $consumerFactory->create('default', 'exchange_a', 'queue_a_foo');
$consumerABar = $consumerFactory->create('default', 'exchange_a', 'queue_a_bar');
use Evaneos\Hector\Identity\Identity;
use Evaneos\Hector\Publisher\PublisherFactory;
use Evaneos\Hector\Queue\QueueRegistry;
require __DIR__ . '/vendor/autoload.php';
$connectionRegistry = new ConnectionRegistry();
$channelRegistry = new ChannelRegistry();
$exchangeRegistry = new ExchangeRegistry();
$queueRegistry = new QueueRegistry();
$contextRegistry = new ContextRegistry();
$connectionFactory = new ConnectionFactory($connectionRegistry, ['default' => ['host' => 'rabbitmq', 'port' => 5672, 'login' => 'admin', 'password' => 'admin', 'vhost' => '/', 'read_timeout' => 0.5, 'write_timeout' => 0.5, 'conntect_timeout' => 0.5]]);
$channelFactory = new ChannelFactory($connectionRegistry, $channelRegistry, $channelFactory);
$connection = $connectionFactory->createNamed('default');
$contextRegistry->addExchangeContext('exchange_a', new Context(\AMQP_EX_TYPE_DIRECT));
$contextRegistry->addExchangeContext('exchange_b', new Context(\AMQP_EX_TYPE_DIRECT));
$exchangeFactory = new ExchangeFactory($contextRegistry, $exchangeRegistry);
$channelA = $channelFactory->createFromConnectionName('default', new Identity());
$channelB = $channelFactory->createFromConnectionName('default', new Identity());
$exchange = $exchangeFactory->createNamed('exchange_a', $channelA);
$exchange = $exchangeFactory->createNamed('exchange_b', $channelB);
$publisherFactory = new PublisherFactory($connectionRegistry, $exchangeFactory, $channelFactory, null, $exchangeRegistry);
$publisherA = $publisherFactory->create('default', 'exchange_a');
$publisherB = $publisherFactory->create('default', 'exchange_b');
//simple publish to a
$publisherA->publish('Hello world', 'routing_key');
//simple publish to b
$publisherB->publish('Hello world', 'routing_key');
//multi publish with the same publisher
try {
    //PublisherA is connected with ChannelA, everything happened in channelA will be rollback if something wrong happen
    $publisherA->startTransaction();
    $publisherA->publish('Hello world', 'routing_key', AMQP_NOPARAM, []);