2016-09-13 18 views
1

これはRESTfulなリスナーサービスの実装に関する質問ですが、まずコンテキストを提供するための背景をいくつか提供します。JavaアプリケーションからのRESTfulサービスの開始および停止

私は既存のJavaアプリケーション&スイングUIを使用して、ディレクトリとデータベースファイルを入力として受け取ります。これらの設定が完了すると、そのディレクトリ内のPDFフォームがデータベースにインポートされます。 UIのボタンとロギング出力のための小さなJFrameウィンドウがあります。これは非常にうまくいく。

このJavaアプリをExchangeメールサーバに接続し、PDFを添付した新しい電子メールを受信し、ディレクトリに保存し、上記のアプリケーションを使用してインポートします。

は(IMAP、POPなどが有効になっていません)私は https://github.com/OfficeDev/ews-java-api

は、しかし、これは必要とEWS-のJava APIを使用しようとしていた私たちのExchangeサーバーに接続することExchangeメールからのプッシュ通知を取得したいクライアント

1)Exchangeサーバーに接続する(私はこれを行うことができます)

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

2)登録:(REST経由で)サーバは、3つのことを行いますExchange Web Services Java APi + RESTful Push Notifications Listener:通知およびセットアップにコールバック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)はセットアップリスナーサービスこれと同様に新しいメール通知(ヘルプはここで必要)

を取得するためにプッシュします

@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は、ステップ3とTomcat内で実行し、Tomcatが起動され、これらのWebサービスのためのTomcatなどのコンテナ内で実行する必要があることが表示されます。

既存のアプリケーションでリスナーの起動/停止を行う方法はありますか、それともWebサービスプロジェクトにするために全部を変換する必要がありますか?これまでのところ、ステップ3はスタンドアロンのWebプロジェクトとしてしか行えませんでしたが、既存のアプリケーションからステップ3をやり直すことができるようにしたいと考えています。

理想的には、手順2の電子メール通知の購読後にExchangeNotificationListenerを開始したいと考えています。

サブスクリプションを開始するクラスは、これを行うためにExchangeNotificationListenerクラスを拡張できますか?

また、私はtomcat以外のものを使用する必要がありますか?

おかげ

答えて

0

私は、同じJavaプロセスでのスイングアプリケーションやサーブレットを実行するためにどのような方法を認識していないです。たとえ1つがあったとしても、おそらく何らかの種類のハックになるでしょう。

これについて考えると、完全に別々の2つの概念が含まれていることがわかります。 Swing GUIはデスクトップアプリケーションであり、デスクトップアプリケーションは通常、グラフィカルデスクトップ環境が必要なため、ユーザーセッションのコンテキストで実行されます。したがって、ユーザはの後にを起動し、ユーザがログアウトする前にを閉じてからにログアウトします。

「リスナー」アプリケーションはWebアプリケーションであり、ネットワーク接続が必要であり、ファイルシステムへのアクセスが必要ですが、それ以外の場合はグラフィカルデスクトップ環境については何も知りません。 Webアプリケーションは通常、サーバーの起動時に起動され、サーバーが実行されている間は実行される、実行時間の長いシステムサービスです。

これらを1つのアプリケーションに結合しようとすると、デザインに問題があることも示されます。

代わりに別の方法をお勧めします。 サブスクリプションプッシュコールバック登録およびリスナーの3つの部分をWebアプリケーション内に作成します。そのアプリケーションをサーブレットコンテナにデプロイし、通常のシステムサービスとしてインストールし、システムの起動時に起動するように設定することができます。

次に、サーブレットで受け取ったメールで何をするかについて考える必要があります。 Swingアプリケーションの起動時にどこかに格納して処理するか、または処理ロジックをWebアプリケーションに移します。好ましくは、そのコードを独自のライブラリに移動して、GUIアプリケーションとサーブレットの両方からアクセスできます。

Swingアプリケーションの起動時には、すべてのメールがデータベースに格納されていて、簡単にアクセスできます。または、アプリケーションの実行中にサーブレットが保存したメールを処理できます。走っていない。

関連する問題