我正在尝试使用 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&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=topic"/>
</endpoint>
</send>
</outSequence>
</target>
<description/>
</proxy>
我试过的:
我的端点服务返回一个实现 Serializable 的自定义 Java 对象,即:
public MyMessage MyService.processMessage( String inMsg ) { return new MyMessage(); }
结果:从 Log Mediator 发布的消息看起来像一个 SoapEnvelope,其中有效负载是 XML 形式的 MyMessage 的 base64necoded 响应。
我的端点服务返回一个 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]
从尝试 2 开始,更改
TopicConnectionFactory
为myTopicConnectionFactory
与 axis2.xml 文件中的特定内容相同。结果:与尝试 2 类似的错误。
我的问题:
- 我的端点服务应该返回 MyMessage(即尝试 1)还是包含 MyMessage(尝试 2 和 3)的 JMS ObjectMessage?
- 对于尝试 1,我希望在解码响应的有效负载中看到表示序列化 Java 对象的二进制数据,而不是 XML 中的消息。这是一个有效的期望吗?
- 为了在发布到主题之前将消息标记为序列化 Java 对象,我是否需要设置任何其他属性(例如在代理或端点中)?
谢谢你。