3
respostas

JMSException no teste do Consumidor da Fila utilizando o objeto Pedido

Estou utilizando a versão 5.14.3 do activeMQ. Quando implementei a desserialização do objeto Pedido na classe TesteConsumidorFila (vide instrução Pedido pedido = (Pedido) objectMessage.getObject();), recebo a exceção a seguir. Informo ainda que alterei o script env dentro da pasta /bin do activeMQ para que pudesse confiar no pacote br.com.caelum.jms.modelo conforme orientação descrita no link mostrado na exceção

if [ -z "$ACTIVEMQ_OPTS" ]; then ACTIVEMQ_OPTS="-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,br.com.caelum.jms.modelo" else ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,br.com.caelum.jms.modelo" fi

exception

javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class br.com.caelum.jms.modelo.Pedido! 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:208) at br.com.caelum.jms.TesteConsumidorFila$1.onMessage(TesteConsumidorFila.java:37) at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1401) at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131) at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202) at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133) at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: Forbidden class br.com.caelum.jms.modelo.Pedido! 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:112) at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:57) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206) ... 9 more

3 respostas

Oi Fábio,

A partir da versão 5.12.2 o ActiveMQ precisa de uma configuração explicita para permitir a serializacao e deserializacao.

Você deve criar uma ConnectionFactory do ActiveMQ e chamar setTrustAllPackages(true) para permitir a serialização:

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustAllPackages(true);

Há outras formas de configurar isso e peço olhar na documentação:

http://activemq.apache.org/objectmessage.html

Se tiver mais dúvidas, por favor, pergunte aqui.

abs

bom dia!, no caso de MDB consumindo e recebo a mesma exceção no caso eu não é utilizado o

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustAllPackages(true);

e sim

@MessageDriven( /*name ="MDBConsumerActiveMQ",*/ 
        activationConfig = {
            @ActivationConfigProperty(propertyName = "maxMessages", propertyValue = "1"),
            @ActivationConfigProperty(propertyName = "minSession", propertyValue = "100"),
            @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "300"),
            @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "example1-queue"),
            @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
//@ResourceAdapter("activemq-rar.rar")
@ResourceAdapter("activemq-rar.rar")
public class MDBConsumerActiveMQ implements MessageListener {

    @Override
    public void onMessage(final Message message) {
        System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES","*");
        try {
            final ObjectMessage objMen = (ObjectMessage) message;
            if (objMen.getObject() instanceof Pessoa) {
                final Pessoa p = (Pessoa) objMen.getObject();
                System.out.println("consumiu Mensagem -  " + p.toString());
                return;
            }            

        } catch (final Exception ignore) {
            System.out.println(ignore.getMessage());
        }

    }
}

Nesse caso como soluciono esse problema

Oi Wesley,

vc consegue enviar e receber ObjectMessages sem MDB?

abs

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software