在Magento2 EE中,我需要排队以便在下订单时立即订购详细信息。 Rabbitmq是我们的消息经纪人。我已经安装了rabbitmq并通过以下链接https://inviqa.com/blog/magento-2-tutorial-message-queues配置到Magento2EE。 。一切都很好。我可以通过提供静态订单ID将订单数组推送到队列。
<?php
namespace Inviqa\MessageQueueExample\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Framework\MessageQueue\PublisherInterface;
use Inviqa\MessageQueueExample\Api\MessageInterface;
use Magento\Sales\Model\Order;
class MessagePublishCommand extends Command
{
const COMMAND_QUEUE_MESSAGE_PUBLISH = 'queue:message:publish';
const MESSAGE_ARGUMENT = 'message';
const TOPIC_ARGUMENT = 'topic';
/**
* @var PublisherInterface
*/
protected $publisher;
protected $order;
/**
* @var string
*/
protected $message;
/**
* {@inheritdoc}
*/
public function __construct(
PublisherInterface $publisher,
MessageInterface $message,
Order $order,
$name = null
) {
$this->publisher = $publisher;
$this->message = $message;
$this->order = $order;
parent::__construct($name);
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$message = $input->getArgument(self::MESSAGE_ARGUMENT);
$topic = $input->getArgument(self::TOPIC_ARGUMENT);
try {
$_orderId = 000000004;
$_order = $this->order->load($_orderId);
$_items = $_order->getAllVisibleItems();
foreach ($_items as $_item) {
$_orderItems[] = [
'sku' => $_item->getSku(),
'item_id' => $_item->getId(),
'price' => $_item->getPrice(),
];
}
$message = $_orderItems;
$this->message->setMessage($message);
$this->publisher->publish($topic, $this->message);
/*print_r($message);
die;*/
// $output->writeln(sprintf('Published message "%s" to topic "%s"', $message, $topic));
$output->writeln(sprintf('Published order'));
} catch (\Exception $e) {
$output->writeln($e->getMessage());
}
}
/**
* {@inheritdoc}
*/
protected function configure()
{
$this->setName(self::COMMAND_QUEUE_MESSAGE_PUBLISH);
$this->setDescription('Publish a message to a topic');
$this->setDefinition([
new InputArgument(
self::MESSAGE_ARGUMENT,
InputArgument::REQUIRED,
'Message'
),
new InputArgument(
self::TOPIC_ARGUMENT,
InputArgument::REQUIRED,
'Topic'
),
]);
parent::configure();
}
}
下订单后,对于推送订单对象,我计划使用sales_order_place_after
事件。但是我不确定如何将观察者的结果拉到这个执行动作。