2014-05-01 97 views
2

我试图接收带有消息驱动bean的电子邮件。我正在使用jboss wildfly。 Unfortunatley,我找不到真正的文件。这是迄今为止我发现的最多:用于接收电子邮件的MDB

@MessageDriven(activationConfig={ 
     @ActivationConfigProperty(propertyName="mailServer", propertyValue="imap.gmail.com"), 
     @ActivationConfigProperty(propertyName="mailFolder", propertyValue="INBOX"), 
     @ActivationConfigProperty(propertyName="storeProtocol", propertyValue="imap"), 
     @ActivationConfigProperty(propertyName="userName", propertyValue="[email protected]"), 
     @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,我在哪里放?我揣测这可能会有不同的版本,我无法在野蝇内找到它。
  3. 是注释配置足够还是我需要在xml中配置任何东西?
+2

'mail-ra.rar'由IronJacamar项目提供。 AS7有一个[论坛帖子](https://community.jboss.org/message/725319),可能也会帮助Wildfly。 Tbh,在提供的文档中查看几分钟后,我感到害怕,并回到基于定时器的EJB的安全性。既然你使用gmail作为例子,如果你投票(使用计时器服务)而不是对消息作出反应(无论如何将由投票服务产生),我想你可以省下很多工作。 – mabi

+0

谢谢。我想我也会去定时器路线。 MDB看起来很诱人,因为它看起来像一个开箱即用的解决方案。但我想这不是。 – EasterBunnyBugSmasher

回答

1

我并不是IronJacamar的专家,这就是你需要配置的inbound adapter。通过阅读文档,我的印象是,有几层抽象隐藏了简单的gmail IMAP服务轮询。

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

您必须配置邮件Session。我已经撕开了以下提取物standalone.xmlWildfly example

<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("[email protected]", "xxx"); 

可设置的属性的完整列表可在javadoc

在这种情况下,您根本不需要@Resource,并且每次唤醒方法时都可以连接新连接。请注意,如果计划在那里有任何重要负载,则可能需要缓存该存储对象,并且只在连接超时时才连接。

+0

是的,这就是我现在正在做的事情。 wildfly的当前配置是2.0,现在看起来有点不同。 – EasterBunnyBugSmasher