簡體   English   中英

從Java Application啟動和停止RESTful服務

[英]start & stop RESTful service from Java Application

這是關於實現RESTful偵聽器服務的問題,但我將首先提供一些背景知識來提供上下文。

我有一個現有的java應用程序和swing UI,它將目錄和數據庫文件作為輸入。 設置完成后,按鈕會將該目錄中的PDF表單導入數據庫。 UI中有一個小的JFrame窗口用於按鈕和一些日志輸出。 這非常有效。

我現在想要這個Java應用程序連接到我們的Exchange郵件服務器,收聽附有PDF的新電子郵件,將它們保存到目錄並使用我上面的應用程序導入。

要連接到我們的Exchange服務器(IMAP,POP等未啟用),我將使用ews-java API https://github.com/OfficeDev/ews-java-api

但是,這要求希望從Exchange郵件服務器(通過REST)獲取推送通知的客戶端執行以下三項操作:

1)連接到交換服務器(我可以這樣做)

ExchangeService newService = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
newService.setUrl("https://myurl/ews/Exchange.asmx");
ExchangeCredentials credentials = new WebCredentials("user","password");
newService.setCredentials(credentials);

2)訂閱推送通知並設置回調URI(我可以這樣做)

    @Override
public PushSubscription subscribeToPushNotifications(){

URI callback = null;
PushSubscription pushSubscription = null;
try{
    logger.info("Subscribing to push notifications.. Endpoint Listener URI = " + config.getNotificationListenerURI());
    callback = new URI(config.getNotificationListenerURI());
    pushSubscription = service.subscribeToPushNotifications(
            getFoldersForSubscription(), callback , 5, null, 
            EventType.NewMail, EventType.Created, EventType.Deleted, EventType.Modified, EventType.Moved); 
    logger.info("Done! --> PushSubscription ID= " + pushSubscription.getId());
}catch(URISyntaxException e){
    logger.error("EWS ==> Invalid Notification Listener URL = " + config.getNotificationListenerURI() +". Please, verify <integration-modules>");
    Throwables.propagate(e);
}catch (Exception e){
    logger.error("EWS ==> Error subscribing to push notifications", e);
    Throwables.propagate(e);
}

return pushSubscription;
}

3)設置監聽服務以獲取新的電子郵件通知(此處需要幫助)

與此類似: Exchange Web服務Java APi + RESTful推送通知監聽器

@Path("/emailnotification")
public class ExchangeNotificationListener {

private static final Log logger = LogFactory.getLog(ExchangeNotificationListener.class);

@Path("/incomingevent")
@POST()
@Produces(MediaType.TEXT_XML)
public Response onNotificationReceived() throws Exception {
    logger.info("Received EWS notification !!!");
return Response.ok().build();
}

@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg) {
    String output = "Jersey say : " + msg;
    return Response.status(200).entity(output).build();
    }
}

看來我的監聽器和jax-rs需要在像tomcat這樣的容器中運行第3步,並且這些在tomcat中運行並由tomcat啟動的Web服務。

有沒有辦法讓我現有的應用程序啟動/停止監聽器,還是我必須將整個事件轉換為Web服務項目? 到目前為止,我只是設法將第3步作為一個獨立的Web項目,但希望能夠從我現有的應用程序開始停止它。

理想情況下,我希望在第二步訂閱電子郵件通知后啟動ExchangeNotificationListener。

啟動訂閱的類是否可以擴展ExchangeNotificationListener類來執行此操作?

或者我應該使用除tomcat以外的東西?

謝謝

我不知道在同一個Java進程中運行swing應用程序和servlet的方法。 即使有一個它可能是某種黑客。

如果你仔細想想,你會發現有兩個完全獨立的概念。 您的Swing GUI是桌面應用程序,桌面應用程序通常在用戶會話的上下文中運行,因為它們需要圖形桌面環境。 因此,通常在用戶登錄啟動在用戶注銷之前關閉它們。

另一方面,您的“監聽器”應用程序是一個Web應用程序,它需要網絡連接,並且可能需要文件系統訪問,否則它對圖形桌面環境一無所知。 Web應用程序通常是較長時間運行的系統服務,只要服務器正在運行,就會在服務器啟動並運行時啟動。

如果您嘗試將它們組合到單個應用程序中,那么這也表明您的設計存在問題。

我會建議采用不同的方法。 在Web應用程序中為訂閱推送回調注冊偵聽器創建三個部分。 您可以將該應用程序部署在Servlet容器中,將其安裝為常規系統服務,並將其配置為在系統啟動時啟動它。

接下來,您需要考慮使用servlet中收到的郵件做什么。 您可以將它們存儲在某個地方並在啟動Swing應用程序時處理它們,或者您也將處理邏輯移動到Web應用程序,最好將該代碼移動到它自己的庫中,然后您可以從gui應用程序和servlet訪問它們。

根據您選擇的選項,當您啟動Swing應用程序時,要么所有郵件都已存在於數據庫中,您只需訪問它們,或者您只需處理servlet在您的應用未運行時存儲的郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM