【问题标题】:MDB for receiving emails用于接收电子邮件的 MDB
【发布时间】:2014-05-01 19:15:15
【问题描述】:

我正在尝试使用消息驱动 bean 接收电子邮件。我正在使用 jboss Wildfly。不幸的是,我找不到关于它的真实文档。这是迄今为止我发现的最多的:

@MessageDriven(activationConfig={
        @ActivationConfigProperty(propertyName="mailServer", propertyValue="imap.gmail.com"),
        @ActivationConfigProperty(propertyName="mailFolder", propertyValue="INBOX"),
        @ActivationConfigProperty(propertyName="storeProtocol", propertyValue="imap"),
        @ActivationConfigProperty(propertyName="userName", propertyValue="me@gmail.com"),
        @ActivationConfigProperty(propertyName="password", propertyValue="xxx")
    })
@ResourceAdapter("mail-ra.rar")
public class EMailReceiver implements MailListener {


    @Override
    public void onMessage(Message msg) {

        System.out.println("MSG: " + msg.toString());
    }

}

我有几个关于如何完成这项工作的问题。很抱歉将它们全部归为一个问题,但我相信它们是一体的。

  1. 这个 ResourceAdapter 是什么?我可以找到 ResourceAdapter 类,但找不到注解。
  2. 我在哪里可以得到正确的 mail-ra.rar,我应该把它放在哪里?我认为这可能有不同的版本,我在 wildfly 中找不到。
  3. 注解配置是否足够,或者我需要在 xml 中配置任何内容吗?

【问题讨论】:

  • mail-ra.rar 由 IronJacamar 项目提供。 AS7 的forum post 也可能对 Wildfly 有所帮助。 Tbh,在查看了提供的文档几分钟后,我感到害怕并跑回基于 Timer 的 EJB 的安全性。由于您使用 gmail 作为示例,我认为如果您轮询(使用计时器服务)而不是对消息做出反应(无论如何,这些消息将由轮询服务生成),那么您可以节省大量工作。
  • 谢谢。我想我也会去计时器路线。 MDB 看起来很诱人,因为它看起来像是一个开箱即用的解决方案。但我想不是。

标签: email jakarta-ee jboss message-driven-bean wildfly


【解决方案1】:

我不是 IronJacamar 方面的专家,您需要为 inbound adapter 进行配置。我阅读文档的印象是,有几个抽象层隐藏了对 gmail IMAP 服务的简单轮询。

好消息是:您可以自己轻松做到这一点。

您必须配置一个邮件Session。我从Wildfly example 中提取了standalone.xml 的以下摘录:

<subsystem xmlns="urn:jboss:domain:mail:1.0">
<mail-session jndi-name="java:/jboss/mail/MyGmail">
    <imap-server address="example.com" port="432">
        <login name="nobody" password="pass"/>
    </imap-server>
</mail-session>
</subsystem>

如果您是这样设置的,您可以将您的会话称为Resource

@Stateless
public class PollingImapAccess {
    @Resource(name = "java:/jboss/mail/MyGmail")
    private Session session;

    @Schedule(hour = "*")
    public void init() {
        try {
            IMAPStore store = (IMAPStore) session.getStore();
            if (!store.isConnected()) store.connect();
            // grab your folders, scan for new messages     
        } catch (MessagingException ex) { /* handle exception */ }
    }
}

这将导致 EJB 容器每小时唤醒您的 bean 并连接到您的 gmail 帐户。您可以在tutorial 中阅读有关计时器的更多信息。

我真的不明白你必须用你的个人帐户信息来负担你的通用服务器配置,你可以回退到Session#getInstance() method

Properties gmail = new Properties();
gmail.setProperty("mail.imaps.host", "imap.gmail.com");
gmail.setProperty("mail.imaps.port", "993");

Session session = Session.getInstance(gmail);
IMAPSSLStore mystore = (IMAPSSLstore) session.connect("me@gmail.com", "xxx");

javadoc 中提供了可设置属性的完整列表。

在这种情况下,您根本不需要@Resource,只需在每次方法唤醒时建立一个新连接即可。请注意,如果计划在那里有任何重大负载,您可能希望缓存该存储对象并仅在连接超时时连接。

【讨论】:

  • 是的,这就是我现在正在做的事情。目前 wildfly 的配置是 2.0,看起来有点不同。
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多