消息渠道一个或多个?
我需要处理大约30个地址的电子邮件。 我以一种将所有电子邮件转到一个DirectChannel
并转到Receiver
后的方式实现此目的。 在Receiver
我可以从什么地址消息来了解,做到这一点,我创buildCustomMessageSource
包装javax.mail.Message
到我自己的types,其中包含javax.mail.Message
和一些Enum
。 看起来这不是一个好的决定,因为我可以使用@Transformer
,但如果我只有一个通道,我怎么能使用它?
这是第一个问题。
第二个问题:
我应该使用一个通道和一个接收器的所有地址? 或者更好地为每个邮件地址设置频道和接收器? 我不太了解spring,所以感受到不同。
ps这个问题是Spring多重imapAdapter的延续
在每个子上下文中,您可以添加一个头文件richher来为适配器的URL设置一个自定义头文件; 输出通道是共享服务的共享通道。
在服务中,使用void foo(Message emailMessage, @Header("myHeader") String url)
我通常会build议使用单一的服务,除非服务需要根据来源做完全不同的事情。
编辑 :
我修改了我以前的问题的答案,以增强原始邮件的标题中的url; 每个实例都有自己的头丰富,他们都将丰富的消息路由到普通的emailChannel
。
@Configuration @EnableIntegration public 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; } }
…我修改了接收服务,以便获取头文件…
@MessageEndpoint public 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); }