¿Obtienes la siguiente excepción al querer ejecutar tu clase consumidora JMS?
Exception in thread "main" javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker.
Excepción
INFO | Successfully connected to tcp://localhost:61616
Exception in thread "main" javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class java.util.ArrayList! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:213)
at problema03.OConsumer.main(OConsumer.java:50)
Caused by: java.lang.ClassNotFoundException: Forbidden class java.util.ArrayList! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.
at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.checkSecurity(ClassLoadingAwareObjectInputStream.java:115)
at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:56)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2028)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1895)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2202)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477)
at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:211)
... 1 more
Solución
Reemplazar el siguiente código
// Obtiene una conexión JMS del servidor e inicia la comunicación.
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
por:
// Obtiene una conexión JMS del servidor e inicia la comunicación.
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
connectionFactory.setTrustAllPackages(true);
Connection connection = connectionFactory.createConnection();
connection.start();
Explicación
Como puede ver “connectionFactory connectionFactory = new ActiveMQConnectionFactory(url);” lo hemosreemplazado por “ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);”
Si lo ejecutamos con el código anterior, al ejecutar nuestra clase Consumer, vamos a obtener la siguiente excepción: “JMSException: Failed to build body from content. Serializable class not available to broker.”. Esto es debido a que la últimas versiones ActiveMQ no permite la transmisión de objetos serializados. Ahora, ActiveMQ obliga al usuario a incluir el paquete en la lista blanca por razones de seguridad. Esto se soluciona incluyendo la propiedad TrustPackages con el nombre del paquete.
El método setTrustedPackages() le permite establecer la lista de paquetes confiables que desea eliminar en serie, como
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustedPackages(new ArrayList(Arrays.asList("org.apache.activemq.test,org.apache.camel.test".split(","))));
El método setTrustAllPackages() permite desactivar el control de seguridad y confiar en todas las clases. Es útil para realizar pruebas
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustAllPackages(true);
Revise el siguiente enlace: http://activemq.apache.org/objectmessage.html
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!