如何使用Apache Camel处理MLLP确认?接收ACK超时该如何解决?
解决方案
导致这个超时的核心原因是MLLP消费者没有正确返回ACK报文给生产者,仅设置MLLP_ACKNOWLEDGEMENT_TYPE属性不足以触发自动ACK返回,你可以按照以下方案修改:
方案1:显式生成并返回ACK报文(最稳妥)
修改消费者路由,直接把ACK作为消息体返回,不需要依赖自动ACK机制:
@Component public class Consumer extends RouteBuilder { @Override public void configure() { from(mllp("localhost:4444")) .log("received") .unmarshal(new HL7DataFormat()) .log("unmarshalled") // 直接生成ACK作为消息体返回,替换之前的setProperty配置 .transform(ack(AcknowledgmentCode.AA)) .log("responding") .end(); } }
方案2:调整自动ACK相关配置
如果你希望用设置属性的方式实现自动ACK,需要确保消费者端点开启了autoAck参数(3.x版本默认是开启,但部分场景下可能被覆盖):
@Component public class Consumer extends RouteBuilder { @Override public void configure() { from(mllp("localhost:4444?autoAck=true")) .log("received") .unmarshal(new HL7DataFormat()) .log("unmarshalled") .setProperty(MLLP_ACKNOWLEDGEMENT_TYPE, constant(AcknowledgmentCode.AA.name())) .log("responding") .end(); } }
方案3:调整生产者超时时间
如果是你的业务处理逻辑耗时较长导致ACK返回超时,可以调大生产者端的ACK超时阈值:
@Component public class Producer extends RouteBuilder { @Override public void configure() { from("direct:hl7-recipient") .marshal(new HL7DataFormat()) // 单位是毫秒,这里调整为15秒超时,可根据实际业务调整 .to(mllp("localhost:4444?ackTimeout=15000")) .end(); } }
内容的提问来源于stack exchange,提问作者SomeDevDoingStuff
相关产品推荐
相关产品推荐

