ESB文档库 ESB文档库
00 概述
01 产品安装指南
02 快速入门指南
03 ESB Studio使用指南
04 企业服务总线使用指南
05 高级配置指南
06 接口服务说明
07 升级&数据迁移指南
08 FAQ
  • 消息确认

# 消息确认

ESB中的消息流转包含两种类型

  • 请求回复(request-response):本身具有消息回复,即不需要消息确认,http与soap协议的消息流转便是该模式
  • 单向消息(one-way):消息单向传递,没有回复,则需要提供消息的确认,来通知客户端是否消息被正确消费,JMS便是该模式

JMS代理服务设置中支持消息确认机制,即JMS代理服务从队列中取得消息后,消息不立即删除。 当JMS代理服务接收到正确消费的应答后删除,当接收到未正确消费的应答时,则按照设置的策略重发或删除。

下面代码为在中介服务中设置应答确认消息示例:

public static ITipMessagePayload buildAckMessage(ITipMessagePayload inMessage) throws Exception { 
    //使用原有消息的MessagePayload构建新消息的payload
    TipMessageBuilder builder = TipMessageBuilder.withPayload(inMessage.getMessagePayload());
    //拷贝原有消息的系统头
    builder.copySystemHeaders(inMessage.getSystemHeaders());
    //系统头内设置支持单向确认消息模式
    builder.setSystemHeader(MessageConstants.MESSAGE_INVOKE_TYPE,MessageConstants.ONE_WAY_SUPPORT_ACK);
    //收到此确认消息后,ESB会删除备份消息
    builder.setSystemHeader(MessageConstants.ACK_OPERATION,MessageConstants.ACK_OPERATION_DEL);
    //构建新的带确认的消息
    ITipMessagePayload jmsAckMsg = builder.build();
    return jmsAckMsg ;
}

如果消息在中介处理时出现异常(即用户认为没有正确消费消息),则可以在中介直接生成ACK消息,要求重新发送,代码如下:

public static ITipMessagePayload createJmsAck(ITipMessagePayload jmsRequestMsg) throws Exception { 
    //如果传入的jmsRequestMsg不正确,则在系统头中设置单向确认模式
    jmsRequestMsg.getSystemHeaders().put(MessageConstants.MESSAGE_INVOKE_TYPE,MessageConstants.ONE_WAY_SUPPORT_ACK);
    ITipMessagePayload jmsAckMsg = null;
    //通过AckMessageBuilder工具根据原有消息生成确认消息
    jmsAckMsg = AckMessageBuilder.build(jmsRequestMsg);
    //通知JMS代理服务重发本条JMS消息
    jmsAckMsg.getSystemHeaders().put(MessageConstants.ACK_OPERATION,MessageConstants.ACK_OPERATION_RETRY);
    return jmsAckMsg;
}

← 3.6.3 消息修改 3.6.5 拦截器开发 →