2014-05-01 96 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