热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ使用PoliciesHTTPAPI绑定和解绑DLX

需求:exchange和queue都能重复声明不会影响已有数据,但是DLX只能在queue第一次创建的时候一起定义,否则运行时就需要通过WEBUI或者rabbitmqctlset_
 需求:

exchange 和 queue 都能重复声明不会影响已有数据,但是 DLX 只能在 queue 第一次创建的时候一起定义,否则运行时就需要通过 WEB UI 或者 rabbitmqctl set_policy 命令行指令来添加 DLX。如果对已经存在的 queue 使用 java API 的方式添加 DLX 绑定则会报错。而我在写demo时定义了默认的 exchange 和 queue,所以希望默认的 dlx 也能通过 java API 方式重复声明。

解决方案:

去官网找了一些 HTTP API 资料,但官网只给出 SET_POLICY 方式,相应的 HTTP API 没有给出具体示例。于是根据已有资料中一些其他的 HTTP API 的规则、WEB UI 中 Policies 接口的存在,还有 SET_POLISY DLX 的规律,猜测 DLX policy HTTP API 的调用方式,最后比较简单地试出了 DLX HTTP API 的调用方式。

代码会跟随 RabbitMQ 的某个小demo不久后会正式分享到 github,现在就直接贴代码吧。

Policies HTTP 设置 DLX 代码:

PS:DELETE 方法中 pattern 为 ""(空字符串)就可以了。这里没有完全优化。

 1 private static final String DEFAULT_DLX_URL = "http://192.168.33.50:15672/api/policies/%2f/DLX"
 2 
 3 public static void declareDlxForDefaultQueueViaHttpClient(boolean bind) {
 4         HttpEntityEnclosingRequestBase request;
 5         if (bind) {
 6             request = new HttpPut(DEFAULT_DLX_URL);
 7         } else {
 8             request = new HttpDeleteWithEntity(DEFAULT_DLX_URL);
 9         }
10         CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
11         Credentials credentials = new UsernamePasswordCredentials(DEFAULT_USERNAME, DEFAULT_USER_PWD);
12         // 这里可以用 AuthScope.ANY 替代。表示任何 URL domain 都使用同一个 AUTH
13         credentialsProvider.setCredentials(new AuthScope(DEFAULT_HOST, DEFAULT_MANAGEMENT_PORT), credentials);
14         // BasicAuth 验证由 HttpClient API 来处理
15         CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
16         JSONObject dlxJson = new JSONObject();
17         dlxJson.put("pattern", "origin\\..*");
18         JSONObject definition = new JSONObject();
19         definition.put("dead-letter-exchange", "origin.dlx");
20         dlxJson.put("definition", definition);
21         dlxJson.put("apply-to", "queues");
22         StringEntity entity = new StringEntity(dlxJson.toString(), ContentType.APPLICATION_JSON);
23         // 有些方法不能带请求体,所以请求体不能放到 HttpClient API 里
24         request.setEntity(entity);
25         try {
26             CloseableHttpResponse httpRespOnse= httpClient.execute(request);
27             int statusCode = httpResponse.getStatusLine().getStatusCode();
28             HttpEntity respOnseEntity= httpResponse.getEntity();
29             String respOnseBody= respOnseEntity== null ? "empty response body" : EntityUtils.toString(responseEntity);
30             log.info("IN declare DLX for DEFAULT QUEUE:request method=" + request.getMethod()
31                     + ", statusCode=" + statusCode + ", respOnseBody=" + responseBody);
32         } catch (IOException e) {
33             e.printStackTrace();
34         }
35     }

模拟 HttpPut 构造 HttpDeleteWithEntity 代码:

 1 public class HttpDeleteWithEntity extends HttpEntityEnclosingRequestBase {
 2 
 3     public final static String METHOD_NAME = "DELETE";
 4 
 5     public HttpDeleteWithEntity() {
 6         super();
 7     }
 8 
 9     public HttpDeleteWithEntity(final URI uri) {
10         super();
11         setURI(uri);
12     }
13 
14     /**
15      * @throws IllegalArgumentException if the uri is invalid.
16      */
17     public HttpDeleteWithEntity(final String uri) {
18         super();
19         setURI(URI.create(uri));
20     }
21 
22     @Override
23     public String getMethod() {
24         return METHOD_NAME;
25     }
26 }

pom.xml 代码:

技术图片技术图片
 1 
 2         
 3         
 4             org.apache.httpcomponents
 5             httpclient
 6             4.5.10
 7         
 8 
 9         
10             com.alibaba
11             fastjson
12             1.2.62
13         
14 
15         
16             junit
17             junit
18             4.12
19             test
20         
21 
22         
23             com.rabbitmq
24             amqp-client
25             5.4.3
26             compile
27         
28 
29         
30             org.projectlombok
31             lombok
32             1.18.10
33             provided
34         
35 
36         
37         
38             ch.qos.logback
39             logback-classic
40             1.2.3
41         
42     
maven dependencies
参考资料:

https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-May/027573.html

RabbitMQ 官网 DLX 和 HTTP API 相关参考:

  https://www.rabbitmq.com/parameters.html

  https://www.rabbitmq.com/dlx.html

HttpClient:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html#d4e1023

HttpDelete 缺失 Set Entity 方法相关解决办法参考:https://stackoverflow.com/questions/43241436/java-http-delete-with-request-body

Basic Auth 作为一种 http header 的基本原理:https://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring#maven

RabbitMQ 使用 Policies-HTTP API 绑定和解绑 DLX


推荐阅读
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • IDEA中高效利用代码变量名替换功能提升编程效率
    在使用 IntelliJ IDEA 进行公司项目代码审查时,我发现许多变量的命名不符合驼峰式命名规范。起初,我尝试手动逐个修改这些变量名,但效率低下。后来,我偶然发现了 IDEA 中的代码变量名替换功能,这极大地提高了我的工作效率。通过该功能,我可以快速批量地将不规范的变量名修改为符合命名规则的形式,不仅节省了时间,还减少了出错的可能性。此外,我还利用这一功能对整个项目的代码进行了全面的优化,确保所有变量命名一致且易于理解。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
author-avatar
迪信通张磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有