ActiveMQ 属性 SERIALIZABLE_PACKAGES 发送 ObjectMessage
ActiveMQ property SERIALIZABLE_PACKAGES sending ObjectMessage
运行一个使用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 在 org.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
不,属性 org.apache.activemq.SERIALIZABLE_PACKAGES
不会减轻您实施 Serializable
的负担。默认情况下阻止 ObjectMessage marshal/unmarshal 只是代理上的安全设置。
要允许 ObjectMessage 序列化,您必须在代理上使用 org.apache.activemq.SERIALIZABLE_PACKAGES
配置所需的包,在客户端上使用 factory.setTrustedPackages
.
无论此配置如何,您都必须将对象实现为 Serializable
。
ObjectMessage objects depend on Java serialization of marshal/unmarshal object payload. This process is generally considered unsafe as malicious payload can exploit the host system. That's why starting with versions 5.12.2 and 5.13.0, ActiveMQ enforces users to explicitly whitelist packages that can be exchanged using ObjectMessages.
运行一个使用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 在 org.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
不,属性 org.apache.activemq.SERIALIZABLE_PACKAGES
不会减轻您实施 Serializable
的负担。默认情况下阻止 ObjectMessage marshal/unmarshal 只是代理上的安全设置。
要允许 ObjectMessage 序列化,您必须在代理上使用 org.apache.activemq.SERIALIZABLE_PACKAGES
配置所需的包,在客户端上使用 factory.setTrustedPackages
.
无论此配置如何,您都必须将对象实现为 Serializable
。
ObjectMessage objects depend on Java serialization of marshal/unmarshal object payload. This process is generally considered unsafe as malicious payload can exploit the host system. That's why starting with versions 5.12.2 and 5.13.0, ActiveMQ enforces users to explicitly whitelist packages that can be exchanged using ObjectMessages.