搜索

42.4. 使用 JMS 消息属性

download PDF

摘要

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 消息标头属性

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

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

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

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

将代理广播到 BindingProvider。

获取响应上下文。

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

42.4.2. 检查消息标头属性

标准 JMS 标头属性

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

表 42.3. JMS 标头属性
属性名称属性类型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 属性

摘要

使用使用者端点中的请求上下文,您可以设置多个 JMS 消息标头属性和消费者端点的超时值。这些属性可用于单一调用。每次调用服务代理时都必须重置它们。

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

JMS 标头属性

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

表 42.4. table JMS 标头属性
属性名称属性类型设置方法

关联 ID

字符串

setJMSCorralationID()

交付模式

int

setJMSDeliveryMode()

优先级

int

setJMSPriority()

生存时间

long

setTimeToLive()

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

  1. 创建 org.apache.cxf.transports.jms.context.JMSMessageHeadersType 对象。
  2. 使用 表 42.4 “table JMS 标头属性” 中描述的适当设置方法填充您要设置的值。
  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 () 设置属性的 value 字段。
  4. 使用 JMSMessageHeadersType.getProperty ().add (JMSPropertyType),将 属性添加到 JMS 消息标头中。
  5. 重复这个过程,直到所有属性都添加到邮件标头中。

客户端接收超时

除了 JMS 标头属性外,您还可以设置消费者端点在超时前等待响应的时间。您可以通过使用 org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RECEIVE_TIMEOUT 调用请求上下文的 put () 方法以毫秒为单位来设置值。

示例

例 42.15 “使用 Request 上下文设置 JMS 属性” 显示使用请求上下文设置某些 JMS 属性的代码。

例 42.15. 使用 Request 上下文设置 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 “使用 Request 上下文设置 JMS 属性” 中的代码执行以下操作:

获取用于其 JMS 属性更改的代理的 InvocationHandler

检查 InvocationHandler 是否为 BindingProvider

将返回的 InvocationHandler 对象转换为 BindingProvider 对象,以检索请求上下文。

获取请求上下文。

创建一个 JMSMessageHeadersType 对象来保存新的消息标头值。

设置正确 ID。

将 Expiration 属性设为 60 分钟。

创建新的 JMSPropertyType 对象。

设置可选属性的值。

将可选属性添加到消息标头中。

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

将客户端接收超时属性设置为 1 秒。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.