Invierta el ajax usando DeferredResult of Spring 3.2.0.RELEASE. No funciona en IE

Estoy tratando de crear una demostración de chat en grupo usando Ajax inverso en Spring. Estoy usando la versión Spring 3.2.0.RELEASE.

Estoy usando DeferredResult para realizar ajax inverso en mi controlador. A continuación se muestra el fragmento de mi clase de controlador.

@Autowired private AsyncRepository asyncRepository; Map<Integer, List<DeferredResult>> watchers = new ConcurrentHashMap<Integer, List<DeferredResult>>(); @RequestMapping(value="/asyncRequest/getMessages/{id}", method=RequestMethod.GET) @ResponseBody public DeferredResult getMessages(final @PathVariable("id") Integer id){ final DeferredResult deferredResult = new DeferredResult(null, Collections.emptyList()); if(watchers.containsKey(id)) { watchers.get(id).add(deferredResult); } else { watchers.put(id, new ArrayList<DeferredResult>()); watchers.get(id).add(deferredResult); } deferredResult.onCompletion(new Runnable() { @Override public void run() { watchers.get(id).remove(deferredResult); } }); return deferredResult; } @RequestMapping(value="/asyncRequest/setMessages/{id}/{message}", method=RequestMethod.GET) @ResponseBody public String setMessage(@PathVariable("id") Integer id, @PathVariable("message") String message) { asyncRepository.setMessage(id, message); return ""; } @Scheduled(fixedRate=1000) public void processQueues() { for (Map.Entry<Integer, Queue> entry : asyncRepository.getAsyncBeans().entrySet()) { while(entry != null && entry.getValue() != null && !entry.getValue().isEmpty()) { AsyncDataBean asyncDataBean = entry.getValue().poll(); for (DeferredResult deferredResult : watchers.get(asyncDataBean.getId())) { deferredResult.setResult(asyncDataBean.getMessage()); } } } } 

Y a continuación se encuentra la clase Repository que contiene el Map of GroupID y su messageQueue relevante. Y también tiene las funciones para obtener y configurar los mensajes para la identificación del grupo relevante.

 @Repository public class AsyncRepository { private Map<Integer, Queue> asyncBeans = new ConcurrentHashMap<Integer, Queue>(); public String getMessages(Integer id) { StringBuilder stringBuilder = new StringBuilder(); while (asyncBeans.get(id) != null && !asyncBeans.get(id).isEmpty()) { stringBuilder.append(asyncBeans.get(id).poll().getMessage()).append("~"); } return stringBuilder.toString(); } public void setMessage(Integer id, String message) { if(asyncBeans.containsKey(id)) { asyncBeans.get(id).add(new AsyncDataBean(id, message)); } else { Queue messageQueue = new ConcurrentLinkedQueue(); messageQueue.add(new AsyncDataBean(id, message)); asyncBeans.put(id, messageQueue); } } public Map<Integer, Queue> getAsyncBeans() { return asyncBeans; } public void setAsyncBeans(Map<Integer, Queue> asyncBeans) { this.asyncBeans = asyncBeans; } } 

Y debajo está el bean de datos que estoy usando para almacenar cada mensaje con su id de grupo.

 public class AsyncDataBean { private Integer id; private String message; public AsyncDataBean() { } public AsyncDataBean(int id, String message) { this.setId(id); this.setMessage(message); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 

Y luego viene la página jsp para chat de grupo. que se ve a continuación.

  var messagesWaiting = false; function getMessages(){ if(!messagesWaiting){ $.ajax({ url: "${pageContext.servletContext.contextPath}/asyncRequest/getMessages/${id}", dataType:"text", success: function(data,textStatus,jqXHR) { if(textStatus == 'success'){ messagesWaiting = false; var arr = data.split("~"); for(var i=0; i<arr.length; i++) { try { if(arr[i] != '') { $("#txtaMessages").val($("#txtaMessages").val() + "\n\n" + arr[i]); document.getElementById("txtaMessages").scrollTop = document.getElementById("txtaMessages").scrollHeight; } } catch(e){ alert(e.message); } } } }, complete: function(j) { }, error: function(xhr) { } }); messagesWaiting = true; } } setInterval(getMessages, 1000); getMessages(); function sendMessage() { var xmlhttp1 = new XMLHttpRequest(); xmlhttp1.open("GET", '${pageContext.servletContext.contextPath}/asyncRequest/setMessages/${id}/' + $("#txtMessage").val(), true); xmlhttp1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp1.send(); $("#txtMessage").val(""); $("#txtMessage").focus(); }    

Hello World!

Messages ::
Send Message ::

Eso es lo que he codificado hasta ahora para que esto funcione. Y todo está funcionando bien en FF y Chrome. Pero en IE no está funcionando como se esperaba. La solicitud nunca se retiene en el servidor y siempre se ejecuta cada segundo como se configura en el código javascript. Y siempre devuelve el mismo resultado que el anterior. He intentado usar varios otros métodos para enviar una solicitud ajax para IE pero no funciona. ¿Alguien puede hacer que funcione para mí?

Como todo funciona bien en FF y Chrome, sospecho que el problema es con el código javascript para enviar la solicitud para recibir mensajes.

Por favor, ayúdame.

Gracias por adelantado.

Esto es muy frustrante.

Para que esto funcione correctamente en IE, necesito configurar cache:false atributo cache:false en la solicitud ajax que estoy creando con jquery para getMessages. De lo contrario, IE no retendrá la solicitud en estado pendiente y siempre regresará con el texto de respuesta anterior.

Es un problema muy grande con IE. Espero que nadie vuelva a enfrentar el problema o encuentre esta respuesta lo antes posible.

🙂