使用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
答案 0 :(得分:2)
否,属性org.apache.activemq.SERIALIZABLE_PACKAGES
并不能减轻您实施Serializable
的麻烦。默认情况下,代理上的安全设置是阻止ObjectMessage封送/封送。
要允许ObjectMessage序列化,您必须在代理上使用org.apache.activemq.SERIALIZABLE_PACKAGES
和在客户端上使用factory.setTrustedPackages
配置所需的软件包。
无论采用哪种配置,都必须将对象实现为Serializable
。
ObjectMessage对象取决于Java编组/解组对象有效负载的序列化。 通常认为此过程不安全,因为恶意负载可能会利用主机系统。这就是为什么从5.12.2和5.13.0版本开始,ActiveMQ 强制用户将可使用ObjectMessages交换的程序包明确列入白名单。