【问题标题】:Grails mail plugin runtime configurationGrails 邮件插件运行时配置
【发布时间】:2022-04-06 17:54:25
【问题描述】:

使用 grails 邮件插件 1.0.7。

https://jira.grails.org/browse/GPMAIL-36 表示可以在运行时更改 1.0.1 以来的 plguin 配置。遗憾的是,它没有解释如何实现它。

我希望能够在运行时更改用户名,以便能够使用不同的邮件帐户。

谢谢。

【问题讨论】:

  • 最后不确定哪种解决方案更清洁,但无论如何,我必须注意并发约束,因为由于可能的竞争条件,spring 的单例行为阻止了我做我试图这样做的事情。如果我更改了 sendMail bean 的配置(两种选择都在最后这样做),任何对 sendMail 的调用都将使用该新配置,这不是我真正想要的,但能够控制每个调用的配置。该插件似乎不适合这种情况。

标签: email grails configuration


【解决方案1】:

基于this code,您应该能够在运行时更改配置,邮件插件将根据您的更改自动重新部署和更新邮件发件人。

例子:

Holders.config.grails.mail.username = 'foo'
Holders.config.grails.mail.password = 'bar'
sendMail {
    to "foo@bar.com"
    from "bar@foo.com"
    subject "Hi"
    body "This is an email"
} 

更新:

看起来以这种方式更改配置实际上不会触发onConfigChange 事件。根据this,您可以手动触发事件。像这样的:

Holders.pluginManager.getGrailsPlugin('mail').notifyOfEvent(GrailsPlugin.EVENT_ON_CONFIG_CHANGE, Holders.config)

【讨论】:

  • 那是 1.0.8-SNAPSHOT ...我已经在 1.0.7 中测试过,但似乎不起作用。但是我可以使用相同的 onConfigChange 方法,所以它应该。你知道 onConfigChange 事件是什么时候触发的,或者为什么这不起作用?
  • 文件自 1.0.7 以来没有改变:github.com/gpc/grails-mail/blob/v1.0.7/…
  • 我明白了,但您发布的代码不起作用......所以似乎事件没有被触发。我在控制器的方法中执行此操作。
  • 嗯,我想知道这个事件是否只有在 Config.groovy 更改时才会触发。也许就是这样。或者,您可以自己开火。请参阅我的更新答案。
  • 酷...我会尝试...所以我将使用 Holders.config.grails.mail.username = 'foo' 更新属性,然后手动触发事件 Holders.pluginManager。 getGrailsPlugin('mail').notifyOfEvent(GrailsPlugin.EVENT_ON_CONFIG_CHANGE, Holders.config) ...对吗?
【解决方案2】:

我已经意识到这可以通过从上下文访问 mailSender bean 并像这里解释的那样更新它来完成

Changing mail configuration in runtime

但是,如果@rmlan 解决方案最终奏效,它可能是一个更清洁的解决方案。

【讨论】:

    【解决方案3】:

    实际上,thr rmlan 解决方案适用于以下修复。由于 onConfigChange 比较现有配置映射和新配置映射的 hashCode,因此如果您在原始配置(Holders.config.grails.mail)中设置新配置,那么两个配置相同并且它永远不会通过应用新更改的条件,所以应创建新结构并将其传递给 notifyOfEvent 方法以将更改标记为不同的 hashCode。

    def mailConfig = [ grails: [ mail: [:] ]  ]
    
    mailConfig.grails.mail.host = newHost
    mailConfig.grails.mail.port = newPort
    
    Holders.pluginManager.getGrailsPlugin('mail').
            notifyOfEvent(GrailsPlugin.EVENT_ON_CONFIG_CHANGE, mailConfig)
    

    仍在使用 async-mail,而这一个使以下异常

    No qualifying bean of type [grails.plugin.mail.MailService] is defined: expected single matching bean but found 2: nonAsynchronousMailService,mailService
    

    由于 onConfigChange 的以下部分而被抛出

    event.ctx.getBean(MailService.class).setPoolSize(mailConfig.poolSize?:null)
    

    评论它让它可以作为一种解决方法,但是使 sendMail 的邮件插件被调用,而不是异步邮件,因此如果在构建邮件时使用异步邮件功能可能会引发异常。因此,在此解决方法中使用异步邮件应使用 sendAsynchronousMail 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2010-10-25
      • 2012-01-27
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多