42.4. 使用 JMS 消息属性

摘要

Apache CXF JMS 传输具有一个上下文机制,可用于检查 JMS 消息的属性。上下文机制也可用于设置 JMS 消息的属性。

42.4.1. 检查 JMS 消息标头

摘要

消费者和服务使用不同的上下文机制来访问 JMS 邮件标题属性。但是,这两种机制都会将标头属性返回为 org.apache.cxf.transports.jms.context.JMSMessageHeadersType 对象。

在服务中获取 JMS 消息标头

要从 WebServiceContext 对象获取 JMS 邮件标头属性,请执行以下操作:

  1. “获取上下文”一节 所述获取上下文。
  2. 使用消息上下文的 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 消息标头,请执行以下操作:

  1. 获取响应上下文,如 “获取上下文”一节 所述。
  2. 通过 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 标头中的标准属性。

表 42.3. JMS 标头属性

属性名称属性类型getter 方法

关联 ID

字符串

getJMSCorralationID()

交付模式

int

getJMSDeliveryMode()

消息过期

long

getJMSExpiration()

消息 ID

字符串

getJMSMessageID()

优先级

int

getJMSPriority()

redelivered

布尔值

getJMSRedlivered()

time Stamp

long

getJMSTimeStamp()

类型

字符串

getJMSType()

实时到实时

long

getTimeToLive()

可选标头属性

另外,您可以使用 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 标头中的属性,它们可通过使用者端点的请求上下文来设置。

表 42.4. 设定的 JMS 标头属性

属性名称属性类型setter Method

关联 ID

字符串

setJMSCorralationID()

交付模式

int

setJMSDeliveryMode()

优先级

int

setJMSPriority()

实时到实时

long

setTimeToLive()

要设置这些属性,请执行以下操作:

  1. 创建 org.apache.cxf.transports.jms.context.JMSMessageHeadersType 对象。
  2. 使用 表 42.4 “设定的 JMS 标头属性” 中描述的适当的 setter 方法填充您要设置的值。
  3. 使用 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 标头中添加可选属性,请执行以下操作:

  1. 创建 JMSPropertyType 对象。
  2. 使用 setName() 设置属性的 name 字段。
  3. 使用 setValue() 设置属性的值字段。
  4. 使用 JMSMessageHeadersType.getProperty().add(JMSPropertyType),将 属性添加到 JMS 邮件标头中。
  5. 重复此过程,直到所有属性都已添加到消息标头中。

客户端接收超时

除了 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 秒。