 | 注意
作成中 |
このページは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:,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:,"This is a message @" + System.currentTimeMillis(),null);
} catch (UMOException e) {
throw new ServletException(e);
}
}
}
サブレットがどこにデータを送信するか決めるのでしょうか?次の2行で定義されます:
ReceiverServlet: UMOMessage message = m_client.receive("jms:,1000);
SenderServlet: m_client.send("jms:,"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で処理されます。 |