Вот решение с использованием регулярных выражений:
List<double> numbers = new Regex(@"(\d+)\*x").Matches(line)
.Cast<Match>()
.Select(m => double.Parse(m.Groups[1].Value))
.ToList();
EDIT: обновлено для анализа чисел.
Я наконец нашел рабочее решение. Как подчеркнул Люк Баккен, опрос не требуется. Я просто звоню receiveMesssages()
только один раз. После этого мой потребитель получает обратные вызовы, когда сообщения публикуются в очереди.
protected LinkedBlockingQueue<Message> messages = new LinkedBlockingQueue<>();
public void receiveMessages() {
try {
Message message = new Message();
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
long deliveryTag = delivery.getEnvelope().getDeliveryTag();
String response = new String(delivery.getBody(), "UTF-8");
if (response != null) {
message.setId(NUID.nextGlobal());
message.setPayload(response);
message.setDeliveryTag(deliveryTag);
messages.add(message);
logger.info("Message received: ", message.getPayload());
};
channel.basicConsume(queueName, false, deliverCallback, consumerTag -> { });
} catch (Exception e) {
logger.error("Exception while getting messages from Rabbit ", e);
}
}
На консоли кролика теперь отображается только 1 запись тега потребления в связанной очереди.
Нормально ли видеть эти растущие потребительские теги?
blockquote>Нет, в вашем коде есть ошибка. Вам нужно либо просто использовать долгосрочного потребителя, либо вы должны отменить своего потребителя, когда закончите с ним.
Я не вижу необходимости «опрашивать»
receiveMessages
- просто дайте ему работать самостоятельно, и он будет добавлять сообщения в синхронизированную очередь, как вы ожидаете.
ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки
rabbitmq-users
и только иногда отвечает на вопросы по StackOverflow.