如何在Spring AMQP中以编程方式将异步使用方订阅到队列?

丹尼尔·切雷塞多(Daniel Cerecedo)

Spring AMQP文档仅显示如何在应用程序初始化时使用来以编程方式订阅队列~MessageListenerContainer

现在,代码如下所示:

public void subscribe(EventType eventType, Object consumer) {
        Assert.notNull(eventType);
        Assert.notNull(eventType.toString());
        Assert.isTrue(!eventType.toString().isEmpty());

        Queue queue=new Queue("", false, true, true);
        Map<String, Exchange> beanMap=context.getBeansOfType(Exchange.class);
        if(beanMap!=null&&!beanMap.isEmpty()){
            Exchange exchange=null;
            boolean found=false;
            for(String key : beanMap.keySet()) {
                exchange=beanMap.get(key);
                if(getExchangeName(eventType.toString()).equals(exchange.getName())){
                    found=true;
                    break;
                }
            }
            if(found){
                amqpAdmin.declareQueue(queue);
                amqpAdmin.declareBinding(new Binding(queue.getName(), Binding.DestinationType.QUEUE, exchange.getName(), "", null));
                SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
                container.setConnectionFactory(connectionFactory);
                container.setQueueNames(queue.getName());
                container.setMessageListener(new MessageListenerAdapter(consumer));
            }else{
                //TODO
            }
        }
    }

由于SimpleMessageListenerContainer是生命周期Bean,因此除非在@ConfigurationBean中使用,否则它将无法正常工作

我需要在运行时以编程方式创建预订,以便Bean从队列中获取事件。任何想法如何做到这一点?

丹尼尔·切雷塞多(Daniel Cerecedo)

Gary Russells的回答是正确的,但是我的代码仍然存在一些剩余错误:

  • 如果您创建的队列没有名称,RabbitMQ 创建时 会给它一个随机的唯一名称。声明队列时必须检索它,然后在声明容器和绑定时使用此名称

为了清楚起见,我在最终版本中添加了修改后的代码块:

    public void subscribe(EventType eventType, AbstractEventConsumer consumer) {
    Assert.notNull(eventType);
    Assert.notNull(eventType.toString());
    Assert.isTrue(!eventType.toString().isEmpty());

    Queue queue=new Queue("", false, true, true);
    Map<String, Exchange> beanMap=context.getBeansOfType(Exchange.class);
    if(beanMap!=null&&!beanMap.isEmpty()){
        Exchange exchange=null;
        boolean found=false;
        for(String key : beanMap.keySet()) {
            exchange=beanMap.get(key);
            if(getExchangeName(eventType.toString()).equals(exchange.getName())){
                found=true;
                break;
            }
        }
        if(found){
            String queueName=amqpAdmin.declareQueue(queue);
            amqpAdmin.declareBinding(new Binding(queueName, Binding.DestinationType.QUEUE, exchange.getName(), "", null));
            SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.setQueueNames(queueName);
            container.setMessageListener(new MessageListenerAdapter(consumer));
            container.start();
        }else{
            //TODO
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在选择 Amqp/RabbitMQ 队列之前“检查”(Spring AMQP)

来自分类Dev

如何在Spring中以编程方式注册FactoryBean的实例

来自分类Dev

如何在Spring 3中以编程方式执行注销

来自分类Dev

如何在Spring Boot中以编程方式创建bean?

来自分类Dev

如何在Spring Boot中以编程方式创建bean?

来自分类Dev

如何在Spring中以编程方式获取@Service实例

来自分类Dev

如何在Spring中以编程方式获取entitymanager?

来自分类Dev

如何在Spring Boot中以编程方式制作@Bean

来自分类Dev

如何在nodejs中以编程方式删除Rabbitmq中的队列?

来自分类Dev

如何将多个异步方法设置到队列中?

来自分类Dev

如何在Azure角色中以编程方式获取订阅ID?

来自分类Dev

如何在Azure角色中以编程方式获取订阅ID?

来自分类Dev

如何在Laravel队列中以编程方式重试作业?

来自分类Dev

如何在Laravel队列中以编程方式重试作业?

来自分类Dev

如何使用Spring AMQP读取队列中的消息?

来自分类Dev

如何通过使用Swift单击按钮以编程方式将文本输入到UITextView中

来自分类Dev

如何在春季启动测试中模拟spring amqp / rabbit

来自分类Dev

Spring Amqp:如何在MessageListenerAdapter中读取MessageProperties

来自分类Dev

如何在 Spring Integration 中取消订阅文件频道?

来自分类Dev

如何在Spring应用程序中监视JMS队列?

来自分类Dev

如何在Spring Boot中禁用ErrorPageFilter?

来自分类Dev

如何在Spring中包装JSON响应

来自分类Dev

如何在Spring Junit中创建会话

来自分类Dev

如何在Spring MVC中链接页面

来自分类Dev

我如何在Spring中创建ServletContext

来自分类Dev

如何在Spring LDAP中配置SSL?

来自分类Dev

如何在Spring Boot中添加UrlRewriteFilter

来自分类Dev

如何在集群中配置Spring WebSocket

来自分类Dev

如何在Spring MVC中链接页面

Related 相关文章

  1. 1

    如何在选择 Amqp/RabbitMQ 队列之前“检查”(Spring AMQP)

  2. 2

    如何在Spring中以编程方式注册FactoryBean的实例

  3. 3

    如何在Spring 3中以编程方式执行注销

  4. 4

    如何在Spring Boot中以编程方式创建bean?

  5. 5

    如何在Spring Boot中以编程方式创建bean?

  6. 6

    如何在Spring中以编程方式获取@Service实例

  7. 7

    如何在Spring中以编程方式获取entitymanager?

  8. 8

    如何在Spring Boot中以编程方式制作@Bean

  9. 9

    如何在nodejs中以编程方式删除Rabbitmq中的队列?

  10. 10

    如何将多个异步方法设置到队列中?

  11. 11

    如何在Azure角色中以编程方式获取订阅ID?

  12. 12

    如何在Azure角色中以编程方式获取订阅ID?

  13. 13

    如何在Laravel队列中以编程方式重试作业?

  14. 14

    如何在Laravel队列中以编程方式重试作业?

  15. 15

    如何使用Spring AMQP读取队列中的消息?

  16. 16

    如何通过使用Swift单击按钮以编程方式将文本输入到UITextView中

  17. 17

    如何在春季启动测试中模拟spring amqp / rabbit

  18. 18

    Spring Amqp:如何在MessageListenerAdapter中读取MessageProperties

  19. 19

    如何在 Spring Integration 中取消订阅文件频道?

  20. 20

    如何在Spring应用程序中监视JMS队列?

  21. 21

    如何在Spring Boot中禁用ErrorPageFilter?

  22. 22

    如何在Spring中包装JSON响应

  23. 23

    如何在Spring Junit中创建会话

  24. 24

    如何在Spring MVC中链接页面

  25. 25

    我如何在Spring中创建ServletContext

  26. 26

    如何在Spring LDAP中配置SSL?

  27. 27

    如何在Spring Boot中添加UrlRewriteFilter

  28. 28

    如何在集群中配置Spring WebSocket

  29. 29

    如何在Spring MVC中链接页面

热门标签

归档