42.4. 使用 JMS 消息属性
摘要
Apache CXF JMS 传输具有一个上下文机制,可用于检查 JMS 消息的属性。上下文机制也可用于设置 JMS 消息的属性。
42.4.1. 检查 JMS 消息标头
摘要
消费者和服务使用不同的上下文机制来访问 JMS 邮件标题属性。但是,这两种机制都会将标头属性返回为 org.apache.cxf.transports.jms.context.JMSMessageHeadersType
对象。
在服务中获取 JMS 消息标头
要从 WebServiceContext
对象获取 JMS 邮件标头属性,请执行以下操作:
- 如 “获取上下文”一节 所述获取上下文。
-
使用消息上下文的
get()
方法和参数 org.apache.cxf.transports.jms.JMSConstants.JMS_SERVER_HEADERS 获取消息上下文。
例 42.12 “在服务实现中获取 JMS 消息标头” 显示用于从服务的消息上下文获取 JMS 邮件标头的代码:
例 42.12. 在服务实现中获取 JMS 消息标头
import org.apache.cxf.transport.jms.JMSConstants; import org.apache.cxf.transports.jms.context.JMSMessageHeadersType; @WebService(serviceName = "HelloWorldService", portName = "HelloWorldPort", endpointInterface = "org.apache.cxf.hello_world_jms.HelloWorldPortType", targetNamespace = "http://cxf.apache.org/hello_world_jms") public class GreeterImplTwoWayJMS implements HelloWorldPortType { @Resource protected WebServiceContext wsContext; ... @WebMethod public String greetMe(String me) { MessageContext mc = wsContext.getMessageContext(); JMSMessageHeadersType headers = (JMSMessageHeadersType) mc.get(JMSConstants.JMS_SERVER_HEADERS); ... } ... }
在消费者中获取 JMS Message Header Properties
从 JMS 传输成功检索消息后,您可以使用使用者的响应上下文检查 JMS 标头属性。另外,您可以设置或检查客户端在超时前等待响应的时间长度,如 “客户端接收超时”一节 所述。 要从消费者的响应上下文中获取 JMS 消息标头,请执行以下操作:
- 获取响应上下文,如 “获取上下文”一节 所述。
-
通过 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RESPONSE_HEADERS 方法从响应上下文
获取
JMS 邮件标题属性。
例 42.13 “从消费者响应标头中获取 JMS 标头” 显示用于从使用者的响应上下文获取 JMS 邮件标题属性的代码。
例 42.13. 从消费者响应标头中获取 JMS 标头
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously BindingProvider bp = (BindingProvider)greeter; Map<String, Object> responseContext = bp.getResponseContext(); JMSMessageHeadersType responseHdr = (JMSMessageHeadersType) responseContext.get(JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); ... }
例 42.13 “从消费者响应标头中获取 JMS 标头” 中的代码执行以下操作:
将代理转换为绑定Provider.
获取响应上下文。
从响应上下文检索 JMS 消息标头。
42.4.2. 检查消息标头属性
标准 JMS 标头属性
表 42.3 “JMS 标头属性” 列出您可以检查的 JMS 标头中的标准属性。
属性名称 | 属性类型 | getter 方法 |
---|---|---|
关联 ID |
|
|
交付模式 |
|
|
消息过期 |
|
|
消息 ID |
|
|
优先级 |
|
|
redelivered |
|
|
time Stamp |
|
|
类型 |
|
|
实时到实时 |
|
|
可选标头属性
另外,您可以使用 JMSMessageHeadersType.getProperty()
检查 JMS 标头中存储的任何可选属性。可选属性返回为 org.apache.cxf.transports.jms.context.JMSPropertyType
的列表。可选属性存储为名称/值对。
示例
例 42.14 “读取 JMS 标头属性” 显示用于使用响应上下文检查某些 JMS 属性的代码。
例 42.14. 读取 JMS 标头属性
// JMSMessageHeadersType messageHdr retrieved previously System.out.println("Correlation ID: "+messageHdr.getJMSCorrelationID()); System.out.println("Message Priority: "+messageHdr.getJMSPriority()); System.out.println("Redelivered: "+messageHdr.getRedelivered()); JMSPropertyType prop = null; List<JMSPropertyType> optProps = messageHdr.getProperty(); Iterator<JMSPropertyType> iter = optProps.iterator(); while (iter.hasNext()) { prop = iter.next(); System.out.println("Property name: "+prop.getName()); System.out.println("Property value: "+prop.getValue()); }
例 42.14 “读取 JMS 标头属性” 中的代码执行以下操作:
打印消息的关联 ID 的值。
可打印消息的优先级属性的值。
打印消息的 redelivered 属性的值。
获取消息的可选标头属性列表。
获取一个 迭代器
以遍历属性列表。
迭代可选属性列表并打印其名称和值。
42.4.3. 设置 JMS 属性
摘要
在消费者端点中使用请求上下文,您可以设置多个 JMS 邮件标头属性和消费者端点的超时值。这些属性对单个调用有效。每次在服务代理中调用操作时,您必须重置它们。
请注意,您无法在服务中设置标头属性。
JMS 标头属性
表 42.4 “设定的 JMS 标头属性” 列出 JMS 标头中的属性,它们可通过使用者端点的请求上下文来设置。
属性名称 | 属性类型 | setter Method |
---|---|---|
关联 ID |
|
|
交付模式 |
|
|
优先级 |
|
|
实时到实时 |
|
|
-
创建
org.apache.cxf.transports.jms.context.JMSMessageHeadersType
对象。 - 使用 表 42.4 “设定的 JMS 标头属性” 中描述的适当的 setter 方法填充您要设置的值。
-
使用 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_REQUEST_HEADERS 作为第一个参数,将值设置为请求上下文,将新的
JMSMessageHeadersType
对象作为第二个参数。
可选的 JMS 标头属性
您还可以将可选属性设置为 JMS 标头。可选的 JMS 标头属性存储在用于设置其他 JMS 标头属性的 JMSMessageHeadersType
对象中。它们存储为包含 org.apache.cxf.transports.jms.context.JMSPropertyType
对象的 List
对象。要在 JMS 标头中添加可选属性,请执行以下操作:
-
创建
JMSPropertyType
对象。 -
使用
setName()
设置属性的 name 字段。 -
使用
setValue()
设置属性的值字段。 -
使用
JMSMessageHeadersType.getProperty().add(JMSPropertyType)
,将 属性添加到 JMS 邮件标头中。 - 重复此过程,直到所有属性都已添加到消息标头中。
客户端接收超时
除了 JMS 标头属性外,您还可以设置消费者端点在超时前等待响应的时间。您可以通过使用 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RECEIVE_TIMEOUT 调用请求上下文的 put()
方法来设置这个值,以毫秒表示您希望使用者作为第二个参数等待的时间。
示例
例 42.15 “使用请求上下文设置 JMS 属性” 显示使用请求上下文设置某些 JMS 属性的代码。
例 42.15. 使用请求上下文设置 JMS 属性
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously InvocationHandler handler = Proxy.getInvocationHandler(greeter); BindingProvider bp= null; if (handler instanceof BindingProvider) { bp = (BindingProvider)handler; Map<String, Object> requestContext = bp.getRequestContext(); JMSMessageHeadersType requestHdr = new JMSMessageHeadersType(); requestHdr.setJMSCorrelationID("WithBob"); requestHdr.setJMSExpiration(3600000L); JMSPropertyType prop = new JMSPropertyType; prop.setName("MyProperty"); prop.setValue("Bluebird"); requestHdr.getProperty().add(prop); requestContext.put(JMSConstants.CLIENT_REQUEST_HEADERS, requestHdr); requestContext.put(JMSConstants.CLIENT_RECEIVE_TIMEOUT, new Long(1000)); }
例 42.15 “使用请求上下文设置 JMS 属性” 中的代码执行以下操作:
获取您要更改的 JMS 属性的 InvocationHandler
。
检查,以查看 InvocationHandler
是否为 BindingProvider
。
将返回的 InvocationHandler
对象转换为 BindingProvider
对象,以检索请求上下文。
获取请求上下文。
创建一个 JMSMessageHeadersType
对象来容纳新的消息标头值。
设置正确的 ID。
将 Expiration 属性设为 60 分钟。
创建新的 JMSPropertyType
对象。
设置可选属性的值。
在消息标题中添加可选属性。
将 JMS 消息标头值设置为请求上下文。
将客户端接收超时属性设置为 1 秒。