这是关于实现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)连接到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)订阅推送通知并设置回调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 Services Java APi + RESTful Push Notifications Listener
@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以外的东西吗?
由于
答案 0 :(得分:0)
我不知道在同一个Java进程中运行swing应用程序和servlet的方法。即使有一个,也可能是某种黑客攻击。
如果您考虑一下,您会发现涉及两个完全独立的概念。您的Swing GUI是桌面应用程序,桌面应用程序通常在用户会话的上下文中运行,因为它们需要图形桌面环境。因此,通常会在用户登录后 启动,然后在用户注销之前关闭。
另一方面,你的&#34;听众&#34;应用程序是一个Web应用程序,它需要网络连接并且可能是文件系统访问,但是它对图形桌面环境一无所知。 Web应用程序通常是较长时间运行的系统服务,只要服务器正在运行,就会在服务器启动和运行时启动。
如果您尝试将它们合并到一个应用程序中,那么这也表明您的设计存在问题。
我会建议采用不同的方法。在Web应用程序中为订阅,推送回调注册和侦听器创建三个部分。您可以将该应用程序部署在Servlet容器中,将其安装为常规系统服务,并将其配置为在系统启动时启动它。
接下来,您需要考虑使用servlet中收到的邮件做什么。您可以将它们存储在某个地方并在启动Swing应用程序时处理它们,或者您也将处理逻辑移动到Web应用程序,最好将该代码移动到它自己的库中,然后您可以从gui应用程序和servlet访问它们。
根据您选择的选项,当您启动Swing应用程序时,您的所有邮件都已存在于数据库中,您只需访问它们,或者您可以只处理servlet存储的那些邮件而您的应用程序不是运行