通过Rest API从Oracle向ActiveMQ Classic发送消息时如何添加自定义属性?
问题
已能通过Oracle UTL_HTTP调用Rest API向ActiveMQ Classic发送消息,但不知如何为消息添加自定义属性。我的代码如下:
myMessage := 'some text ....'; req := UTL_HTTP.BEGIN_REQUEST(lc_baseurl, method=>'POST'); UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0'); UTL_HTTP.SET_HEADER(req, 'content-type', 'application/json'); utl_http.set_header(req, 'Content-Length', length(myMessage)); utl_http.set_header(req, 'Authorization', 'Basic ....'); utl_http.set_header(req, 'APPLICATION_SOURCE', 'mySource'); UTL_HTTP.WRITE_TEXT (req, myMessage); resp := UTL_HTTP.GET_RESPONSE(req);
但我在AMQ Web控制台及JMSToolbox等工具中均无法找到APPLICATION_SOURCE的值,仅能看到AMQ设置的系统头(如jmsmessageID、jmsexpiration等),且消息的"Properties"属性为空。

请问如何正确为消息添加自定义属性?
解决方案
你当前通过普通HTTP请求头设置的APPLICATION_SOURCE不会被ActiveMQ Classic映射为JMS消息的自定义属性,因为默认的REST Connector不会自动将非特定前缀的HTTP头转为JMS属性。以下两种方法可以实现需求:
方法一:使用X-JMS-Property-前缀的HTTP请求头
ActiveMQ Classic的REST API支持将以X-JMS-Property-开头的HTTP请求头转换为JMS消息的自定义属性。修改你的代码,将自定义属性头添加前缀:
utl_http.set_header(req, 'X-JMS-Property-APPLICATION_SOURCE', 'mySource');
发送消息后,即可在AMQ控制台或JMSToolbox的消息Properties中查看APPLICATION_SOURCE属性。
方法二:在JSON请求体中嵌入消息属性
如果你的消息采用JSON格式,可以将消息体构造为包含body和properties的结构,把自定义属性放在properties字段内:
- 构造带属性的JSON消息体:
DECLARE myMessage VARCHAR2(4000); BEGIN myMessage := '{ "body": "some text ....", "properties": { "APPLICATION_SOURCE": "mySource" } }'; -- 后续请求初始化、设置头、发送的代码保持不变 END;
- 发送该JSON作为请求体,ActiveMQ会自动解析
properties字段,将其转换为JMS消息的自定义属性。
注意:确保你的ActiveMQ Classic实例已启用REST Connector(默认配置中已包含),且版本支持上述属性设置方式。
内容的提问来源于stack exchange,提问作者Loko
相关产品推荐
相关产品推荐

