Skip navigation
注意

作成中

このページはESB Muleで以下の技術を統合する簡単の例題を説明します:

  • サブレット
  • JMS (using activeMQ)
  • JavaMail

この例題はとても簡単なMVCパターンを使います。以下のコンポーネントを使います:

  • SenderServlet: このサブレットはリクエストを受信すると、簡単なメッセージをESB Muleエンドポイントに送信します。例題ではJMSキューを使います。
  • MailerComponent: このコンポーネントは情報をログします。メールボックスを監視しているESB Muleのエンドポイントからイベントを受けます。新しいメール・メッセージを受信すると、SenderServletが送信するJMSキューにメッセージを送信します。
  • ReceiverServlet: リクエストを受信する簡単なサブレットです。ESBからメッセージを受信するのにMuleClientを使います。

先ず、必要なコンポーネントのJava部分を見ます。

最初にReceiverServlet。興味深いのは init メソッドと doPost メソッドです。 init メソッドでは後でメッセージを受信するmuleclientを生成します。

/**
 * Servletクラスの実装: ReceiverServlet
 */
 public class ReceiverServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

	private static final long serialVersionUID = 2963863938299247976L;
	private MuleClient m_client = null;
	
	/**
	 * ESB Muleクライアントをセットアップ
	 */
	public void init() throws ServletException {
		try {
			m_client = new MuleClient();
		} catch (UMOException e) {
			throw new ServletException(e);
		}
		super.init();
		
	}
	
	/**
	 * GET HTTPリクエストを処理
	 * 
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, 
         *                                           HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                                                     throws ServletException, IOException {
		doPost(request,response);
	}  	
	
	/**
	 * POST HTTPリクエストを処理
	 * 
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, 
         *                                            HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                                                                      throws ServletException, IOException {
		BufferedWriter writer = null;
		try {
			writer = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
			UMOMessage message = m_client.receive("jms://to.servlet2",1000);
			if (message != null) {
				writer.write(message.getPayloadAsString());
			} else {
				writer.write("--no message waiting in queue--");
			}
		} catch (Exception e) {
			throw new ServletException(e);
		} finally {
			if (writer != null) writer.close();
		}
	}   	  	    
}

それではServletSenderに付いて。こちらもESBと通信するのにMuleClientを利用します。上の同じように init メソッドでMuleClientが生成され、 doPost メソッドで使われます。

/**
 * 簡単なサブレット。起動されると文字列を指定したキューに送信します。
 * この文字列は、受信サブレットが呼ばれると、受信されます。
 */
 public class SenderServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    
	private static final long serialVersionUID = -7557758560225183285L;
	private MuleClient m_client = null;
	
	
	public void init() throws ServletException {
		try {
			m_client = new MuleClient();
		} catch (UMOException e) {
			throw new ServletException(e);
		}
		super.init();
		
	}
	
	/**
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}  	
	
	/**
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			m_client.send("jms://from.servlet1","This is a message @" + System.currentTimeMillis(),null);
		} catch (UMOException e) {
			throw new ServletException(e);
		}
	}   	  	    
}

サブレットがどこにデータを送信するか決めるのでしょうか?次の2行で定義されます:

ReceiverServlet:   UMOMessage message = m_client.receive("jms://to.servlet2",1000);
SenderServlet:	   m_client.send("jms://from.servlet1","This is a message @" + System.currentTimeMillis(),null);

ReceiverServletは jms://to.servlet2 エンドポイントでデータを受信しようとし、SenderServletは jms://from.servlet1 エンドポイントにデータを送信します。 1000 は1秒まで待つことを意味します。この期間内にキューにメッセージが無い場合は、次の処理に移ります。送信部分の null は、メッセージにプロパティ/ヘッダを送らないことを示します。

まで説明していないコンポーネントはMailerComponentです。上で説明したように、これはとても簡単なクラスSimpleLoggerです:

public class SimpleLogger {
	
	public void logMessage(String message) {
		System.out.println("Message '"+ message + "'passed through here @ " 
									  + new Date(System.currentTimeMillis()));

	}
	
	public void logMessage(MimeMessage message) {
		System.out.println("Message '"+ message + "'passed through here @ " 
				  + new Date(System.currentTimeMillis()));
	}
}

最初のメソッドは String メッセージのログ情報を出力します。
これで全てのコンポーネントを作成したので、ESB MuleとSpringFrameworkを使って繋げます。最初に説明したい設定ファイルはデータの 流れ を定義する設定ファイルです。

<?xml version="1.0"?>
<!DOCTYPE mule-configuration PUBLIC "http://mule.codehaus.org/mule-configuration.dtd" "mule-configuration.dtd">
<mule-configuration version="1.0" id="flows">

   <transformers>
	<transformer name="strictMailTransformer" 
                     className="mule.examples.mailintegration.transformers.StrictObjectToJmsTransformer"/>
   </transformers>

    <mule-descriptor name="Logger Servlet to Queue" 
    				 inboundEndpoint="jms://from.servlet1"
    				 outboundEndpoint="jms://to.servlet2"
			         implementation="logger"/>
	
    <mule-descriptor name="Logger Mail to Queue" 
                                inboundEndpoint="pop3://jdirksen:secret@mail.xs4all.nl"
    				outboundEndpoint="jms://to.servlet2?transformers=strictMailTransformer"
				implementation="logger"/>
	
</mule-configuration>

トランスフォーマーに付いては後ほどに説明します。先ず、以下の2つのmule-descriptorに付いて説明します:

Servlet to Queue:

属性 説明
name コンポーネントを識別するための名前です。意味ある名前はデバッグやログの分析を分かりやすくします。
inboundEndpoint jms://from.servlet1、このコンポーネントはJMSキューfrom.servlet1からメッセージを受信します。このキューはSenderServletがメッセージを送信するキューです。
outboundEndpoint jms://to.servlet2、リクエストがServletからキューコンポーネントを介した後に送信されるキューです。
implementation 実際のコンポーネントの実装を指します。完全なclassNameを指定するか、コンテナで処理させることが可能です。この例題ではSpringFrameworkで処理されます。
Adaptavist Theme Builder Powered by Atlassian Confluence