1

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

在发布代理中,我的端点服务将返回实现 Serializable 的 Java 消息,并且在代理的输出序列中,应该将消息发布到 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>

我试过的:

  1. 我的端点服务返回一个实现 Serializable 的自定义 Java 对象,即:

    public MyMessage MyService.processMessage( String inMsg ) {
        return new MyMessage();
    }
    

    结果:从 Log Mediator 发布的消息看起来像一个 SoapEnvelope,其中有效负载是 XML 形式的 MyMessage 的 base64necoded 响应。

  2. 我的端点服务返回一个 JMS ObjectMessage,其中包含 MyMessage 作为其对象。IE:

    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: class org.apache.activemq.jndi.ActiveMQInitialContextFactory not found]

  3. 从尝试 2 开始,更改TopicConnectionFactorymyTopicConnectionFactory与 axis2.xml 文件中的特定内容相同。结果:与尝试 2 类似的错误。

我的问题:

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

谢谢你。

4

0 回答 0