|
1 | 1 | /*
|
2 |
| - * Copyright 2014-2021 the original author or authors. |
| 2 | + * Copyright 2014-2022 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
@@ -414,7 +414,19 @@ protected Collection<Declarable> processListener(MethodRabbitListenerEndpoint en
|
414 | 414 | endpoint.setBean(bean);
|
415 | 415 | endpoint.setMessageHandlerMethodFactory(this.messageHandlerMethodFactory);
|
416 | 416 | endpoint.setId(getEndpointId(rabbitListener));
|
417 |
| - endpoint.setQueueNames(resolveQueues(rabbitListener, declarables)); |
| 417 | + List<Object> resolvedQueues = resolveQueues(rabbitListener, declarables); |
| 418 | + if (!resolvedQueues.isEmpty()) { |
| 419 | + if (resolvedQueues.get(0) instanceof String) { |
| 420 | + endpoint.setQueueNames(resolvedQueues.stream() |
| 421 | + .map(o -> (String) o) |
| 422 | + .collect(Collectors.toList()).toArray(new String[0])); |
| 423 | + } |
| 424 | + else { |
| 425 | + endpoint.setQueues(resolvedQueues.stream() |
| 426 | + .map(o -> (Queue) o) |
| 427 | + .collect(Collectors.toList()).toArray(new Queue[0])); |
| 428 | + } |
| 429 | + } |
418 | 430 | endpoint.setConcurrency(resolveExpressionAsStringOrInteger(rabbitListener.concurrency(), "concurrency"));
|
419 | 431 | endpoint.setBeanFactory(this.beanFactory);
|
420 | 432 | endpoint.setReturnExceptions(resolveExpressionAsBoolean(rabbitListener.returnExceptions()));
|
@@ -625,58 +637,85 @@ private String getEndpointId(RabbitListener rabbitListener) {
|
625 | 637 | }
|
626 | 638 | }
|
627 | 639 |
|
628 |
| - private String[] resolveQueues(RabbitListener rabbitListener, Collection<Declarable> declarables) { |
| 640 | + private List<Object> resolveQueues(RabbitListener rabbitListener, Collection<Declarable> declarables) { |
629 | 641 | String[] queues = rabbitListener.queues();
|
630 | 642 | QueueBinding[] bindings = rabbitListener.bindings();
|
631 | 643 | org.springframework.amqp.rabbit.annotation.Queue[] queuesToDeclare = rabbitListener.queuesToDeclare();
|
632 |
| - List<String> result = new ArrayList<String>(); |
| 644 | + List<String> queueNames = new ArrayList<String>(); |
| 645 | + List<Queue> queueBeans = new ArrayList<Queue>(); |
633 | 646 | if (queues.length > 0) {
|
634 | 647 | for (int i = 0; i < queues.length; i++) {
|
635 |
| - resolveAsString(resolveExpression(queues[i]), result, true, "queues"); |
| 648 | + resolveQueues(queues[i], queueNames, queueBeans); |
636 | 649 | }
|
637 | 650 | }
|
| 651 | + if (!queueNames.isEmpty()) { |
| 652 | + // revert to the previous behavior of just using the name when there is mixture of String and Queue |
| 653 | + queueBeans.forEach(qb -> queueNames.add(qb.getName())); |
| 654 | + queueBeans.clear(); |
| 655 | + } |
638 | 656 | if (queuesToDeclare.length > 0) {
|
639 | 657 | if (queues.length > 0) {
|
640 | 658 | throw new BeanInitializationException(
|
641 | 659 | "@RabbitListener can have only one of 'queues', 'queuesToDeclare', or 'bindings'");
|
642 | 660 | }
|
643 | 661 | for (int i = 0; i < queuesToDeclare.length; i++) {
|
644 |
| - result.add(declareQueue(queuesToDeclare[i], declarables)); |
| 662 | + queueNames.add(declareQueue(queuesToDeclare[i], declarables)); |
645 | 663 | }
|
646 | 664 | }
|
647 | 665 | if (bindings.length > 0) {
|
648 | 666 | if (queues.length > 0 || queuesToDeclare.length > 0) {
|
649 | 667 | throw new BeanInitializationException(
|
650 | 668 | "@RabbitListener can have only one of 'queues', 'queuesToDeclare', or 'bindings'");
|
651 | 669 | }
|
652 |
| - return registerBeansForDeclaration(rabbitListener, declarables); |
653 |
| - } |
654 |
| - return result.toArray(new String[result.size()]); |
| 670 | + return Arrays.stream(registerBeansForDeclaration(rabbitListener, declarables)) |
| 671 | + .map(s -> (Object) s) |
| 672 | + .collect(Collectors.toList()); |
| 673 | + } |
| 674 | + return queueNames.isEmpty() |
| 675 | + ? queueBeans.stream() |
| 676 | + .map(s -> (Object) s) |
| 677 | + .collect(Collectors.toList()) |
| 678 | + : queueNames.stream() |
| 679 | + .map(s -> (Object) s) |
| 680 | + .collect(Collectors.toList()); |
| 681 | + |
| 682 | + } |
| 683 | + |
| 684 | + private void resolveQueues(String queue, List<String> result, List<Queue> queueBeans) { |
| 685 | + resolveAsStringOrQueue(resolveExpression(queue), result, queueBeans, "queues"); |
655 | 686 | }
|
656 | 687 |
|
657 | 688 | @SuppressWarnings("unchecked")
|
658 |
| - private void resolveAsString(Object resolvedValue, List<String> result, boolean canBeQueue, String what) { |
| 689 | + private void resolveAsStringOrQueue(Object resolvedValue, List<String> names, @Nullable List<Queue> queues, |
| 690 | + String what) { |
| 691 | + |
659 | 692 | Object resolvedValueToUse = resolvedValue;
|
660 | 693 | if (resolvedValue instanceof String[]) {
|
661 | 694 | resolvedValueToUse = Arrays.asList((String[]) resolvedValue);
|
662 | 695 | }
|
663 |
| - if (canBeQueue && resolvedValueToUse instanceof Queue) { |
664 |
| - result.add(((Queue) resolvedValueToUse).getName()); |
| 696 | + if (queues != null && resolvedValueToUse instanceof Queue) { |
| 697 | + if (!names.isEmpty()) { |
| 698 | + // revert to the previous behavior of just using the name when there is mixture of String and Queue |
| 699 | + names.add(((Queue) resolvedValueToUse).getName()); |
| 700 | + } |
| 701 | + else { |
| 702 | + queues.add((Queue) resolvedValueToUse); |
| 703 | + } |
665 | 704 | }
|
666 | 705 | else if (resolvedValueToUse instanceof String) {
|
667 |
| - result.add((String) resolvedValueToUse); |
| 706 | + names.add((String) resolvedValueToUse); |
668 | 707 | }
|
669 | 708 | else if (resolvedValueToUse instanceof Iterable) {
|
670 | 709 | for (Object object : (Iterable<Object>) resolvedValueToUse) {
|
671 |
| - resolveAsString(object, result, canBeQueue, what); |
| 710 | + resolveAsStringOrQueue(object, names, queues, what); |
672 | 711 | }
|
673 | 712 | }
|
674 | 713 | else {
|
675 | 714 | throw new IllegalArgumentException(String.format(
|
676 | 715 | "@RabbitListener."
|
677 | 716 | + what
|
678 | 717 | + " can't resolve '%s' as a String[] or a String "
|
679 |
| - + (canBeQueue ? "or a Queue" : ""), |
| 718 | + + (queues != null ? "or a Queue" : ""), |
680 | 719 | resolvedValue));
|
681 | 720 | }
|
682 | 721 | }
|
@@ -776,7 +815,7 @@ private void registerBindings(QueueBinding binding, String queueName, String exc
|
776 | 815 | final int length = binding.key().length;
|
777 | 816 | routingKeys = new ArrayList<>();
|
778 | 817 | for (int i = 0; i < length; ++i) {
|
779 |
| - resolveAsString(resolveExpression(binding.key()[i]), routingKeys, false, "@QueueBinding.key"); |
| 818 | + resolveAsStringOrQueue(resolveExpression(binding.key()[i]), routingKeys, null, "@QueueBinding.key"); |
780 | 819 | }
|
781 | 820 | }
|
782 | 821 | final Map<String, Object> bindingArguments = resolveArguments(binding.arguments());
|
|
0 commit comments