2

Я пытаюсь заставить слушателя работать с API-интерфейсом ews java, но я не могу .. Надеюсь, вы можете мне помочь!Обмен веб-сервисами Java APi + RESTful Push Notifications Listener

я сделал следующие шаги:

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) Затем подписаться на уведомления толчка:

@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) Тогда разработал мой слушатель как услугу «Restful webservice» (я тестировал с использованием фиктивного метода и его работу)

Сначала определите сервлет:

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.rest</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

После этого, создайте класс прослушивателя для отображения адреса, определенные в сервлет (тот, я прошел к ExchangeService)

@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(); 
    } 
} 

НО я установить точку останова и затем отправьте мне письмо, но ничего не происходит. Что я делаю неправильно/не хватает ??? Пожалуйста помоги !

P.S: фиктивный метод getMsg() работает, поэтому служба остальное работает

Спасибо заранее !!

ответ

3

Проблема заключалась в том, что брандмауэр блокировал входящие сообщения EWS в среду моего dev.

Вот окончательная версия слушателя. Я надеюсь, что кто-то найдет это полезным.

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

private static final Log logger = LogFactory.getLog(ExchangeNotificationListener.class); 
private static final String OK = "OK"; 
private static final String UNSUBSCRIBE = "Unsubscribe"; 

/** 
* This method receives a SOAP message from Microsoft Exchange Web Services, parses it into a ExchangeNotification object, 
* do some business logic and sends an ACK response to keep the subscription alive. 
* 
* @param request 
*   EWS Push Notification request 
* @param response 
* @throws Exception 
*/ 
@Path("/incomingevent") 
@POST() 
@Consumes(MediaType.TEXT_XML) 
public void onNotificationReceived(@Context HttpServletRequest request, @Context HttpServletResponse response) 
     throws Exception { 

    // Establish the start time so we can report total elapsed time to execute the call later. 
    long startTime = GregorianCalendar.getInstance().getTimeInMillis(); 
    long endTime; 

    // Retrieve the EWS Notification message as an XML document 
    Document notificationXML = loadXML(IOUtils.toString(request.getInputStream())); 

    // Deserialize the document 
    ExchangeNotification notif = new ExchangeNotification(notificationXML); 

    // We need the subscription id in order to proceed 
    String subscriptionId = notif.getSubscriptionId(); 

    if (isBlank(subscriptionId)) { 
     logger.error("SOAP Envelope MUST contains the subscriptionId"); 
     // If we did not successfully parse the XML document, tell Exchange that we got a bad request. 
     response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
    } 

    if (!ExchangeSubscriptionMap.getInstance().getSubscriptionsMap().containsKey(subscriptionId)) { 
     logger.warn("SubscriptionId = " + subscriptionId 
       + " was not found in the subscriptions map. Unsubscribing..."); 
     sendResponse(response, UNSUBSCRIBE); 
     return; 
    } 

    // Do some logic here depending on the current EventType 
    businessLogic(notif, response); 

    // Flush the buffer and report the total time taken to execute for this notification. 
    response.flushBuffer(); 
    endTime = GregorianCalendar.getInstance().getTimeInMillis(); 
    logger.debug(String.format("Total execution time: %1$s (ms)", (Long) (endTime - startTime))); 
} 

/** 
* Sends an ACK response to the Exchange Web Service 
* 
* @param response 
* @param msg 
*   the content of the response message 
*/ 
private void sendResponse(HttpServletResponse response, String msg) { 
    try { 
     // Build the HTTP response 
     String str = ExchangeUtils.getResponseXML(msg); 
     response.setCharacterEncoding("UTF-8"); 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.setContentType("text/xml; charset=UTF-8"); 
     response.setContentLength(str.length()); 

     // Send the response. 
     PrintWriter w = response.getWriter(); 
     w.print(str); 
     w.flush(); 
    } catch (IOException e) { 
     logger.error("Error getting the response writer"); 
     Throwables.propagate(e); 
    } 
} 

/** 
* Process the incoming notification, do some business logic and send an ACK response to Exchange 
* 
* @param notification 
*   to be processed 
* @param response 
*   to be returned 
*/ 
@SuppressWarnings("unchecked") 
private void businessLogic(ExchangeNotification notification, HttpServletResponse response) { 
    try { 
     // Iterate the notification events 
     for (SubscriptionEvent event : notification.getEvents()) { 
      // Only take care of the Modified event 
      switch (event.getEventType()) { 
      case MODIFIED: 
       // logic here 
       // Get the ExchangeService instance this user use for Subscribing 
       MSExchangeServiceManager service = ExchangeSubscriptionMap.getInstance().getSubscriptionsMap().get(notification.getSubscriptionId()).getService(); 

       //e.g: service.getUnreadMessages(WellKnownFolderName.Inbox)); 
       break; 
      default: 
       logger.debug("Skipping: " + event.getEventType()); 
       break; 
      } 
     } 

     // Finally, send the response. 
     sendResponse(response, OK); 

    } catch (Exception e) { 
     logger.error("EWS ==> Error processing request", e.getCause()); 
     Throwables.propagate(e); 
    } 
} 

/** 
* Create a XML Document using a raw xml string 
* 
* @param rawXML 
*   the raw xml string to be converted 
* @return XML EWS Nofitication document 
*/ 
private Document loadXML(String rawXML) { 
    Document doc = null; 
    try { 
     logger.debug("Incoming request input stream : " + rawXML); 

     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 

     // turn on this flag in order to resolve manually the namespaces of the document 
     domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 
     doc = builder.parse(new InputSource(new ByteArrayInputStream(rawXML.getBytes("UTF-8")))); 
    } catch (ParserConfigurationException e) { 
     logger.error("Unable to create a new DocumentBuilder"); 
     Throwables.propagate(e); 
    } catch (UnsupportedEncodingException e) { 
     logger.error("Unsupported Encoding: UTF-8"); 
     Throwables.propagate(e); 
    } catch (SAXException e) { 
     logger.error("Error parsing XML"); 
     Throwables.propagate(e); 
    } catch (IOException e) { 
     logger.error("IOException"); 
     Throwables.propagate(e); 
    } 
    return doc; 
    } 
} 
+0

Как определить тип: ExchangeNotification ?? –