当前,我有一个将JMS ObjectMessage发送到ActiveMQ目标的应用程序。消息全部来自类base

但是,我需要在某些派生类和基类之间添加一个类,因此类middle扩展了base。现在,所有扩展为middle的消息均无法发送,并出现以下错误:

26 18:53:04.524 [ListenerContainer-1] WARN  - Execution of JMS message listener failed
java.lang.NoClassDefFoundError: com/google/protobuf/ProtocolMessageEnum
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
...

Caused by: java.lang.ClassNotFoundException: com.google.protobuf.ProtocolMessageEnum
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)


不能扩展中间消息的消息现在仍然起作用,只有从middle派生的消息才引起问题。任何帮助表示赞赏。谢谢!

编辑:发送由session.createObjectMessage(msg)处理,其中msgbase类型。

最佳答案

考虑到您正在发送JMS ObjectMessage的事实,在我看来,您的客户端只是在类路径上没有适当的类来反序列化消息。确保客户端在其类路径上具有“中间”类和任何新参数类型。至少他们需要com.google.protobuf.ProtocolMessageEnum(如异常所示)。

出于其价值,由于这个和其他原因,通常避免使用JMS ObjectMessage。发送原始字节缓冲区或一些简单的对象表示(例如XML,JSON等)通常比发送实际的Java对象更为简单。此外,众所周知,Java序列化和反序列化速度很慢,这种模式也可能使您的应用程序面临安全漏洞。

07-24 19:39