¿La nueva API del almacén de datos de Google App Engine no parece arrojar tantas excepciones?

Escribí un código contra la API de Java Google App Engine 1.6.4.1, y para que mi código se compilara, tuve que manejar muchas excepciones, como ConcurrentModificationException. Actualicé a 1.6.5, y ahora puedo eliminar la mayoría de mis controladores de excepciones y mi código se compila perfectamente. Que esta pasando?

ACTUALIZACIÓN: ya no se lanzan varias clases de excepciones; Como esto puede haber sucedido por diferentes razones para diferentes excepciones, aquí están las Excepciones que ya no son lanzadas por

  • Argumento de excepción ilegal

  • IllegalStateException

  • DatastoreFailureException

  • ConcurrentModificationException

Aquí hay un ejemplo de alguien que obtiene una IllegalArgumentException en GAE: Google App Engine - "java.lang.IllegalArgumentException: transacción de datos o escritura demasiado grande". ¿Esto ya no puede ocurrir?

La documentación de la Interfaz de transacciones dice que puede obtener cualquiera de los últimos tres al realizar un commit (): https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/ Transacción # commit ()

Lanza

java.lang.IllegalStateException: si la transacción ya se ha confirmado, revertido, hay un compromiso o una reversión en curso (a través de una llamada asíncrona), o un intento de confirmar o revertir ya ha fallado. Si hay alguna llamada pendiente al almacén de datos asíncrono cuando se invoca este método, este método bloqueará la finalización de esas llamadas antes de continuar.

DatastoreFailureException: si se produce un error en el almacén de datos.

java.util.ConcurrentModificationException: si alguna otra transacción modifica los mismos grupos de entidades al mismo tiempo.

Y, sin embargo, ya no estoy obligado a manejarlos para que compile mi código. Esto parece extraño

Respuesta 1

La versión más reciente de Google App Engine hizo necesario establecer la <threadsafe>true</threadsafe>propiedad en appengine-web.xml. Antes de este lanzamiento, esto no era obligatorio.

ConcurrentModificationExceptions ocurren cuando una sola instancia de un objeto en su aplicación está siendo modificada simultáneamente por más de un hilo. Por supuesto, esto puede dar como resultado datos y resultados inconsistentes, y algunas clases arrojarán esta excepción en lugar de devolver datos incorrectos o realizar cambios inconsistentes en su base de datos.

Con la propiedad threadsafe establecida en true, las solicitudes concurrentes ahora están habilitadas.

Usar solicitudes concurrentes

De forma predeterminada, App Engine envía solicitudes en serie a un servidor web determinado. Puede configurar App Engine para enviar múltiples solicitudes en paralelo agregando el elemento a appengine-web.xml:

<threadsafe>true</threadsafe>

Antes de 1.6.5, la directiva threadsafe era opcional, introducida en 1.4.3:

Java applications can enable concurrent request support by setting <threadsafe>
to True in their appengine-web.xml. This flag indicates that request handlers
for your app are thread safe and multiple request handlers may safely run
at the same time in the same memory space for your application.

Si bien esto ahora se requiere, no parece haber ninguna información disponible de inmediato que explique por qué exactamente sus ConcurrentModificationExceptions han desaparecido repentinamente. Si no ha realizado cambios en su código para que sea seguro para subprocesos, como se sugirió en las notas de la versión 1.4.3, existe una gran posibilidad de que esos problemas de seguridad de subprocesos sigan presentes.

Aquí hay más información sobre la versión 1.4.3 de la publicación del blog Announcing App Engine 1.4.3 Release :

Solicitudes concurrentes: hasta ahora, las aplicaciones Java dependían de iniciar instancias adicionales para escalar dinámicamente para niveles de tráfico más altos. Ahora, con soporte para solicitudes concurrentes, cada instancia de aplicación puede atender múltiples solicitudes de usuarios al mismo tiempo. Para comenzar, asegúrese de que el código de su aplicación sea seguro para subprocesos, luego habilite las solicitudes concurrentes agregando la bandera a su appengine-web.xml.

Si las excepciones que ha informado han desaparecido, su código aún puede tener algunos problemas de seguridad de subprocesos. Es posible que no esté viendo estos porque ha aumentado el número de instancias o ha hecho algo más en su aplicación para mitigar las ConcurrentModificationExceptions.

Teniendo en cuenta que 1.6.5 ha sido lanzado por menos de un mes, dudaría mucho en eliminar mis controladores de excepciones de mi código. Después de todo, su trabajo es detectar y manejar los problemas que ocurren, y si los elimina, pierde cualquier degradación elegante que haya tenido antes de su eliminación.

Además, la ausencia de algo, como excepciones, no constituye una prueba de que algo no volverá a aparecer en algún momento desconocido en el futuro.

De los javadocs para ConcurrentModificationException :

Esta excepción puede ser lanzada por métodos que han detectado la modificación concurrente de un objeto cuando dicha modificación no está permitida.

Por ejemplo, generalmente no es permitido que un hilo modifique una Colección mientras otro hilo está iterando sobre ella. En general, los resultados de la iteración no están definidos en estas circunstancias. Algunas implementaciones de Iterator (incluidas las de todas las implementaciones de recopilación proporcionadas por JRE) pueden optar por lanzar esta excepción si se detecta este comportamiento. Los iteradores que hacen esto se conocen como iteradores de falla rápida, ya que fallan rápida y limpiamente, en lugar de arriesgarse a un comportamiento arbitrario y no determinista en un momento indeterminado en el futuro.

Respuesta: 2

Hay algo mal con la sintaxis a continuación: -keepclassmembers class * {public void changeView (android.view.View v); } Error: Esperando separar ',' o cerrar ')' antes de 'v' Sin ver ...

Estoy desarrollando una aplicación que establece su tamaño para ajustarse a los límites de la pantalla (teniendo en cuenta las inserciones de la pantalla). Sin embargo, si las inserciones cambian, por ejemplo, cuando oculto automáticamente mi barra de tareas cuando el ...

Estoy programando una aplicación web java donde algunos campos en jsp requieren caracteres específicos (eliminar diacríticos). Esta tarea no es difícil con javascript y un método de verificación en el lado del servlet pero ...

Me referí a la aplicación de muestra de primavera en netbeans.org e intenté crear una aplicación de inicio de sesión simple. Cuando ejecuto me sale este error: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: ...