Serialization 如何在WSO2 ESB上将序列化Java对象发布到JMS主题

Serialization 如何在WSO2 ESB上将序列化Java对象发布到JMS主题,serialization,wso2esb,jms-topic,Serialization,Wso2esb,Jms Topic,我正在尝试使用WSO2 ESB、WSO2 MB和JMS主题设置发布和订阅场景 在发布代理中,我的端点服务将返回一条实现可序列化的Java消息,并且在代理的out序列中,应该将消息发布到JMS主题 以下是我的委托书副本: <?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="MyProxy" transports="https,http"

我正在尝试使用WSO2 ESB、WSO2 MB和JMS主题设置发布和订阅场景

在发布代理中,我的端点服务将返回一条实现可序列化的Java消息,并且在代理的out序列中,应该将消息发布到JMS主题

以下是我的委托书副本:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
   name="MyProxy"
   transports="https,http"
   statistics="disable"
   trace="disable"
   startOnLoad="true">
       <target endpoint="conf:/MyService">
           <inSequence>
               <log level="full"/>
           </inSequence>
           <outSequence>
               <log level="full"/>
               <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
               <send>         
                   <endpoint>
                       <address uri="jms:/MyTopic?transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616&amp;transport.jms.DestinationType=topic"/>
                   </endpoint>
               </send>
           </outSequence>
       </target>
   <description/>
</proxy>
结果:从日志中介中,发布的消息看起来像一个SoapEnvelope,其中有效负载是XML形式的MyMessage的base64necoded响应

My endpoint service返回一个JMS ObjectMessage,其中包含MyMessage作为其对象。i、 e:

public ObjectMessage MyService.processMessage(String inMsg) throws Exception {
    // build myMessage
    MyMessage myMsg = new MyMessage();

    // Build JMS message
    // Obtain a JNDI connection using the jndi.properties file
    String topicFactory = "TopicConnectionFactory"; // is this value correct?
    InitialContext ctx = new InitialContext();
    // Look up a JMS connection factory and create the connection
    TopicConnectionFactory conFactory = 
        (TopicConnectionFactory)ctx.lookup(topicFactory);
    TopicConnection connection = conFactory.createTopicConnection();
    TopicSession pubSession = connection.createTopicSession(
            false, Session.AUTO_ACKNOWLEDGE); 
    ObjectMessage jmsMsg = pubSession.createObjectMessage();
    jmsMsg.setObject( myMsg );

    return jmsMsg;
}
结果:

JMSOutTransportInfo无法使用{java.naming.provider.url=tcp:// localhost:61616,java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory,transport.jms.DestinationType=topic,transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory} javax.naming.NoInitialContextException:无法使用哈希表中指定的工厂创建InitialContext。[根异常为java.lang.ClassNotFoundException:找不到类org.apache.activemq.jndi.ActiveMQInitialContextFactory]

从尝试2开始,将特定于axis2.xml文件的TopicConnectionFactory更改为myTopicConnectionFactory。 结果:与尝试2类似的错误

我的问题是:

我的端点服务应该返回MyMessage,即尝试1还是包含MyMessage尝试2和3的JMS ObjectMessage? 对于尝试1,我希望在解码响应的负载中看到表示序列化Java对象的二进制数据,而不是XML中的消息。这是一个合理的期望吗? 在发布到主题之前,是否需要在代理或端点中设置任何其他属性,以便将消息标记为序列化Java对象?
谢谢。

从日志中可以看出,尽管您提到这是在WSO2 MB上尝试的,但实际上您正在使用ActiveMQ作为JMS提供程序。您是否已确保在axis2.xml中启用了TransportReceiver for MB,如中所示。
public ObjectMessage MyService.processMessage(String inMsg) throws Exception {
    // build myMessage
    MyMessage myMsg = new MyMessage();

    // Build JMS message
    // Obtain a JNDI connection using the jndi.properties file
    String topicFactory = "TopicConnectionFactory"; // is this value correct?
    InitialContext ctx = new InitialContext();
    // Look up a JMS connection factory and create the connection
    TopicConnectionFactory conFactory = 
        (TopicConnectionFactory)ctx.lookup(topicFactory);
    TopicConnection connection = conFactory.createTopicConnection();
    TopicSession pubSession = connection.createTopicSession(
            false, Session.AUTO_ACKNOWLEDGE); 
    ObjectMessage jmsMsg = pubSession.createObjectMessage();
    jmsMsg.setObject( myMsg );

    return jmsMsg;
}