@RabittListener игнорирует routingKey - PullRequest
0 голосов
/ 07 февраля 2019

На стороне производителя я посылаю несколько типов объектов, сериализованных в виде строк json.Для различения я посылаю имя класса в качестве ключа маршрутизации.

На стороне потребителя я пытаюсь использовать несколько конфигураций @RabittListener, каждая с различным ключом маршрутизации, так что обрабатывается только соответствующий класс.

Но это не работает, сообщения с другими ключами маршрутизации направляются этому методу.

Что я здесь не так делаю?

/**
 * Sends an arbitrary object via the configured queue to a amqp instance. To distinguish the message types on the consumer side, we send the message with
 * the objects class name as a routing key.
 *
 * The object is sent as serialized json object
 *
 * @param obj
 * @throws TurbineException
 */
public void send(Object obj) throws TurbineException {

    if (enabled) {
        String routingKey = obj.getClass().getName();
        String json = serializer.toJson(obj);
        byte[] payload = json.getBytes();
        if (connection == null) {
            throw new TurbineException("Trying to send message to RabbitMQ  but connection is null");
        }
        try (Channel channel = connection.createChannel();) {
            log.info(String.format("Sending data of type %s to queue %s", routingKey, queueName));
            log.info(String.format("Data sent: %s", json));
            channel.exchangeDeclare(EMS_META_EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
            channel.queueDeclare(queueName, true, false, false, null);
            channel.queueBind(queueName, EMS_META_EXCHANGE_NAME, routingKey);
            channel.basicPublish(EMS_META_EXCHANGE_NAME, routingKey, null, payload);
        }
        catch (IOException | TimeoutException e) {
            throw new TurbineException(e);
        }
    }
}

@Autowired
private ProfileMetaService profileMetaService;

@RabbitListener(bindings = @QueueBinding(value = @Queue(value = MetaServiceApplication.EMS_META_QUEUE, durable = "true"), exchange = @Exchange(value = MetaServiceApplication.EMS_META_EXCHANGE_NAME), key = "com.xaxis.janus.turbine.modeling.profile.ProfileMeta"))
@Transactional
public void processMessage(Message message) {
    try {
        String msg = new String(message.getBody());
        if (LOG.isDebugEnabled()) {
            LOG.debug("ProfileMeta received: {}", msg);
        }
        ProfileMeta profileMeta = fromJson(msg, ProfileMeta.class);
        profileMetaService.save(profileMeta);
    }
    catch (Exception e) {
        throw new RuntimeException(e);
    }
}

1 Ответ

0 голосов
/ 07 февраля 2019

RabbitMQ / AMQP не работает таким образом;вам нужна отдельная очередь для каждого ключа маршрутизации.

Потребитель не может "выбирать" сообщения из очереди на основе ключа, который использовался для их маршрутизации.

Маршрутизация выполняется вобмен;каждому потребителю нужна своя очередь.

...