Serialization 如何在WSO2 ESB上将序列化Java对象发布到JMS主题
我正在尝试使用WSO2 ESB、WSO2 MB和JMS主题设置发布和订阅场景 在发布代理中,我的端点服务将返回一条实现可序列化的Java消息,并且在代理的out序列中,应该将消息发布到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"
<?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>
结果:从日志中介中,发布的消息看起来像一个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;
}