在每个子上下文中,您都可以添加标头扩展器,以将自定义标头设置为来自适配器的URL。输出通道是共享服务的共享通道。
在服务中使用
void foo(Message emailMessage, @Header("myHeader") String url)我通常建议使用单个服务,除非该服务需要根据源代码做根本不同的事情。
编辑 :
我修改了您对上一个问题的答案,以使用标头中的url来增强原始消息;每个实例都有自己的头扩展器,它们都将扩展后的消息路由到公共端
emailChannel。
@Configuration@EnableIntegrationpublic class GeneralImapAdapter { @Value("${imap.url}") String imapUrl; @Bean public static PropertySourcesPlaceholderConfigurer pspc() { return new PropertySourcesPlaceholderConfigurer(); } @Bean @InboundChannelAdapter(value = "enrichHeadersChannel", poller = @Poller(fixedDelay = "10000") ) public MessageSource<javax.mail.Message> mailMessageSource(MailReceiver imapMailReceiver) { return new MailReceivingMessageSource(imapMailReceiver); } @Bean public MessageChannel enrichHeadersChannel() { return new DirectChannel(); } @Bean @Transformer(inputChannel="enrichHeadersChannel", outputChannel="emailChannel") public HeaderEnricher enrichHeaders() { Map<String, ? extends HeaderValueMessageProcessor<?>> headersToAdd = Collections.singletonMap("emailUrl", new StaticHeaderValueMessageProcessor<>(this.imapUrl)); HeaderEnricher enricher = new HeaderEnricher(headersToAdd); return enricher; } @Bean public MailReceiver imapMailReceiver() { MailReceiver receiver = mock(MailReceiver.class); Message message = mock(Message.class); when(message.toString()).thenReturn("Message from " + this.imapUrl); Message[] messages = new Message[] {message}; try { when(receiver.receive()).thenReturn(messages); } catch (MessagingException e) { e.printStackTrace(); } return receiver; }}…并且我修改了接收服务,以便可以访问标头…
@MessageEndpointpublic class EmailReceiverService { @ServiceActivator(inputChannel="emailChannel") public void handleMessage(Message message, @Header("emailUrl") String url) { System.out.println(message + " header:" + url); }}希望有帮助
编辑2 :
而且这有点复杂;它从有效负载中提取并将其放入标头中;因为您有完整的消息,所以用例不需要它,但是它说明了该技术…
@Bean@Transformer(inputChannel="enrichHeadersChannel", outputChannel="emailChannel")public HeaderEnricher enrichHeaders() { Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<>(); headersToAdd.put("emailUrl", new StaticHeaderValueMessageProcessor<String>(this.imapUrl)); expression expression = new SpelexpressionParser().parseexpression("payload.from[0].toString()"); headersToAdd.put("from", new expressionevaluatingHeaderValueMessageProcessor<>(expression, String.class)); HeaderEnricher enricher = new HeaderEnricher(headersToAdd); return enricher;}和
@ServiceActivator(inputChannel="emailChannel")public void handleMessage(Message message, @Header("emailUrl") String url, @Header("from") String from) { System.out.println(message + " header:" + url + " from:" + from);}


