对于想了解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-拒绝消息的一些注意事项
- 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-拒绝消息的一些注意事项
我确实阅读了此参考资料: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**: Using
InstantAcknowledgeAmqpExceptionor
ExceptionHandler`异常,我们可以完全控制永久拒绝消息(处于高级确认状态)并重新发送到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在生产环境的应用和和一些注意的问题
对于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的过程
Step:
- download the latest rabbitmq-c via: https://github.com/alanxz/rabbitmq-c
- follow the document, download the cmake tool, make sure the right version of cmake. https://cmake.org/
- install the C compiler, if developed by VS2012, so set MSVC110=VS2012
- convert rabbitmq-c to C++ project via cmake command
- 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
- create "build" folder to rabbitmq-c root folder, then new bat file with below comman:
- open the C++ project generate in step 4, then build rabbitmq project with Release version
- rename the rabbitmq.*.dll to rabbitmq.1.dll, then replace to the target folder
Troubleshooting:
- "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")"
- 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
- Solution2: Disable SSL suppport, add "-DENABLE_SSL_SUPPORT=OFF" to command. https://github.com/conetix/librabbitmq
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
问题描述:在使用命令 /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的相关信息,请在本站查询。
本文标签: