42.4. 使用 JMS 消息属性


摘要

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

42.4.1. 检查 JMS 消息标头

摘要

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

在服务中获取 JMS Message Headers

要从 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);
       ...
     }
      ...
}

在 Consumer 中获取 JMS 消息标头属性

从 JMS 传输成功检索消息后,您可以使用使用者的响应上下文来检查 JMS 标头属性。另外,您可以设置或检查客户端在超时前等待响应的时间长度,如 “client Receive Timeout”一节 所述。 要从消费者的响应上下文中获取 JMS 消息标头,请执行以下操作:

  1. 获取响应上下文,如 “获取上下文”一节 所述。
  2. 使用上下文的 get () 方法和 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RESPONSE_HEADERS 作为参数,从响应上下文获取 JMS 消息标头属性。

例 42.13 “从 Consumer Response Header 获取 JMS 标头” 显示用于从消费者的响应上下文获取 JMS 消息标头属性的代码。

例 42.13. 从 Consumer Response Header 获取 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 “从 Consumer Response Header 获取 JMS 标头” 中的代码执行以下操作:

将代理转换为 BindingProvider。

获取响应上下文。

从响应上下文检索 JMS 消息标头。

42.4.2. 检查消息标头属性

标准 JMS 标头属性

表 42.3 “JMS Header Properties” 列出您可以在 JMS 标头中检查的标准属性。

表 42.3. JMS Header Properties
属性名称属性类型getter Method

关联 ID

字符串

getJMSCorralationID()

交付模式

int

getJMSDeliveryMode()

消息过期

long

getJMSExpiration()

消息 ID

字符串

getJMSMessageID()

优先级

int

getJMSPriority()

redelivered

布尔值

getJMSRedlivered()

时间戳

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 Properties

摘要

在消费者端点中使用请求上下文,您可以设置多个 JMS 消息队列属性和消费者端点的超时值。这些属性对单个调用有效。每次在服务代理上调用操作时,您必须重置它们。

请注意,您无法在服务中设置标头属性。

JMS Header Properties

表 42.4 “settable JMS Header Properties” 列出 JMS 标头中可以使用消费者端点的请求上下文设置的属性。

表 42.4. settable JMS Header Properties
属性名称属性类型setter Method

关联 ID

字符串

setJMSCorralationID()

交付模式

int

setJMSDeliveryMode()

优先级

int

setJMSPriority()

生存时间

long

setTimeToLive()

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

  1. 创建 org.apache.cxf.transports.jms.context.JMSMessageHeadersType 对象。
  2. 使用 表 42.4 “settable JMS Header Properties” 中描述的适当设置方法填充您要设置的值。
  3. 使用 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_REQUEST_HEADERS 作为第一个参数,将值设置为请求上下文的 put () 方法。

可选的 JMS 标头属性

您还可以将可选属性设置为 JMS 标头。可选的 JMS 标头属性存储在 JMSMessageHeadersType 对象中,用于设置其他 JMS 标头属性。它们存储为包含 org.apache.cxf.transports.jms.context.JMSPropertyType 对象的 List 对象。要在 JMS 标头中添加可选属性,请执行以下操作:

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

client Receive Timeout

除了 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 对象来保存新的消息标头值。

设置 Correlation ID。

将 Expiration 属性设置为 60 分钟。

创建新的 JMSPropertyType 对象。

设置可选属性的值。

在消息标头中添加 optional 属性。

将 JMS 消息标头值设置为请求上下文。

将 client receive timeout 属性设置为 1 秒。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.