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

需求:

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 <dependencies>
 2         <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
 3         <dependency>
 4             <groupId>org.apache.httpcomponents</groupId>
 5             <artifactId>httpclient</artifactId>
 6             <version>4.5.10</version>
 7         </dependency>
 8
 9         <dependency>
10             <groupId>com.alibaba</groupId>
11             <artifactId>fastjson</artifactId>
12             <version>1.2.62</version>
13         </dependency>
14
15         <dependency>
16             <groupId>junit</groupId>
17             <artifactId>junit</artifactId>
18             <version>4.12</version>
19             <scope>test</scope>
20         </dependency>
21
22         <dependency>
23             <groupId>com.rabbitmq</groupId>
24             <artifactId>amqp-client</artifactId>
25             <version>5.4.3</version>
26             <scope>compile</scope>
27         </dependency>
28
29         <dependency>
30             <groupId>org.projectlombok</groupId>
31             <artifactId>lombok</artifactId>
32             <version>1.18.10</version>
33             <scope>provided</scope>
34         </dependency>
35
36         <!--logback 日志框架,只需要引入这个-->
37         <dependency>
38             <groupId>ch.qos.logback</groupId>
39             <artifactId>logback-classic</artifactId>
40             <version>1.2.3</version>
41         </dependency>
42     </dependencies>

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

原文地址:https://www.cnblogs.com/christmad/p/11832495.html

时间: 2024-10-23 18:49:39

RabbitMQ 使用 Policies-HTTP API 绑定和解绑 DLX的相关文章

原生js绑定和解绑事件,兼容IE,FF,chrome

主要是最近项目中用到了原生的js 解绑和绑定 事件  然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解除这个事件.贴上代码,这个是可以运行的,兼容 IE FF chrome 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu

11-jQuery的事件绑定和解绑

1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data (Object) : (可选) 作为event.data属性值传递给事件对象的额外数据对象 fn ( Function) : 绑定到每个匹配元素的事件上面的处理函数 示例: 当每个p标签被点击的时候,弹出其文本 $("p").bind("click", function(

jQuery的事件绑定和解绑

1.绑定事件 $('获取的标签对象').bind('要操作的方法,  {操作的内容  是字典的形式},function(){} ') 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data (Object) : (可选) 作为event.data属性值传递给事件对象的额外数据对象 fn ( Function) : 绑定到每个匹配元素的事件上面的处理函数 示例: 当每个p

关于绑定和解绑的兼容代码

//为任意元素绑定任意事件 function addEventListener(element,type,fn) { //判断浏览器是否支持这个方法 if(typeof (element.addEventListener)!='undefined'){ element.addEventListener(type,fn,false); }else if(typeof(element.attachEvent)!='undefined'){ element.attachEvent("on"+

事件的绑定和解绑 (jQuery)

1on()的多事件绑定 之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理.翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个"on"方法来实现的.jQuery on()方法是官方推荐的绑定事件的一个方法. 基本用法:.on( events ,[ selector ] ,[ data ] ) 最常见的给元素绑定一个点击事件,对比一下快捷方式与on方式的不同 $("#elem").click(func

dpdk网卡绑定和解绑

一.绑定网卡失败后不需要重启虚拟机的方法(以e1000为例): 1.绑定igb_uio前: 2.  绑定igb_uio: 1)找到该port的vendor id: vim/sys/devices/pci0000\:00/0000\:00\:07.0/vendor 2)找到该port的device id: vim/sys/devices/pci0000\:00/0000\:00\:07.0/ device 3)  重新绑定该port: echo "8086100e" > /sys/

bind,unbing,on,live,delegate绑定和解绑事件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content=&q

LINUX驱动手动绑定和解绑定

Linux内核从2.6.13-rc3开始,提供了在用户空间,可动态的绑定和解绑定设备和设备驱动之间关系的功能.在这之前,只能通过insmod(modprobe)和rmmod来绑定和解绑,而且这种绑定和解绑都是针对驱动和所有设备的.而新的功能可以设置驱动和单个设备之间的联系. 这里,我们以pci总线的nvme ssd为例,首先执行lspci显示所有的nvme ssd. # lspci | grep memory01:00.0 Non-Volatile memory controller: Sams

Linux驱动手动绑定和解绑定方法

linux内核从2.6.13-rc3开始,提供了在用户空间,可动态的绑定和解绑定设备和设备驱动之间关系的功能.在这之前,只能通过insmod(modprobe)和rmmod来绑定和解绑,而且这种绑定和解绑都是针对驱动和所有设备的.而新的功能可以设置驱动和单个设备之间的联系. 这里,我们以pci总线的nvme ssd为例,首先执行lspci显示所有的nvme ssd. # lspci | grep memory01:00.0 Non-Volatile memory controller: Sams