如何使用‘;客户个人’;PHP7.1或更高版本中的ack模式?

如何使用‘;客户个人’;PHP7.1或更高版本中的ack模式?,php,symfony,php-7,stomp,Php,Symfony,Php 7,Stomp,我试图确认Symfony 4应用程序中ActiveMQ 5.15.9消息队列中的一条消息。到目前为止,我使用了3个stomp客户端来实现这一点: 排队开发包 跺脚php包 STOMP php扩展(来自PECL 2.0.2) 似乎它们都不支持ack模式的更改。我试图遍历队列中的所有消息,并只确认其中的一些消息。即使使用事务,我也尝试了许多变体,但还没有解决方案。这在PHP5.3中是可能的 php排队/排队开发 虽然循环在第一条消息之后停止,但在我确认当前消息之前它不会继续。使用reject方法

我试图确认Symfony 4应用程序中ActiveMQ 5.15.9消息队列中的一条消息。到目前为止,我使用了3个stomp客户端来实现这一点:

  • 排队开发包

  • 跺脚php包

  • STOMP php扩展(来自PECL 2.0.2)

似乎它们都不支持ack模式的更改。我试图遍历队列中的所有消息,并只确认其中的一些消息。即使使用事务,我也尝试了许多变体,但还没有解决方案。这在PHP5.3中是可能的

php排队/排队开发 虽然循环在第一条消息之后停止,但在我确认当前消息之前它不会继续。使用reject方法时,有一个重新获取消息的选项,但ActiveMQ不支持此标志

使用Enqueue\Stomp\StompConnectionFactory;
$stompFactory=新StompConnectionFactory('stomp://127.0.0.1:61613?login=admin&password=admin');
$context=$stompFactory->createContext();
$messageQueue=$context->createQueue('foo.bar');
$consumer=$context->createConsumer($messageQueue);
$consumer->setAckMode('client-individual');
而($msg=$consumer->receive(50)){
$messages[]=$msg;
}
跺脚 与enqueue-dev中的情况相同

使用Stomp\Client;
使用Stomp\StatefulStomp;
$client=新客户端($client)tcp://127.0.0.1:61613');
$client->setLogin('admin','admin');
$client->getConnection()->setReadTimeout(1);
$stomp=新状态stomp($client);
$stomp->subscribe('foo.bar',null,'client-individual');
而($msg=$stomp->read()){
$messages[]=$msg;
}
STOMP扩展2.0.2 我可以在没有确认的情况下得到所有的消息,但是当我试图在中间确认一个消息时,所有先前的消息也被确认。(这意味着它是客户端确认模式)。同样的代码在PHP5.3和STOMP 1.0.9上工作,支持“客户机个人”,我可以确认一条消息

$stomp=new\stomp('tcp://localhost:61613","admin","admin",;
$stomp->subscribe('foo.bar',数组('ack'=>'client individual');
而($msg=$stomp->readFrame()){
$messages[]=$msg;
}
$stomp->ack($messages[1]);

是否可以将所有无法确认的消息放入其他队列?否则,您将基本上被迫无休止地循环。此外,这将解决不支持使用requeue拒绝的enqueue/stomp php的问题。而是将消息移动到新队列并确认它。好吧,我想留下这些“未确认”消息,因为将有另一个函数来处理它们。队列中的消息因标头中的某些自定义属性而不同,并且根据值的不同,它们在不同的时间发生不同的事情。到目前为止,我想到了在一个循环中确认所有这些消息,并将这些“其他”消息存储在一个数组中。在此循环之后,消息将再次发送回队列。这还远远不够完美,这就是为什么我希望让“客户个性化”发挥作用。感谢您的回复。我建议您查看它工作的环境中的STOMP帧流,然后将其与不工作的环境中的STOMP帧流进行比较。任何差异都应该很容易识别,因为STOMP框架只是文本。值得注意的是,相同的代码在PHP 5.3和STOMP 1.0.9上工作,您所做的只是更改PHP和STOMP客户端版本,而不是代理版本,这强烈表明问题不在代理上。这就是为什么我从问题中删除了
activemq
标记。是否可以将所有无法确认的消息放到另一个队列中?否则,您将基本上被迫无休止地循环。此外,这将解决不支持使用requeue拒绝的enqueue/stomp php的问题。而是将消息移动到新队列并确认它。好吧,我想留下这些“未确认”消息,因为将有另一个函数来处理它们。队列中的消息因标头中的某些自定义属性而不同,并且根据值的不同,它们在不同的时间发生不同的事情。到目前为止,我想到了在一个循环中确认所有这些消息,并将这些“其他”消息存储在一个数组中。在此循环之后,消息将再次发送回队列。这还远远不够完美,这就是为什么我希望让“客户个性化”发挥作用。感谢您的回复。我建议您查看它工作的环境中的STOMP帧流,然后将其与不工作的环境中的STOMP帧流进行比较。任何差异都应该很容易识别,因为STOMP框架只是文本。值得注意的是,相同的代码在PHP 5.3和STOMP 1.0.9上工作,您所做的只是更改PHP和STOMP客户端版本,而不是代理版本,这强烈表明问题不在代理上。这就是为什么我从问题中删除了
activemq
标记。