ActiveMQ属性SERIALIZABLE_PACKAGES发送ObjectMessage

时间:2018-11-06 07:52:08

标签: java apache-camel activemq serializable

使用SpringBoot运行一个简单项目,并通过@Configuration创建ActiveMQ代理。

在Main方法中,在SpringApplication.run之前,我对此进行了设置;

System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES", "*");

在创建代理和ActiveMQConnectionFactory时信任所有软件包;

factory.setTrustAllPackages(true);

路线:

from("timer://getStuffDone?period=5s") //just a test
    .to("bean://superProcessor?method=process")  // new a simple object and puts it as body
    .to("activemq:queue:superQueue?jmsMessageType=Object");

对象:

public class SuperObject {
public String name;}

但是,我明白了:

由以下原因引起:org.apache.camel.NoTypeConversionAvailableException:没有可用的类型转换器将类型:net.supertest.SuperObject转换为所需的类型:java.io.Serializable,在组织上的值为net.supertest.SuperObject@2b38b4cb。 apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:206)〜[camel-core-2.22.1.jar:2.22.1]     在org.apache.camel.component.jms.JmsBinding.createJmsMessageForType(JmsBinding.java:672)〜[camel-jms-2.22.1.jar:2.22.1]

如果我实现了Serializable,它会很好..,但是我希望它能自动处理该问题,就像我在SERIALIZABLE_PACKAGES中使用通配符一样。 关于它为什么无法按预期运行的任何线索? ActiveMQ版本5.15.6

1 个答案:

答案 0 :(得分:2)

否,属性org.apache.activemq.SERIALIZABLE_PACKAGES并不能减轻您实施Serializable的麻烦。默认情况下,代理上的安全设置是阻止ObjectMessage封送/封送。

要允许ObjectMessage序列化,您必须在代理上使用org.apache.activemq.SERIALIZABLE_PACKAGES和在客户端上使用factory.setTrustedPackages配置所需的软件包。

无论采用哪种配置,都必须将对象实现为Serializable

ActiveMQ Docs

  

ObjectMessage对象取决于Java编组/解组对象有效负载的序列化。 通常认为此过程不安全,因为恶意负载可能会利用主机系统。这就是为什么从5.12.2和5.13.0版本开始,ActiveMQ 强制用户将可使用ObjectMessages交换的程序包明确列入白名单