我正在使用一个消息驱动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)â¦