当前位置: 首页 > 面试题库 >

Spring RabbitMQ-在具有@RabbitListener配置的服务上使用手动通道确认

邹举
2023-03-14
问题内容

如何在不使用自动确认的情况下手动确认消息。有没有一种方法可以将其@RabbitListener@EnableRabbit配置和样式一起使用。大多数文档告诉我们与SimpleMessageListenerContainer一起使用ChannelAwareMessageListener。但是,使用它会失去注释提供的灵活性。我已将服务配置如下:

@Service
public class EventReceiver {

@Autowired
private MessageSender messageSender;

@RabbitListener(queues = "${eventqueue}")
public void receiveMessage(Order order) throws Exception {

  // code for processing order
}

我的RabbitConfiguration如下

@EnableRabbit
public class RabbitApplication implements RabbitListenerConfigurer {

public static void main(String[] args) {
    SpringApplication.run(RabbitApplication.class, args);
}

@Bean


public MappingJackson2MessageConverter jackson2Converter() {
        MappingJackson2MessageConverter converter = new  MappingJackson2MessageConverter();
        return converter;
    @Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
      SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
      factory.setConnectionFactory(rabbitConnectionFactory());
      factory.setMaxConcurrentConsumers(5);
      factory.setMessageConverter((MessageConverter) jackson2Converter());
      factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
      return factory;
    }

@Bean
public ConnectionFactory rabbitConnectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
    connectionFactory.setHost("localhost");
    return connectionFactory;
}

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
    registrar.setContainerFactory(myRabbitListenerContainerFactory());
}

@Autowired
private EventReceiver receiver;
}
}

任何有关如何适应手动通道确认以及上述配置样式的帮助将不胜感激。如果我们实现ChannelAwareMessageListener,则onMessage签名将更改。我们可以在服务上实现ChannelAwareMessageListener吗?


问题答案:

Channel@RabbitListener方法添加到…

@RabbitListener(queues = "${eventqueue}")
public void receiveMessage(Order order, Channel channel,
    @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws Exception {
    ...
}

并使用了标签basicAckbasicReject

编辑

@SpringBootApplication
@EnableRabbit
public class So38728668Application {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(So38728668Application.class, args);
        context.getBean(RabbitTemplate.class).convertAndSend("", "so38728668", "foo");
        context.getBean(Listener.class).latch.await(60, TimeUnit.SECONDS);
        context.close();
    }

    @Bean
    public Queue so38728668() {
        return new Queue("so38728668");
    }

    @Bean
    public Listener listener() {
        return new Listener();
    }

    public static class Listener {

        private final CountDownLatch latch = new CountDownLatch(1);

        @RabbitListener(queues = "so38728668")
        public void receive(String payload, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag)
                throws IOException {
            System.out.println(payload);
            channel.basicAck(tag, false);
            latch.countDown();
        }

    }

}

application.properties:

spring.rabbitmq.listener.acknowledge-mode=manual


 类似资料:
  • 本文向大家介绍在服务器上配置仅使用HTTPS通信的教程,包括了在服务器上配置仅使用HTTPS通信的教程的使用技巧和注意事项,需要的朋友参考一下 HTTP 严格传输安全(HSTS)是一种安全功能,web 服务器通过它来告诉浏览器仅用 HTTPS 来与之通讯,而不是使用 HTTP。本文会说明如何在 Apache2、Nginx 和 Lighttpd 上如何启用 HSTS。在主流的 web 服务器上测试通

  • 注意的是下面事项并非表示 VUX 使用繁琐,部分只是出于确保有正确的依赖和配置,而部分是出于优化。 请将 babel-loader 的配置写到 .babelrc 里而不是使用 options,否则可能会出错。 折腾能力强的同学参考一下,下面即airyland/vux2模板主要处理的事项: 引入 reset.less,默认样式不包含reset,并且部分用户自己有一套reset样式,因此需要在App.

  • 我正在努力为我的詹金斯管道获得正确的配置。 它工作,但我不知道如何分离测试 要求: < li >带单独测试的Jenkins管道 当前设置: Jenkinsfile: Dockerfile: 这很有效,但正如您所看到的“构建 我想要 2 个独立的 jenkins 阶段(测试、构建) 我已经尝试使用Jenkins代理docker并在Jenkins文件中定义测试阶段的映像,但我不知道如何在那里添加缺少的

  • 我们来看看如何配置服务器端的 SSH 访问。 本例中,我们将使用 authorized_keys 方法来对用户进行认证。 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 Ubuntu。 首先,创建一个操作系统用户 git,并为其建立一个 .ssh 目录。 $ sudo adduser git $ su git $ cd $ mkdir .ssh && chmod 700 .ssh

  • 问题内容: 背景 我正在尝试将条纹付款集成到我的网站中。我需要使用我的专用条纹密钥创建一个条纹用户。我将此密钥存储在服务器上,并调用服务器方法来创建用户。也许还有另一种方法可以做到这一点? 我的尝试和结果 我一直在使用相同的客户端代码和不同的服务器代码。所有尝试都会立即在客户端的console.log(…)上给出undefined,但在服务器的console.log(…)上给出正确的响应: 我也尝

  • 好的,这是我的Ignite服务器cfg代码。 这是我的Ignite客户端代码。 所以我的问题是,我必须有同样的代码,包含所有缓存配置,包括客户端的数据源吗?如何避免这种代码冗余?