GVKun编程网logo

将确认发送到Rabbitmq服务器取决于转换器和侦听器(确定发送)

27

在这篇文章中,我们将为您详细介绍将确认发送到Rabbitmq服务器取决于转换器和侦听器的内容,并且讨论关于确定发送的相关问题。此外,我们还会涉及一些关于Linux下RabbitMQ服务器搭建、nagi

在这篇文章中,我们将为您详细介绍将确认发送到Rabbitmq服务器取决于转换器和侦听器的内容,并且讨论关于确定发送的相关问题。此外,我们还会涉及一些关于Linux下RabbitMQ服务器搭建、nagios check_rabbitmq插件监控rabbitmq服务、node.js – 如何停止rabbitmq服务器、Python操作RabbitMQ服务器实现消息队列的路由的知识,以帮助您更全面地了解这个主题。

本文目录一览:

将确认发送到Rabbitmq服务器取决于转换器和侦听器(确定发送)

将确认发送到Rabbitmq服务器取决于转换器和侦听器(确定发送)

首先,我介绍一下我的情况:
我正在使用spring-bootspring-rabbitmq。它对我有用,您应该知道我必须为收到的消息实现自定义转换器。
(1) 例如,在消息不正确的情况下,可能从此转换器引发异常。
(2) 成功转换后(无异常),将调用侦听器。然后,在侦听器中也可以引发异常。


现在,我想强制说明两件事:
(1’) 不要在转换器中出现消息的情况下重新排队消息。只需发送确认即可排队并模拟一切正常。
(2’) 在这种情况下,默认设置是什么?内部何时spring-rabbitmqengine决定发送确认到队列?什么时候决定重新排队的命令?是否可以根据情况进行管理?

我在文档中找到了:

如果未启用重试并且侦听器引发异常,则默认情况下将无限期重试传递。您可以通过两种方式修改此行为:将defaultRequeueRejected属性设置为false,将尝试进行零次重新传递;或者,抛出一个AmqpRejectAndDontRequeueException以指示该消息应被拒绝。这是启用重试并达到最大传送尝试次数时使用的机制。

例如,根据侦听器中捕获到的异常,我应该决定是否要按我的想法对消息进行排队(只需通过抛出from即可catch
AmqpRejectAndDontRequeueException)。我不确定这是否是好方法,这就是为什么我要问您关于您的意见的原因。

答案1

小编典典

请阅读参考手册。

该行为(主要)由所控制ErrorHandler

引发MessageConversionException-容器为大多数异常重新排队消息,但某些异常被认为是致命的。通常,如果无法转换邮件,则重新传递它是没有意义的。

所有这些都在名为“ 异常处理”的部分(令人惊讶地?)中清楚地说明了

从版本1.3.2开始,默认的ErrorHandler现在是ConditionalRejectingErrorHandler,它将拒绝(而不是重新排队)由于不可恢复的错误而失败的消息:

osamqp … MessageConversionException

osmessaging … MessageConversionException

osmessaging … MethodArgumentNotValidException

osmessaging … MethodArgumentTypeMismatchException

java.lang.NoSuchMethodException

java.lang.ClassCastException

使用MessageConverter转换传入的消息有效负载时,可以引发第一个。如果映射到@RabbitListener方法时需要其他转换,则转换服务可能会抛出第二个。如果在侦听器中使用了验证(例如@Valid),并且验证失败,则可能引发第三个事件。如果将入站消息转换为对目标方法不正确的类型,则可能会抛出第四个错误。例如,将该参数声明为Message,但收到Message。

在版本1.6.3中添加了第五和第六。

您可以根据ErrorHandler需要自定义。

Linux下RabbitMQ服务器搭建

Linux下RabbitMQ服务器搭建

Linux下RabbitMQ服务器搭建

 

系统环境

操作系统:CentOS6.9

erlang:OTP 19.3

rabbitmq:rabbitmq-server 3.6.12

 

安装步骤

安装erlang

1,安装预环境

通过yum安装以下组件,运行命令:

[root@rabbitmqserver erlang]# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

 

2,下载erlang的源代码文件并解压缩

clipboard

运行如下命令解压。

[root@rabbitmqserver softwares]# tar -xvf otp_src_19.3.tar.gz

然后,运行如下命令重命名文件夹为erlang。

[root@rabbitmqserver softwares]# mv otp_src_19.3 ./erlang

clipboard

 

3,配置安装

首先是./configure,检查编译环境并配置安装路径,运行如下命令:

[root@rabbitmqserver erlang]# ./configure --prefix=/usr/erlang --without-javac

然后,make,对源代码进行编译,运行如下命令:

[root@rabbitmqserver erlang]# make

最后,make install,开始安装,运行如下命令:

[root@rabbitmqserver erlang]# make install

 

4,设置环境变量

运行以下命令编辑/etc/profile文件。

[root@rabbitmqserver erlang]# vim /etc/profile

在末尾追加以下内容。

clipboard

保存,然后运行以下命令使环境变量立即生效。

[root@rabbitmqserver erlang]# source /etc/profile

 

5,验证是否安装成功

运行如下命令,验证erlang是否安装成功。

[root@rabbitmqserver erlang]# erl

clipboard

 

安装rabbitmq-server

1,下载rpm包并安装

运行如下命令开始安装rpm包。

[root@rabbitmqserver softwares]# rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm

可能碰到以下问题:

clipboard

解决办法:

http://blog.csdn.net/yunfeng482/article/details/72853983

 

2,设置环境变量

运行以下命令编辑/etc/profile文件。

[root@rabbitmqserver softwares]# vim /etc/profile

在末尾追加以下内容。

clipboard

保存,然后运行以下命令使环境变量立即生效。

[root@rabbitmqserver erlang]# source /etc/profile

 

3,开启Web监控

首先,运行以下命令,开启rabbitmq

[root@rabbitmqserver rabbitmq]# rabbitmq-server

clipboard

ctrl+c取消进程后,运行以下命令,开启web监控。

[root@rabbitmqserver rabbitmq]# rabbitmq-plugins enable rabbitmq_management

clipboard

 

4,启动

开启web监控之后,我们就可以正式启动rabbitmq了。

启动rabbitmq有以下两种方法。

第一种方法是,直接运行rabbitmq-server命令。

clipboard

但是这种方式,一旦终端退出后,rabbitmq服务就停止了,所以不推荐这么做。

第二种方法是,运行service rabbitmq-server xxx命令。

service rabbitmq-server start #启动

service rabbitmq-server stop #停止

service rabbitmq-server restart #重启

service rabbitmq-server status #查看状态

service rabbitmq-server etc #查看有哪些命令可以使用

同时将rabbitmq-server加入到开机自启动服务中,运行以下命令:

[root@rabbitmqserver bin]# chkconfig rabbitmq-server on

最佳实践是第二种方法。

回到顶部

注意事项

1,rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm时报以下错误?

error: Failed dependencies: erlang >= R16B-03 is needed by rabbitmq-server-3.6.6-1.el6.noarch socat is needed by rabbitmq-server-3.6.6-1.el6.noarch

解决方案:http://blog.csdn.net/yunfeng482/article/details/72853983

 

2,运行service rabbitmq-server start一直无法启动,提示''/usr/lib/rabbitmq/bin/rabbitmq-server: line 50: erl: command not found''?

解决方法:

是因为环境变量不同,导致无法找到相应命令,按照指引将erlang的erl软连接到/usr/bin目录下,运行以下命令。

[root@rabbitmqserver bin]# ln -s /usr/erlang/bin/erl /usr/bin/erl

回到顶
 
 
 

nagios check_rabbitmq插件监控rabbitmq服务

nagios check_rabbitmq插件监控rabbitmq服务

当在生产环境下使用某种服务时,相应的监控措施也应当完善起来,来检测服务是否正常和获取相关信息是很有必要的。 下面来说说使用nagios-plugins-rabbitmq来监控消息分发队列服务rabbitmq。目前提供6种检测类型: 1. check_rabbitmq_aliveness 使用/api/aliveness-test API来发送/接收消息。 2. check_rabbitmq_server 使用/api/nodes API来获取rabbitmq服务器节点的资源使用情况。 3. check_rabbitmq_objects 使用多种API来计算统计服务器上的各种对象实例。包括vhosts、exchanges、bindings、queues 、channels。 4. check_rabbitmq_overview 使用/api/overview API来收集pending、ready、unacknowledged消息。 5. check_rabbitmq_queue 使用 /api/queue API来收集pending、ready、unacknowledged消息和统计一个给定的队列的消费者的数量。 6. check_rabbitmq_watermark 使用/api/nodes API来确定mem_alarm是否设置为true。 1. 安装Nagios::Plugin perl模块 nagios-plugins-rabbitmq插件是以perl语言写的,需要安装Nagios::Plugin perl包。否则会报如下错误: Can''t locate Nagios/Plugin.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at ./check_rabbitmq_server line 12. 我这里使用cpanm来安装,参见 《使用cpanm安装perl相关模块》。
# cpanm Nagios::Plugin
Building and testing Nagios-Plugin-0.36 ... OK
Successfully installed Nagios-Plugin-0.36
39 distributions installed
提示上面的信息说明安装成功。
大家也可以自己下载源码包进行编译安装。下载地址:http://search.cpan.org/CPAN/authors/id/T/TO/TONVOON/Nagios-Plugin-0.36.tar.gz 步骤如下:
# wget http://search.cpan.org/CPAN/authors/id/T/TO/TONVOON/Nagios-Plugin-0.36.tar.gz
# tar xvfz Nagios-Plugin-0.36.tar.gz
# cd Nagios-Plugin-0.36
# perl Makefile.PL
# make
# make install
2. 安装依赖模块 check_rabbitmq_* 如能正常使用,还需要安装下面依赖模块。
# cpanm LWP JSON
否则,会报如下错误 Can''t locate LWP/UserAgent.pm in @INC Can''t locate JSON.pm in @INC 3. 下载nagios-plugins-rabbitmq
# cd /usr/local/nagios/libexec/
# wget --no-check-certificate https://github.com/jamesc/nagios-plugins-rabbitmq/archive/master.zip
# unzip master 
# mv nagios-plugins-rabbitmq-master nagios-plugins-rabbitmq
# chown -R nagios.nagios nagios-plugins-rabbitmq/
4. 举例
# ./check_rabbitmq_aliveness -H 10.1.155.139 --port=15672 -u ''nagioscheck'' -p ''www.ttlsa.com'' 
RABBITMQ_ALIVENESS OK - vhost: /
# ./check_rabbitmq_overview -H 10.1.155.139 --port=15672 -u ''nagioscheck'' -p ''www.ttlsa.com''
RABBITMQ_OVERVIEW OK - messages OK (2) messages_ready OK (2) messages_unacknowledged OK (0) | messages=2;; messages_ready=2;; messages_unacknowledged=0;;
# ./check_rabbitmq_queue -H 10.1.155.139 --port=15672 -u ''nagioscheck'' -p ''www.ttlsa.com'' --queue=aliveness-test
RABBITMQ_QUEUE OK - messages OK (0) messages_ready OK (0) messages_unacknowledged OK (0) consumers OK (0) | messages=0;; messages_ready=0;; messages_unacknowledged=0;; consumers=0;;
# ./check_rabbitmq_objects -H 10.1.155.139 --port=15672 -u ''nagioscheck'' -p ''www.ttlsa.com''
RABBITMQ_OBJECTS OK - Gathered Object Counts | vhost=1;; exchange=15;; binding=2;; queue=1;; channel=0;;
5. 定义nagios command
# vim /usr/local/nagios/etc/objects/commands.cfg  
define command{
	command_name check_rabbitmq_aliveness      
	command_line $USER1$/nagios-plugins-rabbitmq/scripts/check_rabbitmq_aliveness  -H $ARG1$ --port=$ARG2$ -u $ARG3$ -p $ARG4$
}

define command{
	command_name check_rabbitmq_overview      
	command_line $USER1$/nagios-plugins-rabbitmq/scripts/check_rabbitmq_overview  -H $ARG1$ --port=$ARG2$ -u $ARG3$ -p $ARG4$
}

define command{
	command_name check_rabbitmq_queue      
	command_line $USER1$/nagios-plugins-rabbitmq/scripts/check_rabbitmq_queue  -H $ARG1$ --port=$ARG2$ -u $ARG3$ -p $ARG4$ --queue $ARG5$
}

define command{
	command_name check_rabbitmq_objects      
	command_line $USER1$/nagios-plugins-rabbitmq/scripts/check_rabbitmq_objects  -H $ARG1$ --port=$ARG2$ -u $ARG3$
}
用户名、密码可以定义到/usr/local/nagios/etc/resource.cfg 文件中,免得每次都要指定。 6. 创建rabbitmq监控项
define service{
    use                     generic-service
    host_name               121.207.22.33
    service_description     check_rabbitmq_aliveness
    normal_check_interval   2
    contact_groups          admin_4
    check_command           check_rabbitmq_aliveness!10.1.22.33!15672!nagioscheck!www.ttlsa.com
    }

define service{
    use                     generic-service
    host_name               121.207.22.33
    service_description     check_rabbitmq_queue
    normal_check_interval   2
    contact_groups          admin_4
    check_command           check_rabbitmq_queue!10.1.22.33!15672!nagioscheck!www.ttlsa.com!aliveness-test
    }
按照自己的需求,添加command和监控项。 转载请注明来自运维生存时间: http://www.ttlsa.com/html/4048.html

node.js – 如何停止rabbitmq服务器

node.js – 如何停止rabbitmq服务器

我正在尝试启动一个节点应用程序,我认为rabbitmq正在阻碍.

与此主题类似:“node with name “rabbit” already running”,but also “unable to connect to node ‘rabbit'”

$ps aux | grep erl
rabbitmq  1327  0.0  0.0   2376   300 ?        S    Dec13   0:00 /usr/lib/erlang/erts-5.8.5/bin/epmd -daemon
rabbitmq  1344  0.0  0.3  59560 14888 ?        Sl   Dec13   0:10 /usr/lib/erlang/erts-5.8.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@jasonshark -boot /var/lib/rabbitmq/mnesia/rabbit@jasonshark-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbit@jasonshark.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@jasonshark-sasl.log"} -os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@jasonshark"
rabbitmq  1700  0.0  0.0   2136   284 ?        Ss   Dec13   0:00 /usr/lib/erlang/lib/os_mon-2.2.7/priv/bin/cpu_sup
1000     15564  0.0  0.0   4392   820 pts/1    S+   19:23   0:00 grep --color=auto erl

我知道我现在需要运行kill -9 {pid of rabbitmq process},但是哪个数字是pid?

如何停止与rabbitmq有关的一切,我不希望它干扰我的节点js

解决方法

你有几个选择:

>首先,尝试使用init.d脚本优先关闭RabbitMQ sudo /etc/init.d/rabbitmq-server stop>如果这不起作用,请使用ps -eaf | grep erl查找进程和父ID.输出中的第三列是父进程ID.找到仍然是erlang进程的所有进程的第一个祖先(不是启动它的shell脚本)并杀死它.这应该终止其他子进程.如果没有,请手动杀死它们.

Python操作RabbitMQ服务器实现消息队列的路由

Python操作RabbitMQ服务器实现消息队列的路由

rabbitmq是一个消息队列服务器,这里我们针对python+pika+rabbitmq的服务器端环境,来看一下如何使用python操作rabbitmq服务器实现消息队列的路由功能

Python使用Pika库(安装:sudo pip install pika)可以操作RabbitMQ消息队列服务器(安装:sudo apt-get install rabbitmq-server),这里我们来看一下MQ相关的路由功能。

路由键的实现

比如有一个需要给所有接收端发送消息的场景,但是如果需要自由定制,有的消息发给其中一些接收端,有些消息发送给另外一些接收端,要怎么办呢?这种情况下就要用到路由键了。

路由键的工作原理:每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键。发送端通过交换机发送信息时,可以指明路由键 ,交换机会根据路由键把消息发送到相应的消息队列,这样接收端就能接收到消息了。

立即学习“Python免费学习笔记(深入)”;

这边继上一篇,还是用send.py和receive.py来模拟实现路由键的功能。send.py表示发送端,receive.py表示接收端。实例的功能就是将info、warning、error三种级别的信息发送到不同的接收端。

send.py代码分析

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#定义三个路由键
routings = ['info', 'warning', 'error']
 
#将消息依次发送到交换机,并设置路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()
登录后复制

receive.py代码分析

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#从命令行获取路由键参数,如果没有,则设置为info
routings = sys.argv[1:]
if not routings:
  routings = ['info']
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
登录后复制

打开两个终端,一个运行代码python receive.py info warning,表示只接收info和warning的消息。另外一个终端运行send.py,可以观察到接收终端只接收到了info和warning的消息。如果打开多个终端运行receive.py,并传入不同的路由键参数,可以看到更明显的效果。

当接收端正在运行时,可以使用rabbitmqctl list_bindings来查看绑定情况。

路由键模糊匹配
路由键模糊匹配,就是可以使用正则表达式,和常用的正则表示式不同,这里的话“#”表示所有、全部的意思;“*”只匹配到一个词。看完示例就能明白了。

这边继上面的例子,还是用send.py和receive.py来实现路由键模糊匹配的功能。send.py表示发送端,receive.py表示接收端。实例的功能大概是这样:比如你有个知心好朋友,不管开心、伤心、工作上的还是生活上的事情都可以和她说;还有一些朋友可以分享开心的事情;还有一些朋友,你可以把不开心的事情和她说。

send.py代码分析

因为要进行路由键模糊匹配,所以交换机的类型要设置为topic,设置为topic,就可以使用#,*的匹配符号了。

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#定义路由键
routings = ['happy.work', 'happy.life', 'sad.work', 'sad.life']
 
#将消息依次发送到交换机,并设定路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()
登录后复制

上例中定义了四种类型的消息,容易理解,就不解释了,然后依次发送出去。

receive.py代码分析

同样,交换机的类型要设定为topic就可以了。从命令行接收参数的功能稍微调整了一下,就是没有参数时报错退出。

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#从命令行获取路由参数,如果没有,则报错退出
routings = sys.argv[1:]
if not routings:
  print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)
  exit()
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
登录后复制

打开四个终端,一个运行如下,表示任何事情都可以和她说:

python receive.py "#"
登录后复制

另外一个终端 运行如下,表示可以和她分享开心的事:

python receive.py "happy.*"
登录后复制

第三个运行如下,表示工作上的事情可以和她分享:

python receive.py "*.work"
登录后复制

最后一个运行python send.py。结果不难想象出来,就不贴出来了。

更多Python操作RabbitMQ服务器实现消息队列的路由相关文章请关注PHP中文网!

我们今天的关于将确认发送到Rabbitmq服务器取决于转换器和侦听器确定发送的分享就到这里,谢谢您的阅读,如果想了解更多关于Linux下RabbitMQ服务器搭建、nagios check_rabbitmq插件监控rabbitmq服务、node.js – 如何停止rabbitmq服务器、Python操作RabbitMQ服务器实现消息队列的路由的相关信息,可以在本站进行搜索。

本文标签: