RabbitMQ double ack 报错

报错信息:

16:50:10.134 ERROR 17788 ---  o.s.a.r.c.CachingConnectionFactory       : 
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)

使用rabbitmq的时候总是报错信道关闭。网上查了原因,大多说的是因为没有配置RabbitAdmin,无法自动创建exchange的。但是我配置了RabbitAdmin,也能够自动创建exchange,还是报这个错,而且这个错居然不影响消息队列运行。
后来看到这篇文章https://www.cnblogs.com/zhjh256/p/6434093.html,其中提到double ack问题,联想到我配置了序列化为json格式,所以重新配置了rabbitmq,

@Configuration
public class RabbitMqConfig {

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

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter);
        return factory;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new ContentTypeDelegatingMessageConverter(new Jackson2JsonMessageConverter());
    }
}

在yml配置文件中设置了手动ack


spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: rabbit
    password: 123456
    virtual-host: /
    #生产端
    publisher-confirms: true
    publisher-returns: true
    template:
      mandatory: true
    #消费端
    listener:
      simple:
        acknowledge-mode: manual
        #初始连接数量
        concurrency: 5
        #最大连接数量
        max-concurrency: 10
        #限流
        prefetch: 1

yml中的签收模式失效,被注解注入的SimpleRabbitListenerContainerFactory覆盖,而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false),于是导致了两次ack,所以报错。
解决方法是在rabbitmq的factory中指定ack模式。

 public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
      SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
      factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
      factory.setConnectionFactory(connectionFactory);
      factory.setMessageConverter(messageConverter);
      return factory;
  }
  ```
<think>嗯,用户想在Ubuntu上安装Anaconda后创建桌面快捷方式。首先,我需要回忆一下在Linux系统中创建桌面快捷方式的一般方法。通常,桌面快捷方式是.desktop文件,存放在~/.local/share/applications/或者/usr/share/applications/目录下。用户可能没有权限写入系统目录,所以建议在用户目录下创建。 接下来,我需要确定Anaconda安装后的路径。默认情况下,Anaconda可能安装在用户的主目录下的anaconda3文件夹,比如/home/username/anaconda3。但用户可能自定义了安装路径,所以需要确认。此外,Anaconda的可执行文件通常是conda,但用户可能想启动Anaconda Navigator,这时候应该找anaconda-navigator命令或者对应的启动脚本。 然后,创建.desktop文件需要指定几个关键字段,比如Type、Name、Exec、Icon、Categories等。其中Exec需要指向启动Anaconda Navigator的命令,可能是一个shell脚本或者直接运行anaconda-navigator。如果用户通过bash启动,可能需要指定终端,或者直接使用GUI应用。 图标方面,Anaconda通常自带图标文件,可能位于安装目录下的某个路径,比如~/anaconda3/lib/pythonX.X/site-packages/anaconda_navigator/static/images/icon.png。如果找不到,用户可能需要下载或自己准备一个图标。 另外,权限问题也很重要,.desktop文件需要具有可执行权限,否则无法运行。所以创建完文件后,要用chmod +x命令赋予权限。 可能还需要考虑用户是否使用图形界面,比如Gnome或KDE,不同桌面环境可能有细微差别,但.desktop文件的标准是通用的。如果用户创建后图标没显示,可能需要注销重新登录,或者运行更新命令。 最后,验证步骤也很关键,确保.desktop文件能正确启动应用,图标显示正常。如果有错误,可以查看.desktop文件的语法是否正确,路径是否存在,权限是否设置正确。 可能遇到的问题包括路径错误、图标文件不存在、缺少可执行权限等,需要逐步排查。另外,用户可能希望同时创建启动器和终端中的快捷方式,或者配置环境变量,但问题主要是桌面图标,所以重点在.desktop文件的创建。</think>在Ubuntu系统中为Anaconda创建桌面快捷方式可通过以下步骤实现: ### 一、创建.desktop文件 1. 打开终端,使用文本编辑器创建新文件: ```bash nano ~/.local/share/applications/anaconda.desktop ``` 2. 输入以下内容(需根据实际安装路径修改): ```desktop [Desktop Entry] Version=1.0 Type=Application Name=Anaconda Exec=/home/你的用户名/anaconda3/bin/anaconda-navigator Icon=/home/你的用户名/anaconda3/lib/python3.X/site-packages/anaconda_navigator/static/images/icon.png Terminal=false Categories=Development; Comment=Scientific Python Development Environment ``` ### 二、设置权限 ```bash chmod +x ~/.local/share/applications/anaconda.desktop ``` ### 三、添加到桌面 1. 将文件复制到桌面目录: ```bash cp ~/.local/share/applications/anaconda.desktop ~/Desktop/ ``` 2. 右键点击桌面图标选择"允许启动" ### 关键路径说明: - Anaconda默认安装路径:$HOME/anaconda3$ - 图标路径中的`python3.X`需替换为实际版本号(如python3.9) - 若找不到图标文件,可使用通用Python图标或自行下载 ### 验证方法: 双击桌面图标后,若出现Anaconda Navigator界面即表示成功。若启动失败,可通过终端运行$anaconda-navigator$查看具体报错信息[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值