消息通道是一个还是多个?

我需要处理大约30个地址的电子邮件。我将所有电子邮件都发送到DirectChannel,然后发送到Receiver。在Receiver我可以理解消息来自何地址的情况下,为此我创建CustomMessageSource了包装javax.mail.Message到包含javax.mail.Message和some的我自己的类型Enum。看来这不是一个好的决定,因为我可以使用@Transformer,但是如果我只有1个频道,该如何使用呢?

那是第一个问题。

我应该为所有这些地址使用 一个 通道和_一个_接收器吗?还是最好为每个邮件地址设置频道和接收者?我对Spring的了解并不那么深刻,无法感受到与众不同。

回答:

在每个子上下文中,您都可以添加标头扩展器,以将自定义标头设置为来自适配器的URL。输出通道是共享服务的共享通道。

在服务中使用 void foo(Message emailMessage, @Header("myHeader") String url)

我通常建议使用单个服务,除非该服务需要根据源代码做根本不同的事情。

我修改了您对上一个问题的答案,以使用标头中的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);

}

}

希望有帮助

而且这有点复杂;它从有效负载中提取并将其放入标头中;因为您有完整的消息,所以用例不需要它,但是它说明了该技术…

@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);

}

以上是 消息通道是一个还是多个? 的全部内容, 来源链接: utcz.com/qa/399588.html

回到顶部