# 消息确认
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;
}