Spring-core с аннотацией @RabbitListener не запускает ограниченный метод - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь использовать аннотацию rabbitmq @RabbitListener в своих методах, чтобы каждый раз, когда приходит какое-либо сообщение, мой метод мог запускаться автоматически. Основываясь на предоставленной официальной документации здесь , я создал следующий класс конфигурации

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.MessageListenerContainer;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfiguration {
    public static final String QUEUE_NAME="myQueue";
    public static final String EXCHANGE_NAME="my_EXCHANGE";

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setMaxConcurrentConsumers(5);
        return factory;
    }
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory =
                new CachingConnectionFactory("localhost");
        return connectionFactory;
    }
    @Bean
    public AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        return new RabbitTemplate(connectionFactory());
    }

    @Bean
    public Queue myQueue() {
        return new Queue(QUEUE_NAME);
    }
   @Bean
   MessageListenerContainer messageListenerContainer() {
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
        simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
        simpleMessageListenerContainer.setQueues(myQueue());
        simpleMessageListenerContainer.setMessageListener(new RabbitMQListner());
        return simpleMessageListenerContainer;
    }
    @Bean
    FanoutExchange exchange() {
        return new FanoutExchange(EXCHANGE_NAME);
    }

    @Bean
    Binding binding(Queue queue, FanoutExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange);
    }
    @Bean
    MessagingService messagingService(){
        return new MessagingService();
    }
}

Затем из моего класса обслуживания я использовал следующее: -


@Component
public class MessagingService {
public void send(String msg){
        ApplicationContext context =
                new AnnotationConfigApplicationContext(RabbitConfiguration.class);


        AmqpTemplate template = context.getBean(AmqpTemplate.class);

        template.convertAndSend(QUEUE_NAME,"Hello from template "+msg);
    }

    @RabbitListener(queues=QUEUE_NAME)
    private void receiveMessage(String order) {
        System.out.println("Hello"+order);
    }

метод отправки работает нормально. Но метод receiveMessage не печатает ожидаемый результат. Он должен распечатать сообщение, как только оно поступит в очередь. Вместо этого, когда я попытался применить аннотацию @EnableRabbit в моем файле конфигурации, я получил исключение java.lang.ArrayStoreException во время выполнения. Метод receiveMessage даже не выполняется.
Вы можете игнорировать опечатку.

...