bschmitt / laravel-amqp

AMQP wrapper for Laravel and Lumen to publish and consume messages
MIT License
268 stars 86 forks source link

AMQPTables Support #69

Closed dennisgon closed 4 years ago

dennisgon commented 5 years ago

hai i used lumen 5.8.8 to send message headers properties. and it got error

[2019-06-20 09:07:57] local.ERROR: PhpAmqpLib\Exception\AMQPOutOfRangeException: AMQP-rabbit doesn't define data of type [] in C:\laragon\www\kompas-id-apiwcm\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\AMQPAbstractCollection.php:420
Stack trace:
#0 C:\laragon\www\kompas-id-apiwcm\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\AMQPWriter.php(425): PhpAmqpLib\Wire\AMQPAbstractCollection::getDataTypeForSymbol(NULL)
#1 C:\laragon\www\kompas-id-apiwcm\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\AMQPWriter.php(443): PhpAmqpLib\Wire\AMQPWriter->write_table(Array)
#2 C:\laragon\www\kompas-id-apiwcm\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Wire\GenericContent.php(199): PhpAmqpLib\Wire\AMQPWriter->write_table_object(Array)
#3 C:\laragon\www\kompas-id-apiwcm\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Channel\AMQPChannel.php(1123): PhpAmqpLib\Wire\GenericContent->serialize_properties()
#4 C:\laragon\www\kompas-id-apiwcm\vendor\bschmitt\laravel-amqp\src\Publisher.php(18): PhpAmqpLib\Channel\AMQPChannel->basic_publish(Object(Bschmitt\Amqp\Message), 'amq.headers', 'routing-key')
#5 C:\laragon\www\kompas-id-apiwcm\vendor\bschmitt\laravel-amqp\src\Amqp.php(33): Bschmitt\Amqp\Publisher->publish('routing-key', Object(Bschmitt\Amqp\Message))
#6 C:\laragon\www\kompas-id-apiwcm\vendor\illuminate\support\Facades\Facade.php(237): Bschmitt\Amqp\Amqp->publish('routing-key', Object(Bschmitt\Amqp\Message), Array)
#7 C:\laragon\www\kompas-id-apiwcm\app\Http\Controllers\V1\MembershipController.php(64): Illuminate\Support\Facades\Facade::__callStatic('publish', Array)
#8 [internal function]: App\Http\Controllers\V1\MembershipController->create(Object(Laravel\Lumen\Http\Request))
#9 C:\laragon\www\kompas-id-apiwcm\vendor\illuminate\container\BoundMethod.php(32): call_user_func_array(Array, Array)
#10 C:\laragon\www\kompas-id-apiwcm\vendor\illuminate\container\BoundMethod.php(90): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#11 C:\laragon\www\kompas-id-apiwcm\vendor\illuminate\container\BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Laravel\Lumen\Application), Array, Object(Closure))
#12 C:\laragon\www\kompas-id-apiwcm\vendor\illuminate\container\Container.php(576): Illuminate\Container\BoundMethod::call(Object(Laravel\Lumen\Application), Array, Array, NULL)
#13 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(376): Illuminate\Container\Container->call(Array, Array)
#14 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(342): Laravel\Lumen\Application->callControllerCallable(Array, Array)
#15 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(316): Laravel\Lumen\Application->callLumenController(Object(App\Http\Controllers\V1\MembershipController), 'create', Array)
#16 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(278): Laravel\Lumen\Application->callControllerAction(Array)
#17 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(263): Laravel\Lumen\Application->callActionOnArrayBasedRoute(Array)
#18 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(165): Laravel\Lumen\Application->handleFoundRoute(Array)
#19 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(416): Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(Object(Laravel\Lumen\Http\Request))
#20 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(171): Laravel\Lumen\Application->sendThroughPipeline(Array, Object(Closure))
#21 C:\laragon\www\kompas-id-apiwcm\vendor\laravel\lumen-framework\src\Concerns\RoutesRequests.php(108): Laravel\Lumen\Application->dispatch(NULL)
#22 C:\laragon\www\kompas-id-apiwcm\public\index.php(28): Laravel\Lumen\Application->run()
#23 {main} {"exception":"[object] (PhpAmqpLib\\Exception\\AMQPOutOfRangeException(code: 0): AMQP-rabbit doesn't define data of type [] at C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\php-amqplib\\php-amqplib\\PhpAmqpLib\\Wire\\AMQPAbstractCollection.php:420)
[stacktrace]
#0 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\php-amqplib\\php-amqplib\\PhpAmqpLib\\Wire\\AMQPWriter.php(425): PhpAmqpLib\\Wire\\AMQPAbstractCollection::getDataTypeForSymbol(NULL)
#1 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\php-amqplib\\php-amqplib\\PhpAmqpLib\\Wire\\AMQPWriter.php(443): PhpAmqpLib\\Wire\\AMQPWriter->write_table(Array)
#2 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\php-amqplib\\php-amqplib\\PhpAmqpLib\\Wire\\GenericContent.php(199): PhpAmqpLib\\Wire\\AMQPWriter->write_table_object(Array)
#3 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\php-amqplib\\php-amqplib\\PhpAmqpLib\\Channel\\AMQPChannel.php(1123): PhpAmqpLib\\Wire\\GenericContent->serialize_properties()
#4 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\bschmitt\\laravel-amqp\\src\\Publisher.php(18): PhpAmqpLib\\Channel\\AMQPChannel->basic_publish(Object(Bschmitt\\Amqp\\Message), 'amq.headers', 'routing-key')
#5 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\bschmitt\\laravel-amqp\\src\\Amqp.php(33): Bschmitt\\Amqp\\Publisher->publish('routing-key', Object(Bschmitt\\Amqp\\Message))
#6 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\illuminate\\support\\Facades\\Facade.php(237): Bschmitt\\Amqp\\Amqp->publish('routing-key', Object(Bschmitt\\Amqp\\Message), Array)
#7 C:\\laragon\\www\\kompas-id-apiwcm\\app\\Http\\Controllers\\V1\\MembershipController.php(64): Illuminate\\Support\\Facades\\Facade::__callStatic('publish', Array)
#8 [internal function]: App\\Http\\Controllers\\V1\\MembershipController->create(Object(Laravel\\Lumen\\Http\\Request))
#9 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\illuminate\\container\\BoundMethod.php(32): call_user_func_array(Array, Array)
#10 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\illuminate\\container\\BoundMethod.php(90): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#11 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\illuminate\\container\\BoundMethod.php(34): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Laravel\\Lumen\\Application), Array, Object(Closure))
#12 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\illuminate\\container\\Container.php(576): Illuminate\\Container\\BoundMethod::call(Object(Laravel\\Lumen\\Application), Array, Array, NULL)
#13 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(376): Illuminate\\Container\\Container->call(Array, Array)
#14 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(342): Laravel\\Lumen\\Application->callControllerCallable(Array, Array)
#15 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(316): Laravel\\Lumen\\Application->callLumenController(Object(App\\Http\\Controllers\\V1\\MembershipController), 'create', Array)
#16 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(278): Laravel\\Lumen\\Application->callControllerAction(Array)
#17 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(263): Laravel\\Lumen\\Application->callActionOnArrayBasedRoute(Array)
#18 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(165): Laravel\\Lumen\\Application->handleFoundRoute(Array)
#19 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(416): Laravel\\Lumen\\Application->Laravel\\Lumen\\Concerns\\{closure}(Object(Laravel\\Lumen\\Http\\Request))
#20 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(171): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure))
#21 C:\\laragon\\www\\kompas-id-apiwcm\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(108): Laravel\\Lumen\\Application->dispatch(NULL)
#22 C:\\laragon\\www\\kompas-id-apiwcm\\public\\index.php(28): Laravel\\Lumen\\Application->run()
#23 {main}
"} 

my code is like this

$properties = [
                        'application_headers' => [
                            'source'=>'google_play'
                        ],
                        'content_type' => 'application/json',
                        'delivery_mode' => 2,
                        'priority' => 1

                    ];
                    $message = Amqp::message('messagesss',$properties);
                    Amqp::publish('routing-key', $message , ['exchange' => 'amq.headers']);

i see that the error because the application_headers cannot accept array so i used the AMQPTables in PhpAmqpLib\Wire\AMQPTable like this

 $header = new AMQPTable();
                    $header->set('source','google_play');
                    $properties = [
                        'application_headers' => $header,
                        'content_type' => 'application/json',
                        'delivery_mode' => 2,
                        'priority' => 1

                    ];
                    $message = Amqp::message('messagesss',$properties);
                    Amqp::publish('routing-key', $message , ['exchange' => 'amq.headers']);

is there any support of AMQPTables in the wrapper? if not i will try to do pull request

stevenklar commented 4 years ago

Right now we expect it to be an array everywhere and I don't see that we support this yet. @dennisgon You're welcome to contribute the possiblity to use arrays and AMQPTable. :+1:

And by the way, we just override the default AMQPMessage class but we don't do anything with it. So it should work the same.