Py学习  »  MQ

EJB3 MessageDrivenBean引发异常当使用外部ActiveMQ队列时,不信任将此类序列化为objectMessage负载

Leandro Ferreira • 4 年前 • 1053 次点击  

我正在使用一个消息驱动bean @MessageDriven 要在DOCKER容器中消耗外部ActueMQ队列,并且在ObjtMeSQL有效载荷上需要使用Java POJO( ArquivoRetornoDTO )

因此,当调用onMessage方法时引发以下异常:

ClassNotFoundException: Forbidden class foo.bar.ArquivoRetornoDTO! 
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.

在文档中 http://activemq.apache.org/objectmessage.html ,下面是一个示例:

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

但在我的代码中,我使用了如下消息驱动bean:

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destination", propertyValue = PreloadArquivoRetornoItemSinteticoQueue.JNDI_QUEUE),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")})
@ResourceAdapter("activemq-rar")
public class PreloadArquivoRetornoItemSinteticoQueue implements MessageListener {

    public static final String JNDI_QUEUE = "java:/jms/preloadArquivoRetornoItemSinteticoQueue";

    @Override
        public void onMessage(final Message message) {
            final ObjectMessage objectMessage = (ObjectMessage) message;

            final ArquivoRetornoDTO arquivoRetornoDTO = (ArquivoRetornoDTO) objectMessage.getObject();
        }
}

我已经为生产者完成了文档中建议的配置,但是我不知道如何为消费者完成,因为我不使用activemq连接工厂,而是使用消息驱动bean。

对于生产者,我在docker实例的环境变量中添加了以下内容:

JAVA_OPTS: "-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*"

可以发送消息,但不能接收。那么,我可以在哪里定义消息驱动 setTrustAllPackages=true ?

环境:

  • Wildfly 15.0.1决赛
  • ActiveMQ 5.15.8版

standalone-full.xml中的资源适配器:

        <subsystem xmlns="urn:jboss:domain:resource-adapters:5.0">
            <resource-adapters>
                <resource-adapter id="activemq-rar">
                    <archive>activemq-rar-5.15.8.rar</archive>
                    <transaction-support>XATransaction</transaction-support>
                    <config-property name="UseInboundSession">false</config-property>
                    <config-property name="Password">activemqadmin</config-property>
                    <config-property name="UserName">activemqadmin</config-property>
                    <config-property name="ServerUrl">tcp://activemq:61616</config-property>
                    <connection-definitions>
                        <connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/jms/odinConnectionFactory" enabled="true" pool-name="ConnectionFactory">
                            <xa-pool>
                                <min-pool-size>1</min-pool-size>
                                <max-pool-size>20</max-pool-size>
                                <prefill>false</prefill>
                                <is-same-rm-override>false</is-same-rm-override>
                            </xa-pool>
                        </connection-definition>
                    </connection-definitions>
                    <admin-objects>
                        <admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/jms/preloadArquivoRetornoItemSinteticoQueue" use-java-context="true" pool-name="PreloadArquivoRetornoItemSinteticoQueue">
                            <config-property name="PhysicalName">jms/preloadArquivoRetornoItemSinteticoQueue</config-property>
                        </admin-object>
                    </admin-objects>
                </resource-adapter>
            </resource-adapters>
        </subsystem>

例外:

java.lang.ClassNotFoundException: Forbidden class
foo.bar.ArquivoRetornoDTO! 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:1868)    at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)    at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)    at
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)    at
java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)    at
org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:211)
[wrapped] javax.jms.JMSException: Failed to build body from content. 
Serializable class not available to broker. Reason:
java.lang.ClassNotFoundException: Forbidden class
foo.bar.ArquivoRetornoDTO! 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
foo.bar.PreloadArquivoRetornoItemSinteticoQueue.onMessage(PreloadArquivoRetornoItemSinteticoQueue.java:61)    at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)…
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/44024
 
1053 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Leandro Ferreira
Reply   •   1 楼
Leandro Ferreira    5 年前

经过两天的艰苦工作,我在一个单实例中设置了一个系统属性,从而解决了这个问题:

@Singleton
@Startup
public class InicializadorCargaDadosIniciais implements Serializable {

@PostConstruct
    public void create() {

        System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES", "*");
        System.setProperty("org.apache.activemq.artemis.jms.deserialization.whitelist", "*");
}
}