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(); }
結果: ログ メディエーターから、パブリッシュされたメッセージは SoapEnvelope のように見えます。ペイロードは XML 形式の MyMessage の base64necoded 応答です。
私のエンドポイント サービスは、オブジェクトとして MyMessage を含む JMS ObjectMessage を返します。すなわち:
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 を含む JMS ObjectMessage (試行 2 & 3) を返す必要がありますか?
- 試行 1 では、デコードされた応答のペイロードに XML のメッセージではなく、シリアル化された Java オブジェクトを表すバイナリ データが表示されることを期待していました。これは有効な期待ですか?
- トピックにパブリッシュする前に、メッセージをシリアル化された Java オブジェクトとしてマークするために (プロキシまたはエンドポイントなどで) 設定する必要がある他のプロパティはありますか?
ありがとうございました。