GVKun编程网logo

Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项

13

对于想了解Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项的读者,本文将是一篇不可错过的文章,并且为您提供关于004,配置文件之使用rabbitmq-env.conf

对于想了解Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项的读者,本文将是一篇不可错过的文章,并且为您提供关于004,配置文件之使用rabbitmq-env.conf,rabbitmq.config在生产环境的应用和和一些注意的问题、C++使用RabbitMQ类库做客户端与RabbitMQ Server通讯,生成C++可调用的rabbimq.*.dll的过程、RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ、rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found的有价值信息。

本文目录一览:

Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项

Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项

我确实阅读了此参考资料:https :
//www.rabbitmq.com/dlx.html,但是它并不能解决我的疑问,即:
在接受消息的情况下没有问题- spring-rabbitmq发送ack并且一切都很好,DLX不是吗?不知道确认的消息。

问题是万一拒绝答案,那该怎么扔MessageConverterException?此消息已删除或移至DLX

如果还有其他例外情况呢?例如Exception?它已被删除/重新排队/移至DLX


我想 在@Gary的答案之后进行编辑,
我认为,在答案的@Gary之后,我应该添加有关我的案例的更多详细信息以及@Gary答案的一些摘要。@Gary完全掌握了我的用例。

我不希望重新排队-永不(我害怕循环),但我不想在抛出异常(例如,失去与数据库的连接)时丢失消息-
该消息应重新发送给DLX。另一方面,消息的转换应视为致命错误-不重新排队,不重新发送到DLX-只是永久删除消息。
通常,在依赖异常的情况下,拒绝(=如果配置,则返回DLX)或接受,从不重新排队。

总结一下@Gary提出的简单方法。
首先 :我们可以覆盖ExceptionHandler发送小节/小节的管理,这给了我们完全的控制权。
其次 :IMO更简单,解决方案是设置defaultRequeueRejected=false
并在转换器中抛出ImmediateAcknowledgeAmqpException。它使得RabbitMQ认为答案已被接受(与第一种解决方案的情况相同),而且不会调用侦听器。
**Conclusion**: UsingInstantAcknowledgeAmqpException
orExceptionHandler`异常,我们可以完全控制永久拒绝消息(处于高级确认状态)并重新发送到DLX。

答案1

小编典典

RabbitMQ对异常一无所知。

当容器捕获异常时,它将调用channel.basicReject(deliveryTag, requeue)

如果requeue为true,则重新排队该消息。

默认情况下,除此处提到的例外外

osamqp … MessageConversionException

osmessaging … MessageConversionException

osmessaging … MethodArgumentNotValidException

osmessaging … MethodArgumentTypeMismatchException

java.lang.NoSuchMethodException

java.lang.ClassCastException

requeue 设置为true,因此将消息重新排队。

对于这些例外,认为传递是致命的,并且不重新排队该消息,如果配置了该消息,它将进入DLX / DLQ。

容器有一个defaultRequeueRejected默认为true 的标志;如果设置为false; 没有例外将被重新排队。

对于应用程序级异常,通常,消息将重新排队。要动态拒绝(而不是重新排队)消息,请确保AmqpRejectAndDontRequeueException原因链中有一个。这指示容器不要重新排队该消息,它将转到DLX
/ DLQ(如果已配置)。通过上述defaultRequeueRejected标志启用此行为。

所有这些都在文档中进行了解释,正如我在其他回答中所讨论的那样,您可以使用自定义错误处理程序来更改此行为。文档中也对此进行了说明。

无法向DLX / DLQ发送某些例外,而不能发送其他例外。rabbit仅具有二进制选项,可以重新排队,也可以不重新排队;对于后者,如果配置了DLX /
DLQ,则所有此类拒绝的消息都将进入DLX / DLQ。

Spring
AMQP提供了另一个例外ImmediateAcknowledgeAmqpException。如果您的听众抛出此异常,则该消息将被确认为成功处理(channel.basicAck())。这是容器提供的唯一技术,用于丢弃错误消息而不将其发送到DLX
/ DLQ。

当然,您的应用程序本身可以丢弃此类消息。

如果要对所有业务异常进行DLX /
DLQ,但要放弃转换异常,则抛出AmqpRejectAndDontRequeueException(或设置defaultRequeueRejected为false),然后ImmediateAcknowledgeAmqpException从转换器中抛出。

004,配置文件之使用rabbitmq-env.conf,rabbitmq.config在生产环境的应用和和一些注意的问题

004,配置文件之使用rabbitmq-env.conf,rabbitmq.config在生产环境的应用和和一些注意的问题

对于rabbitmq而言,常用的配置文件有

    mnesia【Erlang的分布式数据库】相关的配置,config配置文件,log日志 相关的配置。

 

首先的问题是 如何 找到或者查看rabbitmq默认的 相关配置的路径?

方式1,通过rabbitmqctl控制台:用administrator角色的账号登录,Overview--》Nodes即是。如下:

            

方式2,进入rabbitmq的安装目录下的 sbin文件夹下,

vim  rabbitmq-defaults  ,然后 看到如下:信息:

                

        系统会自动的给这些文件加上后缀名。

 

 

 

rabbitmq config的配置相关的官方文档 路径:

            http://www.rabbitmq.com/configure.html

 

        官方给出的一个 示例配置:

        https://github.com/rabbitmq/rabbitmq-server/blob/stable/docs/rabbitmq.config.example

 

        拷贝以上实例文档 到 对应的rabbitmq的安装目录下的文件:/etc/rabbitmq , 取名配置文件 名称为 rabbitmq.config,重启rabbit,那么,当前文件 就为 当前rabbit所使用。具体优化配置,见下文:

 

 

如何修改config_file的路径?

有2种方法,本质上都一样。

方式一: 直接在rabbit的安装路径的sbin下的文件rabbitmq-defaults中 修改 CONFIG_FILE的值

方式二:找到 rabbit的安装路径的sbin下的文件rabbitmq-defaults中 ,所有环境变量的配置文件  的  文件路径 CONF_ENV_FILE,【当然这个路径值也可以改变】,到对应的路径 找到对应的文件(如果没有,新建即可),然后 在里边新增内容:CONFIG_FILE=${SYS_PREFIX}/etc/xxxxxConfig,  这个时候 新增的这个配置路径 将会覆盖 rabbitmq-defaults中配置的 CONFIG_FILE的值。然后 再在 对应的路径放置 对应的文件即可。

 

 

关于rabbitmq.config配置文件 的基本了解:【常用配置】

    1,默认的 客户端连接的端口: 5672

            {tcp_listeners, [5672]}

    2,log日志:  默认的 打印级别是 info,无用日志过多,对磁盘造成压力,一般设置成error级别才打印日志【去掉默认配置 前的 %%,再填写上新的取值 即可】,如下:

            {log_levels, [{connection, error}, {channel, error}]}

        具体的错误级别 相关信息,可看 示例配置

    3,内存的阈值设置: 默认的配置如下;

            {vm_memory_high_watermark, 0.4}

        即:默认的 最大可用总内存的百分之40,多于之后,会 固化到磁盘。如下:还可以设置绝对值:

            {vm_memory_high_watermark, {absolute, "1024M"}}

    4,磁盘的阈值设置【当消息所占的磁盘大于这个值时,会触发报警机制】:

        {disk_free_limit, "2GB"},

 

特别注意:在配置 rabbitmq.config的配置文件时    由于是json格式   所以  最后一个对象后边的逗号(,)一定要去掉    各个配置 对象间 必须得加上逗号(,)

 

 

 

 

 

C++使用RabbitMQ类库做客户端与RabbitMQ Server通讯,生成C++可调用的rabbimq.*.dll的过程

C++使用RabbitMQ类库做客户端与RabbitMQ Server通讯,生成C++可调用的rabbimq.*.dll的过程

Step:

  1. download the latest rabbitmq-c via: https://github.com/alanxz/rabbitmq-c
  2. follow the document, download the cmake tool, make sure the right version of cmake. https://cmake.org/
  3. install the C compiler, if developed by VS2012, so set MSVC110=VS2012
  4. convert rabbitmq-c to C++ project via cmake command
    1. create "build" folder to rabbitmq-c root folder, then new bat file with below comman:
      REM -- create and put into /rabbitmq-c-0.9.0/build folder, then run the bat
      REM -- -DENABLE_SSL_SUPPORT=OFF disable SSL feature, otherwise will occur ssl error
      REM -- -G "Visual Studio 11 2012" , set the build environment
      cmake .. -DENABLE_SSL_SUPPORT=OFF -G "Visual Studio 11 2012"
      pause

       

  5. open the C++ project generate in step 4, then build rabbitmq project with Release version
  6. rename the rabbitmq.*.dll to rabbitmq.1.dll, then replace to the target folder

 

Troubleshooting:

  1. "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY) (found suitable version "0.9.8h", minimum required is "0.9.8")"
    1. Solution1: add OPENSSL_ROOT_DIR command to bat file: -DOPENSSL_ROOT_DIR="C:\Users\zhengs\Downloads\openssl-0.9.8k_WIN32" https://stackoverflow.com/questions/16248775/cmake-not-able-to-find-openssl-library
    2. Solution2: Disable SSL suppport, add  "-DENABLE_SSL_SUPPORT=OFF" to command. https://github.com/conetix/librabbitmq

RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ

RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ

3-1 RabbitMQ 整合 SpringBoot2.x 生产者发送消息

创建 SpringBoot 项目
application.properties 配置

spring.rabbitmq.host=192.168.152.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=root
spring.rabbitmq.password=root

创建 SendService.java

 

SpringBoot 主运行类

3-2 RabbitMQ 整合 SpringBoot2.x 消费者接受消息

创建 SpringBoot 项目
application.properties 配置和上面项目一样 导入 rabbitmq 依赖

创建 ReveiveService.java

 

 SpringBoot 主运行类

 

3-3 使用 JSON 传递消息

发送和接收的 SpringBoot 工程添加 fastjson 依赖

 

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.36</version>
</dependency>

 


发送和接收的 SpringBoot 工程添加 User 实体类

 

 修改 SendService.java

 

 

修改 ReceiveService.java

 

 

 

3-4 使用监听器接收消息 (否则 ReceiveService 无法实时接收消息)
接收消息的 SpringBoot 工程添加 RabbitMQListener.java

@Component("rabbitMQListener")
public class RabbitMQListener {
    //指定当前方法是RabbitMQ的一个监听器的方法,用于监听某些队列,如果队列中拥有新的消息则直接进行消息的接收
    @RabbitListener(queues = {"myQueue"})//参数 queues 是一个数组的参数,用于指定被监听的消息队列名称
    public void listenerReceive(Message message){//自定义的接收消息的方法,参数是一个Message对象,这个对象就是我们的消息数据
        try {
            //使用消息对象调用getBody方法获取具体的消息数据,并转换成对应的json字符串
            String jsonData=new String(message.getBody(),"UTF-8");
            //使用FastJSON将json字符串转换成对象
            User user= JSONObject.parseObject(jsonData,User.class);
            System.out.println(user.getId()+"    "+user.getName());

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}


修改消息接收的主运行类

 

rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found

rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found

问题描述:在使用命令 /sbin/service rabbitmq-server start 启动 Rabbitmq 时,报:

Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.

根据以上错误信息,使用 “journalctl -xe” 命令查看启动失败日志:

[root@192 bin]# journalctl -xe
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit rabbitmq-server.service has begun starting up.
1 08 19:12:46 sanyue rabbitmq-server[10306]: /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found
1 08 19:12:46 sanyue systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=127/n/a
1 08 19:12:46 sanyue rabbitmqctl[10473]: /usr/lib/rabbitmq/bin/rabbitmqctl: line 32: exec: escript: not found
1 08 19:12:46 sanyue systemd[1]: rabbitmq-server.service: control process exited, code=exited status=127
1 08 19:12:46 sanyue systemd[1]: Failed to start RabbitMQ broker.
-- Subject: Unit rabbitmq-server.service has failed
-- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit rabbitmq-server.service has failed. -- -- The result is failed. 

通过上面描述中,发现是 rabbitmq-server 文件第 85 没有找到 erlang。

解决方法:在 rabbitmq-server 文件第 85 行处添加 erlang 的环境变量

然后执行启动 Rabbitmq 命令,启动成功。使用 /sbin/service rabbitmq-server status 查看 rabbit 状态

我们今天的关于Rabbitmq和spring-rabbitmq中的DLX-拒绝消息的一些注意事项的分享已经告一段落,感谢您的关注,如果您想了解更多关于004,配置文件之使用rabbitmq-env.conf,rabbitmq.config在生产环境的应用和和一些注意的问题、C++使用RabbitMQ类库做客户端与RabbitMQ Server通讯,生成C++可调用的rabbimq.*.dll的过程、RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ、rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found的相关信息,请在本站查询。

本文标签: