Spring Cloud 入站通道适配器
PubSubInboundChannelAdapter
是GCP发布/订阅的入站通道适配器,它侦听GCP发布/订阅的新消息。它将新消息转换为内部Spring Message
,然后将其发送到绑定的输出通道。
Google Pub / Sub将消息有效负载视为字节数组。因此,默认情况下,入站通道适配器将使用byte[]
作为有效载荷来构造Spring Message
。但是,可以通过设置PubSubInboundChannelAdapter
的payloadType
属性来更改所需的有效负载类型。
PubSubInboundChannelAdapter
将对所需有效负载类型的转换委派给在PubSubTemplate
中配置的PubSubMessageConverter
。
要使用入站通道适配器,必须在用户应用程序端提供PubSubInboundChannelAdapter
并对其进行配置。
@Bean public MessageChannel pubsubInputChannel() { return new PublishSubscribeChannel(); } @Bean public PubSubInboundChannelAdapter messageChannelAdapter( @Qualifier("pubsubInputChannel") MessageChannel inputChannel, SubscriberFactory subscriberFactory) { PubSubInboundChannelAdapter adapter = new PubSubInboundChannelAdapter(subscriberFactory, "subscriptionName"); adapter.setOutputChannel(inputChannel); adapter.setAckMode(AckMode.MANUAL); return adapter; }
在示例中,我们首先指定适配器将向其写入传入消息的MessageChannel
。MessageChannel
的实现在这里并不重要。根据您的用例,您可能需要使用MessageChannel
而非PublishSubscribeChannel
。
然后,我们声明PubSubInboundChannelAdapter
bean。它需要我们刚创建的通道和一个SubscriberFactory
,该SubscriberFactory
从Google Cloud Java Client for Pub / Sub创建Subscriber
对象。
GCP Pub / Sub的Spring Boot入门程序提供了已配置的SubscriberFactory
。
PubSubInboundChannelAdapter
支持三种确认模式,其中AckMode.AUTO
是默认值。
自动确认(AckMode.AUTO
)
如果适配器将消息发送到通道,并且未引发任何异常,则消息将被GCP发布/订阅确认。如果在处理邮件时抛出RuntimeException
,则该邮件将被否定。
自动确认确认(AckMode.AUTO_ACK
)
如果适配器将消息发送到通道,并且未引发任何异常,则消息将被GCP发布/订阅确认。如果在处理消息时抛出RuntimeException
,则消息既不会被确认也不会被拒绝。
当使用订阅的确认截止时间超时作为重试传递回退机制时,此功能很有用。
手动确认(AckMode.MANUAL
)
适配器将BasicAcknowledgeablePubsubMessage
对象附加到Message
标头。用户可以使用GcpPubSubHeaders.ORIGINAL_MESSAGE
键提取BasicAcknowledgeablePubsubMessage
,并将其用于(n)确认消息。
@Bean @ServiceActivator(inputChannel = "pubsubInputChannel") public MessageHandler messageReceiver() { return message -> { LOGGER.info("Message arrived! Payload: " + new String((byte[]) message.getPayload())); BasicAcknowledgeablePubsubMessage originalMessage = message.getHeaders().get(GcpPubSubHeaders.ORIGINAL_MESSAGE, BasicAcknowledgeablePubsubMessage.class); originalMessage.ack(); }; }
更多建议: