如題所示,最開始使用了默認配置:
<amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://${activemq.ip}:61616" userName="${activemq.username}" password="${activemq.passwd}" />
然後使用ActiveMQ對對象進行序列化時報瞭如下錯誤:
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.html
出現這個問題的原因在於:從ActiveMQ5.12.2 開始,爲了增強這個框架的安全性,ActiveMQ將強制用戶配置可序列化的包名。因此具體的解決方案如下:
按照官方的提示修改“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”參數:
<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”參數,在這行參數後面添加如下的配置:
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,cn.zifangsky.activemq,cn.zifangsky.model
但是經過嘗試我發現並沒有效果,其實僅僅只是修改“ActiveMQ 的連接工廠”那段配置就可以解決這個問題了
最後測試效果如下:
@Test public void testObject(){ User u = new User((long) 1,"test","123456"); queueSender2.send("object.queue", u); }
運行這個方法之後,輸出如下:
接收到消息: User [id=1, username=test, password=123456]
可以發現,問題成功解決了