email - señal - ¿Canales de mensajes uno o muchos?
qué es el código 721 de directv (1)
En cada contexto secundario, puede agregar un enriquecedor de encabezado para establecer un encabezado personalizado a la URL desde el adaptador; siendo el canal de salida el canal compartido para el servicio compartido.
En el servicio, use
void foo(Message emailMessage, @Header("myHeader") String url)
En general, recomendaría usar un solo servicio a menos que el servicio necesite hacer cosas radicalmente diferentes según la fuente.
EDITAR :
Modifiqué mi respuesta a su pregunta anterior para mejorar el mensaje original con la url en un encabezado;
cada instancia tiene su propio enriquecedor de encabezado y todos enrutan el mensaje enriquecido al
emailChannel
común.
@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;
}
}
... y modifiqué el servicio de recepción para que tenga acceso al encabezado ...
@MessageEndpoint
public class EmailReceiverService {
@ServiceActivator(inputChannel="emailChannel")
public void handleMessage(Message message, @Header("emailUrl") String url) {
System.out.println(message + " header:" + url);
}
}
...Espero que ayude.
EDITAR 2 :
Y este es un poco más sofisticado; extrae el de la carga útil y lo coloca en un encabezado; no es necesario para su caso de uso ya que tiene el mensaje completo, pero ilustra la técnica ...
@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;
}
y
@ServiceActivator(inputChannel="emailChannel")
public void handleMessage(Message message, @Header("emailUrl") String url,
@Header("from") String from) {
System.out.println(message + " header:" + url + " from:" + from);
}
Necesito manejar correos electrónicos de aproximadamente 30 direcciones.
Implemento esto de una manera donde todos los correos electrónicos van a un
DirectChannel
y luego a
Receiver
.
En
Receiver
puedo entender de qué dirección viene el mensaje, para hacer esto creo
CustomMessageSource
que envuelve
javax.mail.Message
a mi propio tipo que contiene
javax.mail.Message
y algo de
Enum
.
Parece que esta no es una buena decisión, porque puedo usar
@Transformer
, pero ¿cómo puedo usarlo si solo tengo 1 canal?
Esa fue la primera pregunta.
Segunda pregunta:
¿Debo usar UN canal y UN receptor para todas esas direcciones? ¿O mejor tener canal y receptor para cada dirección de correo? No entiendo a Spring tan profundamente como para sentir la diferencia.
ps esta pregunta es la continuación de Spring multiple imapAdapter