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

2023-11-26

我需要处理来自大约 30 个地址的电子邮件。我以一种将所有电子邮件发送到一个的方式来实现这一点DirectChannel之后到Receiver. In Receiver我可以了解消息来自哪个地址,为此我创建了CustomMessageSource包裹着javax.mail.Message我自己的类型包含javax.mail.Message还有一些Enum。看起来这不是一个好的决定,因为我可以使用@Transformer,但是如果我只有 1 个通道,我该如何使用它呢?

这是第一个问题。

第二个问题:

我应该使用ONE频道和ONE所有这些地址的接收者?或者更好地为每个邮件地址提供频道和接收者?我对Spring的理解还没有那么深,无法感受到其中的差异。

附注这个问题是继续Spring 多个 imapAdapter


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

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

我通常建议使用单个服务,除非该服务需要根据源执行完全不同的操作。

EDIT:

我修改了对您之前问题的回答,以使用标题中的 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);
    }

}

...希望有帮助。

EDIT 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;
}

and

@ServiceActivator(inputChannel="emailChannel")
public void handleMessage(Message message, @Header("emailUrl") String url,
                                           @Header("from") String from) {
    System.out.println(message + " header:" + url + " from:" + from);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息通道是一个还是多个? 的相关文章

随机推荐

  • Swagger/OpenAPI - 使用 $ref 传递可重用的定义参数

    假设我有一个像这样的参数limit 这个被到处使用 如果我需要更新它 则必须在各处更改它是一件痛苦的事情 parameters name limit in query description Limits the number of ret
  • Java 中缺少语言环境? [复制]

    这个问题在这里已经有答案了 我在 java 语言环境中发现了许多缺失的国家 地区 如果我打印出可用语言环境的列表 TreeSet lt String gt m new TreeSet lt String gt for Locale l Lo
  • Console.Write 在 Windows 窗体应用程序中不起作用

    我在 Visual Studio 2008 中创建了一个 VB NET Windows 窗体应用程序 当我从命令行运行程序时 我没有得到任何输出 只有下一个提示 我究竟做错了什么 Private Sub Form1 Load ByVal s
  • Asp.Net 身份和多租户上的重复角色名称

    我正在使用 ASP Net MVC 和 Identity 2 0 开发多租户 Web 应用程序 我已经像这样扩展了 IdentityRole public class ApplicationRole IdentityRole public
  • 在本机反应中单击按钮时显示加载程序

    我正在尝试在我的反应本机应用程序中实现加载器动画 但单击按钮时它不会触发加载器 尽管动画已经更改为true 看看我下面的代码 componentWillMount this hideLoader showLoader gt this set
  • where-object $_ 匹配多个条件

    data where object Name eq serverName domain com select object Property Description1 Version where object Description1 ma
  • 概念可以与模板模板参数一起使用吗?

    让我们考虑以下代码 include
  • 找不到参数的方法 jackOptions()

    大家好 我面临着 在 DefaultConfig Decolated name main Dimension null minSdkVersion DefaultApiVersion mApiLevel 16 mCodename null
  • 将动态键:值对传递给对象文字? [复制]

    这个问题在这里已经有答案了 我正在使用这段代码 如下所示 来尝试填充名为的对象文字Parameters在 for 循环内 我需要key value与循环迭代一起分配的对i变量 例如 key 1 chunks 1 key 2 chunks 2
  • 动态添加属性到动态对象?

    我有这个 dynamic d new ExpandoObject d Name attribute QualifiedName Name 所以 我知道 d 将有一个属性名称 现在 如果我在编译时不知道属性的名称 如何将该属性添加到动态中 我
  • 如何通过 Telegram Bot 发送文件

    我需要使用 TelegramBot API 发送 txt 文件 我已经尝试过了 并有问题 ok false error code 400 description 错误请求 错误的远程 指定的文件 ID 字符串长度错误 为了完成唐尼的回答 我
  • 查询中的问号运算符

    在我的 laravel 5 应用程序中 我使用 PostgreSQL 的 jsonb 数据类型 它有 操作员 但我无法让它在我的模型中工作 因为 laravel 使用问号作为绑定 具体来说 在 whereRaw 方法中 query gt w
  • Idea 中不显示字体

    更新 jrk7 openjdk 和 jre7 openjdk 字体后 Idea 中不显示字体 重新安装软件包 openjdk 和 idea 没有帮助 名称 a Linux ftp27host 3 14 6 1 ARCH 1 SMP PREE
  • 使用 pip 安装 uwsgi 时出现“ascii”编解码器无法解码错误

    我正在按照本教程设置 uwsgi https uwsgi readthedocs org en latest tutorials Django and nginx html I run pip install uwsgi在virtualen
  • Visual Studio - 用资源替换硬编码字符串的工具

    我有一个大型 ASP NET 项目 其中充满了硬编码字符串 现在必须将其提取到资源中 此类字符串几乎可以在任何地方找到 cs 文件 aspx 文件 ascx 文件等 并且文件数量巨大 我正在寻找一种工具 或任何方式 来一次找到所有这些硬编码
  • 从内存流读取存储的 PDF

    我正在使用 C 和 SQLServer 2012 开发一个数据库项目 在我的一个表单中 我有一个 PDF 文件 其中包含存储在表中的一些其他信息 这是成功的 但是当我想检索存储的信息时 我在显示 PDF 文件时遇到问题 因为我无法显示它 而
  • 具有多个数据库/DbContext 的 EF Code First 迁移

    我有两个数据库 每个数据库都有自己的 dbcontext 我设置了两个迁移配置 我可以为第一个数据库添加迁移 这很好 Add Migration DB1 InitialCreate ConfigurationTypeName DB1Conf
  • 使用 Jenkins Job-DSL 配置块将自定义步骤放置在特定位置

    我正在尝试使用 job dsl plugin 编写之前手动配置的大量 Jenkins 作业的配置脚本 这些作业的一种风格有多个步骤 其中包括使用 XShell 插件的几个步骤 job dsl 不直接支持这一点 不过 我应该能够通过使用自定义
  • 编写一个识别声音并执行操作的程序

    我想编写一个能够存储声音模式的程序 例如火车汽笛 喇叭 嘟嘟声 通过麦克风收听声音 然后在听到声音时采取一些行动 我懂一点Python 很早以前就用VB 编程过 我主要是一个 Oracle PLSQL 人员 该程序需要一个适度的用户界面 解
  • 消息通道是一个还是多个?

    我需要处理来自大约 30 个地址的电子邮件 我以一种将所有电子邮件发送到一个的方式来实现这一点DirectChannel之后到Receiver In Receiver我可以了解消息来自哪个地址 为此我创建了CustomMessageSour