關於ActiveMQ序列化對象爆「Forbidden class xxx! ...」問題的解決

如題所示,最開始使用了默認配置:html

<amq:connectionFactory id="amqConnectionFactory"
		brokerURL="tcp://${activemq.ip}:61616" userName="${activemq.username}"
		password="${activemq.passwd}" />

而後使用ActiveMQ對對象進行序列化時報了以下錯誤:java

Caused by: java.lang.ClassNotFoundException: Forbidden class cn.zifangsky.model.User! 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(Unknown Source)
 at java.io.ObjectInputStream.readClassDesc(Unknown Source)
 at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
 at java.io.ObjectInputStream.readObject0(Unknown Source)
 at java.io.ObjectInputStream.readObject(Unknown Source)
 at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206)
 ... 13 more

關於這個錯誤,其實在報錯的提示裏面已經給出了官方的解決方案的地址,即:http://activemq.apache.org/objectmessage.htmlspring

出現這個問題的緣由在於:從ActiveMQ5.12.2 開始,爲了加強這個框架的安全性,ActiveMQ將強制用戶配置可序列化的包名。所以體的解決方案以下:apache

按照官方的提示修改「ActiveMQ 鏈接工廠」的配置:安全

<bean id="amqConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
	<property name="brokerURL" value="tcp://${activemq.ip}:61616"/>
	<property name="userName" value="${activemq.username}" />
	<property name="password" value="${activemq.passwd}" />
	<property name="trustedPackages">
		<list>
			<value>java.lang</value>
			<value>javax.security</value>
			<value>java.util</value>
			<value>org.apache.activemq</value>
			<value>cn.zifangsky.activemq</value>
			<value>cn.zifangsky.model</value>
		</list>
	</property>
</bean>

這裏添加上信任的可序列化的包便可框架

若是不想一個個地添加的話,也能夠使用「trustAllPackages」參數:tcp

<bean id="amqConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
	<property name="brokerURL" value="tcp://${activemq.ip}:61616"/>
	<property name="userName" value="${activemq.username}" />
	<property name="password" value="${activemq.passwd}" />
	<property name="trustAllPackages" value="true"/>
</bean>

注:官方還提示能夠給activemq.bat文件(PS:D:/apache-activemq-5.14.1/bin/activemq.bat)添加信任的包名。也就是修改文件中的「ACTIVEMQ_OPTS」參數,在這行參數後面添加以下的配置:ide

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,cn.zifangsky.activemq,cn.zifangsky.model

可是通過嘗試我發現並無效果,其實僅僅只是修改「ActiveMQ 的鏈接工廠」那段配置就能夠解決這個問題了測試

最後測試效果以下:spa

	@Test
	public void testObject(){
		User u = new User((long) 1,"test","123456");
		
		queueSender2.send("object.queue", u);
	}

運行這個方法以後,輸出以下:

接收到消息: User [id=1, username=test, password=123456]

能夠發現,問題成功解決了

相關文章
相關標籤/搜索