[英]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.