|
注意 : | MQSeries コントロールは、WebLogic Integration の使用許諾を受けた場合にのみ、BEA Workshop for WebLogic Platform で使用できます。 |
MQSeries は、複数のプラットフォームで動作する IBM のミドルウェア製品です。MQSeries を使用すると、アプリケーション間でメッセージを転送できます。送信側アプリケーションはメッセージをキューに入れ、受信側アプリケーションはキューからメッセージを取得します。送信側アプリケーションと受信側アプリケーションが同じプラットフォーム上にある必要はありません。また、送信側アプリケーションと受信側アプリケーションは別々の時刻に実行できます。送り先キューにメッセージが確実に配信されるようにするために必要なストレージ、ログ、および通信の詳細は、すべて MQSeries によって管理されます。
BEA WebLogic Integration と共に MQSeries コントロールおよびイベント ジェネレータを使用しても、「ダイナミック ライブラリ」 を含む MQSeries コントロールを使用する権限が付与されるわけではありません。MQSeries コントロールおよびイベント ジェネレータのユーザがこのような IBM 製品を使用するためには、有効なライセンスを IBM から取得する必要があります。
MQSeries コントロールを使用すると、WebLogic Integration ビジネス プロセスで MQSeries キューを使用してメッセージを送受信できます。MQSeries コントロールを使用して、バイナリ、XML、および文字列のメッセージを送受信できます。MQSeries コントロールをコンフィグレーションするときに、MQSeries コントロールのプロパティを指定できます。また、実行時に動的に指定することも可能です。MQSeries のビジネス オペレーションに対するトランザクション境界を設定することもできます。
MQSeries コントロールは WebLogic Integration で提供される他のコントロールを補完するものであり、他の WebLogic Integration ビジネス プロセスと一緒に使用できます。ビジネス プロセスにコントロール インスタンスを追加する方法については「ビジネス プロセスでコントロールを使用する」を参照してください。
MQSeries イベント ジェネレータを使用すると、特定の MQSeries キューをポーリングして、メッセージを受信したかどうかを確認できます。詳細については、「MQSeries イベント ジェネレータを使用する」を参照してください。
MQSeries コントロールを BEA Workshop for WebLogic Platform に追加する前に、以下のタスクを完了しておく必要があります。
com.ibm.mq.jar
ファイルを、システムの CLASSPATH 環境変数に追加します。apacheLog4jCfg.xml
ファイルに以下のコードを追加して、MQSeries コントロールのロギングを有効にします。
<category name="com.bea.control.MQControl">
<!-- 注意 : WLI の開発ライセンスがない場合はこの優先順位レベルを変更しないこと -->
<!-- デバッグレベルのログ情報は、障害の原因を突き止めるための唯一の手段となることが多い-->
<priority value="warn"/>
<appender-ref ref="SYSLOGFILE"/>
<appender-ref ref="SYSERRORLOGFILE" />
</category>
MQSeries コントロールはメッセージのロギングに Workshop のデバッガを使用します。
注意 : | ログ レベルを変更する方法については、コントロールのドキュメントを参照してください。 |
com.ibm.mq.jar
ファイルを、MQSeries コントロールが使用されるアプリケーションのライブラリ フォルダにインポートします。
これで、新しい MQSeries コントロールを追加してメッセージを送受信できるようになりました。
新しい MQSeries コントロールのインスタンスを作成およびコンフィグレーションしてビジネス プロセスに追加できます。ここでは以下について説明します。
WebLogic Integration に新しい MQSeries コントロールを追加するには、以下の手順を実行します。
注意 : | [データ パレット] ビューが BEA Workshop for WebLogic Platform に表示されない場合は、メニュー バーから [ウィンドウビューの表示データ パレット] をクリックします。 |
注意 : | 初めてコントロール ファイルを作成する場合は、[MQ Series jar ファイルを検索します。] ダイアログ ボックスが表示されます。MQSeries のインストール先にある com.ibm.mq.jar ファイルを検索して、[開く] をクリックします。 |
MQSeries コントロールの接続の設定を指定するには、以下のタスクを実行します。
MQSeries コントロールの TCP/IP の設定を指定するには、[接続] タブで、以下のタスクを実行します。
注意 : | TCP/IP 設定は、TCP 接続タイプを設定した場合にのみ指定してください。 |
注意 : | [TCP 設定の接続] タブは、TCP 接続モードを選択した場合にのみ有効になります。 |
警告 : | コントロールに対して SSL オプションを選択した場合は、[テスト接続] ボタンをクリックしないでください。ボタンをクリックすると、接続に失敗します。 |
MQ 認可のユーザ名とパスワードを指定するには、以下のタスクを実行します。
MQSeries コントロールの出口を指定するには、以下を実行します。
詳細については、「MQSeries コントロールの出口の実装を使用する」を参照してください。
注意 : | [出口] タブは、TCP 接続モードを選択した場合にのみ有効になります。このタブのフィールドは必須ではありません。 |
MQSeries コントロールの新しいインスタンスを作成すると、プロジェクト内に新しいコントロール ファイルが作成されます。以下は、MQSeries コントロールのコントロール ファイルの例です。
package processes;
import com.bea.jpd.ProcessDefinition;
import com.bea.jpd.JpdContext;
import org.apache.beehive.controls.api.bean.Control;
@com.bea.wli.jpd.Process(process =
"<process name=\"Process\">" +
" <clientRequest name=\"Client Request\" method=\"clientRequest\"/>" +
"</process>")
public class Process implements ProcessDefinition {
@com.bea.wli.jpd.Context
JpdContext context;
static final long serialVersionUID = 1;
@Control
private ServiceBrokerCntrl ServiceBrokerControl;
@Control
private MQSeriesCntrl MQControl;
public void clientRequest() {
//#START: CODE GENERATED - PROTECTED SECTION - このメソッドのこのコメントより前であれば、安全にコードを追加できる。#//
// トランスフォームを入力する
// パラメータの割り当て
//#END : CODE GENERATED - PROTECTED SECTION - このメソッドのこのコメントより後であれば、安全にコードを追加できる。#//
}
}
MQSeries コントロール ファイルの内容は、[Insert Control: MQSeries Control] ダイアログ ボックスで選択した設定によって異なります。上記の例は、TCP 接続タイプを選択して一方向 SSL を使用するように設定した場合に生成されたものです。
MQSeries コントロールを使用すると、独自の送信出口、受信出口、およびセキュリティ出口を作成できます
出口を実装するには、適切なインタフェースを実装する新しい Java クラスを定義する必要があります。WebSphere MQ パッケージでは 3 つの出口インタフェースが定義されています。
MQSeries MQSendExit インタフェースを使用すると、WebSphere MQ Client for Java によってキュー マネージャに送信されるデータを検証および変更できます。
MQSeries MQReceiveExit インタフェースを使用すると、WebSphere MQ Client for Java によってキュー マネージャから受信されるデータを検証および変更できます。
MQSeries MQSecurityExit インタフェースを使用すると、キュー マネージャへの接続についてのセキュリティ設定をカスタマイズできます。
注意 : | ユーザ出口は TCP 接続でのみサポートされます。バインディング接続ではサポートされません。 |
注意 : | ユーザ出口は、MQSeries キュー マネージャと MQSeries クライアント アプリケーションとの間で転送されるデータを変更するために使用します。このデータは MQSeries ヘッダの形式であり、キューに入れたりキューから受信される実際のメッセージの内容は含まれていません。 |
com.ibm.mq.MQSendExit
、com.ibm.mq.MQReceiveExit
、および com.ibm.mq.MQSecurity
インタフェースを実装する Java クラスを作成します。以下にその例を示します。
package com.bea.UserExit;
import com.ibm.mq.*;
public class MQUserExit implements MQSendExit, MQReceiveExit, MQSecurityExit {
public MQUserExit()
{
}
public byte[] sendExit(MQChannelExit channelExit,MQChannelDefinition channelDefnition,byte[] agentBuffer)
{
return agentBuffer;
}
public byte[] receiveExit(MQChannelExit channelExit,MQChannelDefinition channelDefnition,byte[] agentBuffer)
{
return agentBuffer;
}
public byte[] securityExit(MQChannelExit channelExit,MQChannelDefinition channelDefnition,byte[] agentBuffer)
{
return agentBuffer;
}
}
これらのインタフェースは、必要に応じて、1 つのクラスに実装することも、別々のクラスに実装することもできます。
MQSendExit の場合、agentBuffer
パラメータには送信するデータが保持されます。MQReceiveExit または MQSecurityExit の場合、agentBuffer
パラメータには受信したデータが保持されます。
MQSendExit と MQSecurityExit の場合、出口のコードでは、サーバに送信するバイト配列を返す必要があります。受信出口の場合、出口のコードでは、WebSphere MQ Client for Java に解釈させる変更済みデータを返す必要があります。
setDomainEnv.cmd
ファイルを直接編集して、CLASSPATH に Jar ファイル名を追加します。これを行うには、setDomainEnv.cmd
ファイルで以下のコードを見つけます。
Jar ファイル名を含むコードを CLASSPATH に追加する前に、Jar ファイルが格納されているディレクトリを以下のように定義できます。
MQSeries コントロールでは、2 つのトランザクション管理モードがサポートされます。どちらのモードも、基底の MQSeries の syncpoint 機能を使用します。以下の 2 つのトランザクション管理モードがあります。
デフォルトでは、暗黙的なトランザクション管理が選択されています。このモードが有効になっている場合、MQSeries コントロールは MQSeries の Get 関数または Put 関数ごとにトランザクションを処理します。以下の図は、暗黙的なトランザクションが MQSeries コントロールでどのように処理されるのかを示したものです。
暗黙的なトランザクション管理を使用すると、トランザクション ユニットの一部として複数の Get 関数と Put 関数を一緒にグループ化することができなくなります。それぞれの Get 関数と Put 関数がトランザクション境界内で個別に処理されます。
MQSeries コントロールをコンフィグレーションするときに暗黙的なトランザクション管理を使用しない場合には、明示的なトランザクション管理が有効になります。明示的なトランザクション モードでは、MQSeries コントロール関数の Begin および Commit (または Rollback) を使用して、トランザクション境界を明示的に設定する必要があります。
以下の図は、明示的なトランザクション管理を使用してワークフローを作成するプロセスを示したものです。
メッセージ記述子は、送信または受信されるメッセージのプロパティを表す属性です。メッセージのプロパティには、メッセージのタイプ、メッセージ ID、メッセージの優先順位などがあります。MQSeries コントロールでサポートされるすべてのメッセージ記述子の詳細なリストについては、「表 10-1 MQMDHeaders XML ドキュメントの要素」を参照してください。
MQSeries コントロールを使用すると、putMessage
関数を使用してメッセージを送信するときに各メッセージのメッセージ記述子を設定できます。キューから取リ出すメッセージのメッセージ記述子を取得することもできます。この機能は、putMessage
関数および getMessage
関数への入力として提供される MQMDHeaders ドキュメントを利用してサポートされます。MQMDHeaders ドキュメントは XMLBean を使用して表現され、MQSchemas.jar ファイルに格納されている MQMDHeaders スキーマに準拠します。
MQMDHeaders XML ドキュメントの以下の要素を MQMD パラメータの一部として設定できます。
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.bea.com/wli/control/MQMDHeaders"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.bea.com/wli/control/MQMDHeaders" elementFormDefault="qualified">
<xs:element name="MQMDHeaders">
<xs:complexType>
<xs:sequence>
<xs:element name="MessageType" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="MessageId" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="CorrelationId" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="GroupMessage" minOccurs="0" maxOccurs="1"> <xs:complexType>
<xs:sequence>
<xs:element name="GroupId" type="xs:string" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="waitForAllMsgs" type="xs:boolean" use="optional"/>
<xs:attribute name="logicalOrder" type="xs:boolean" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="Priority" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Format" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="CharacterSet" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="Persistence" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Segmentation" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Expiry" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="UserId" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="MessageSequenceNumber" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="GroupOptions" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="IsLastMessage" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReportOptions" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="COA" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="COD" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Exception" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="Expiration" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Feedback" type="xs:int" minOccurs="0" maxOccurs="1"/> <xs:element name="ReplyToQueueName" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ReplyToQueueManager" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="WaitInterval" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ApplicationIdData" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ApplicationOriginData" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="PutApplType" type="xs:int" minOccurs="0" maxOccurs="1"/>
<xs:element name="PutApplName" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="PutDateTime" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="AccountingToken" type="xs:base64Binary" minOccurs="0" maxOccurs="1"/>
<xs:element name="Version" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="MessageConsumption" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="MQGMO_CONVERT" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下のサンプル MQMDHeaders ドキュメントには、MQSeries コントロールを使用して設定できるほとんどのメッセージ記述子が含まれています。
<?xml version="1.0"?>
<even:MQMDHeaders xmlns:even="http://www.bea.com/wli/control/MQMDHeaders">
<even:MessageType>8</even:MessageType>
<even:MessageId>1111</even:MessageId> <even:CorrelationId>2222</even:CorrelationId>
<even:GroupMessage>
<even:GroupId>3333</even:GroupId>
</even:GroupMessage>
<even:Priority>9</even:Priority>
<even:Format>MQSTR</even:Format> <even:CharacterSet>819</even:CharacterSet> <even:Persistence>1</even:Persistence> <even:Segmentation>1</even:Segmentation>
<even:Expiry>5000</even:Expiry>
<even:UserId>WebLogic</even:UserId> <even:MessageSequenceNumber>1</even:MessageSequenceNumber> <even:GroupOptions>
<even:IsLastMessage>true</even:IsLastMessage>
</even:GroupOptions>
<even:ReportOptions>
<even:COA>COAWithFullData</even:COA>
<even:COD>CODWithFullData</even:COD>
<even:Exception>ExceptionWithFullData</even:Exception>
<even:Expiration>ExpirationWithFullData</even:Expiration> </even:ReportOptions>
<even:Feedback>1</even:Feedback>
<even:ReplyToQueueName>trial</even:ReplyToQueueName> <even:ReplyToQueueManager>QM_itpl_025051</even:ReplyToQueueManager> <even:ApplicationIdData>App_ID_025051</even:ApplicationIdData> <even:ApplicationOriginData>Windows_app_025051</even:ApplicationOriginData> <even:PutApplType>1</even:PutApplType> <even:PutApplName>MQSeriesClient</even:PutApplName> <even:Version>2</even:Version>
</even:MQMDHeaders>
XML Beans を使用すると、MQSeries コントロールの MQMDHeaders ドキュメント要素の値をプログラムで設定したり、戻り値をプログラムで取得したりできます。以下は、putMessage
関数を呼び出す前に MQMDHeader 要素の値を設定する例です。
headers = com.bea.wli.control.mqmdHeaders.MQMDHeadersDocument.Factory.newInstance();com.bea.wli.control.mqmdHeaders.MQMDHeadersDocument.MQMDHeaders header = headers.addNewMQMDHeaders();
header.setMessageType(MQC.MQMT_DATAGRAM);
header.setPriority(8);
header.setExpiry(5000);
header.setPersistence(MQC.MQPER_PERSISTENT);
header.getReportOptions().setCOA("COA"); header.setReplyToQueueName("ReportQueue"); header.setApplicationIdData("Testing"); header.setApplicationOriginData("AAAA");
header.setPutApplName("Websphere MQ 2"); header.setPutApplType(MQC.MQAT_JAVA);
MQSeries コントロールを使用し、Put 関数と Get 関数を使用して、メッセージを送受信できます。バイト、文字列、または XML 形式のメッセージを送受信できます。
メッセージを送信するには、送信するメッセージのデータ型に基づいて putMessage
関数を選択します。
MQMDHeadersDocument putMessageAsBytes (byte[] message, java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
MQMDHeadersDocument putMessageAsString (String message, java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
MQMDHeadersDocument putMessageAsXml (XmlObject message, java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
関数に渡される最初のパラメータは、キューに入れられるメッセージです。このパラメータで指定できる型は、バイナリ メッセージを送信する場合は byte[]、XML メッセージの場合は XmlObject、プレーン テキスト メッセージの場合は String です。
関数に渡される 2 番目のパラメータは、そのメッセージの送信先とするキューです。実行時に値が指定されていない場合、つまり値が null の場合は、コントロール プロパティで指定されたデフォルトのキュー名が使用されます。
関数に渡される 3 番目のパラメータは、実行時に XML ドキュメントとして提供される MQMDHeadersDocument を表す XML Bean です。このドキュメントは MQMDHeaders スキーマに準拠します。このドキュメントで指定された値は、送信されるメッセージの MQMD 属性の設定に使用されます。MQMDHeadersDocument パラメータが指定されていない場合、またはパラメータが null の場合は、メッセージ記述子のデフォルト値が設定されてメッセージがキューに入れられます。
関数の戻り値は、キューに送信されるメッセージの MQMD 属性を表す MQMDHeadersDocument です。
以下の手順は、ビジネス プロセスに MQSeries コントロールの putMessage
関数を追加する方法について示したものです。
putMessage
関数の入力 MQMDHeaders ドキュメントを表します。putMessage
関数のキュー名を表します。putMessage
関数のメッセージになります。putMessageAsString
関数をビジネス プロセスまでドラッグし、クライアント要求ノードのすぐ下にドロップします。putMessageAsString
関数ノードの [データの送信] タブを開きます。[割り当てる変数を選択します] ドロップダウン リストから、クライアント要求ノードの [データの受信] タブで作成した変数を、[コントロールが予期する値] に表示されている putMessageAsString
関数の対応するパラメータに割り当てます。putMessageAsString
関数ノードの [データの受信] タブを開きます。[割り当てる変数を選択します] ドロップダウン リストから、putMessageAsString
関数の出力を格納する新しい変数を作成します。これは、送信されたメッセージの属性を表す MQMDHeaders ドキュメントです。
putMessageAsBytes
関数または putMessageAsXml
関数を使用してメッセージを送信する場合も、同様の手順で行います。
MQSeries コントロールを使用して、リモート キュー マネージャが管理するリモート キューにメッセージを追加できます。これを行うには、MQSeries コントロールの接続先のキュー マネージャに転送キューをコンフィグレーションする必要があります。転送キューのコンフィグレーション方法については、http://www.IBM.com にある MQSeries のドキュメントを参照してください。
リモート キュー マネージャによって管理されるリモート キューにメッセージを追加するには、ワークフローで putMessage を呼び出す前に、以下の関数をドラッグ アンド ドロップする必要があります。
void setRemoteQueueManager(java.lang.String remoteQueueManager);
この関数のパラメータは、リモート キュー マネージャの名前です。このパラメータの値を設定するには、デザイン ビューで remoteQueueManager
ノードを開きます。[データの送信] タブで、文字列変数を選択または作成し、デフォルト値としてリモート キュー マネージャの名前を入力します。
リモート キュー マネージャをコンフィグレーションすると、setRemoteQueueManager
関数の後の putMessage 関数によって、メッセージがリモート キュー マネージャに入れられます。
コントロールの接続先のデフォルト (ローカル) キュー マネージャに戻す場合は、デザイン ビューで、setRemoteQueueManager
をもう一度ワークフロー内にドラッグ アンド ドロップする必要があります。このときに、デフォルト値の null がこの関数のパラメータとして渡されます。この null 値または空の文字列によって、デフォルト キュー マネージャに制御が戻され、メッセージは自動的にローカル キューに追加されるようになります。
メッセージを受信するには、受信するメッセージのデータ型に基づいて get Message
関数を選択します。
byte[] getMessageAsBytes(java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
String getMessageAsString(java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
XmlObject getMessageAsXml(java.lang.String queue, MQMDHeadersDocument mqmd) throws ResourceException;
関数の最初のパラメータ java.lang.String queue
は、メッセージの受信元となるキューの名前です。実行時に値が指定されていない場合、つまり値が null の場合は、コントロール プロパティで指定されたデフォルトのキュー名が使用されます。
関数の 2 番目のパラメータ MQMDHeadersDocument
は XML Bean です。これは実行時に XML ドキュメントとして提供された MQMDHeadersDocument を表し、MQMDHeaders スキーマに準拠しています。このドキュメントで指定された値は、ドキュメントで指定された MQMD 属性に対応するメッセージを取得するために使用されます。MQMDHeadersDocument パラメータが指定されていない場合、またはパラメータが null の場合は、キューに入っている最初のメッセージが取得されます。MQMDHeadersDocument パラメータが null でない場合、キューから取得したメッセージの MQMD 属性は、この XML Bean オブジェクトで更新されます。
注意 : | getMessage 関数の MQMDHeadersDocument パラメータが null の場合は、ワークフローで getMessage 関数の後に getMQMDHeaders 関数を使用して、キューから取得したメッセージの MQMD 属性を取得する必要があります。また、getMessage 関数の MQMDHeadersDocument パラメータが null の場合は、デフォルトの MessageConsumption オプションとして Delete が使用されます。 |
関数の戻り値はキューから取得されたメッセージです。メッセージのデータ型は、追加された getMessage
関数によって異なります。取得されたメッセージがバイナリ メッセージとして処理される場合は byte[]、XML の場合は XmlObject、プレーン テキストの場合は String になります。
以下の手順は、ビジネス プロセスに MQSeries コントロールの getMessage
関数を追加する方法について示したものです。
getMessage
関数の入力 MQMDHeaders ドキュメントを表します。getMessage
関数のキュー名を表します。getMessageAsString
関数をビジネス プロセスまでドラッグし、クライアント要求ノードのすぐ下にドロップします。getMessageAsString
関数ノードの [データの送信] タブを開きます。[割り当てる変数を選択します] ドロップダウン リストから、クライアント要求ノードの [データの受信] タブで作成した変数を、[コントロールが予期する値] に表示されている getMessageAsString
関数の対応するパラメータに割り当てます。getMessageAsString
関数ノードの [データの受信] タブを開きます。[割り当てる変数を選択します] ドロップダウン リストから、getMessageAsString
関数の出力を格納する新しい変数を作成します。この出力は、キューから取得されたメッセージを表す文字列です。
キューから取得されたメッセージのメッセージ記述子の属性は、MQMDHeaders ドキュメントで更新されますこのドキュメントは、getMessageAsString
関数への入力として提供されます。
getMessageAsBytes
関数または getMessageAsXml
関数を使用してメッセージを取得する場合も、同様の手順で行います。
MQSeries コントロールの putMessage
関数をループ内で使用すると、グループ メッセージを送信できます。ループは、While Do、Do while、または For Each プロセス ノードを使用して作成できます。
MQMDHeadersDocument 内に GroupOptions
要素を用意します。この要素は、グループ メッセージを送信する場合にのみ、入力 MQMDHeaders XML ドキュメントで指定する必要があります。
MQMDHeaders ドキュメントで、最後のメッセージを除くすべてのメッセージに対して GroupOptions
内の IsLastMessage
要素を False
に設定します。最後のメッセージに対しては、IsLastMessage
要素を True
に設定する必要があります。
最初のメッセージに対して GroupID
を指定した場合、MQSeries コントロールはこの ID をグループ メッセージに割り当てます。最初のメッセージに対して GroupID
を指定しない場合、MQSeries キュー マネージャは最初のメッセージにグループ ID を割り当てます。この ID は putMessage
関数の出力 MQMDHeaders ドキュメントで返されます。
最初のメッセージに割り当てられたグループ ID は、グループの以降のすべてのメッセージで使用される必要があります。グループの最初のメッセージの MessageSequenceNumber
は 1 に、2 番目のメッセージの MessageSequenceNumber
は 2 にします。
MQSeries コントロールの getMessage
関数をループ内で使用すると、グループ メッセージを取得できます。ループは、While Do、Do while、または For Each プロセス ノードを使用して作成できます。
MQSeries コントロールを使用して、グループ メッセージを論理的な順序にしたがって取得できます。グループ メッセージを論理的な順序で取得するように MQSeries コントロールをコンフィグレーションするには、GroupMessage
要素の logicalOrder
属性を True
に設定します。
明示的なトランザクション モードを使用している場合にのみ、論理的な順序でメッセージを取得できます。以下の図は、グループ メッセージを論理的な順序で取得する場合のワークフローの例を示しています。
getMessage
関数の応答 MQMDHeaders ドキュメントで、GroupOptions
要素内の IsLastMessage
要素が True
に設定されるまで、ループが実行されます。
注意 : | 取得されたメッセージがグループの一部でない場合は、Get 関数の応答 MQMDHeaders ドキュメントに GroupOptions 要素が出現しません。 |
グループのメッセージを論理的な順序で取得するには、Get サービスを呼び出すたびに logicalOrder
属性を True
に設定する必要があります。論理的な順序とはメッセージ連続番号の順序であり、最初のメッセージの 1 から始まります。
グループ メッセージの取得中に logicalOrder
属性の値を True から False
に変えると、Get サービスの前の呼び出しでその値が True
だった場合、論理的な順序が変更されます。
logicalOrder
属性の値を False
に設定するか、Get 関数の要求ドキュメントでこの属性を指定しない場合、コントロールはメッセージの連続番号に関係なく、メッセージがキューに入った順番で、グループの最初のメッセージを取得します。
論理的な順序でグループ メッセージを取得し、グループ内のすべてのメッセージの待機も行う、Get 関数の要求 MQMDHeaders ドキュメントの例を次に示します。
<?xml version="1.0"?>
<even:MQMDHeaders xmlns:even="http://www.bea.com/wli/control/MQMDHeaders"> <even:GroupMessage waitForAllMsgs="true" logicalOrder="true"> <even:GroupId></even:GroupId>
</even:GroupMessage>
<even:MessageConsumption>Delete</even:MessageConsumption>
</even:MQMDHeaders>
グループのすべてのメッセージがキューに入るのを待ってからそのグループのメッセージを取得するように、MQSeries コントロールをコンフィグレーションできます。すべてのメッセージがキューに入るまで待機するように MQSeries コントロールをコンフィグレーションするには、GroupMessage
要素の waitForAllMsgs
属性の値を True
に設定します。
注意 : | waitForAllMsgs 属性と logicalOrder 属性の設定は省略可能であり、True または False に設定できます。 |
グループの最初のメッセージを取得するときに waitForAllMsgs
を True に設定できます。logicalOrder
属性も True
に設定している場合は、グループの最初のメッセージを取得した後、グループの他のメッセージを取得するために、この属性をもう一度 True に設定できます。
waitForAllMsgs
属性の値を False
に設定するか、Get 関数の要求ドキュメントでこの属性を指定しない場合、コントロールは、グループのメッセージがすべてキューに入っていないときでも、キューからグループ メッセージを取得できます。
GroupId
は、GroupMessage
要素に含めることのできる省略可能な要素です。この要素の値は、グループ メッセージの 16 進数のグループ ID が不明な場合には指定できません。キュー内に複数のグループ メッセージがある場合には、キューに最初に入ったグループ メッセージが取得されます。ID がわかっている場合には GroupId
値を指定できます。キュー内に複数のグループ メッセージがある場合に、GroupId を指定すると、指定した GroupId と一致するグループ メッセージが取得されます。
MessageSequenceNumber
要素と GroupId
要素を指定してグループ メッセージを取得することもできます。この方法でメッセージを取得できるのは、logicalOrder
属性の値が False
に指定されているか、または指定されていない場合だけです。MessageSequenceNumber
と GroupId
が指定されている場合は、MessageSequenceNumber
と一致するグループのメッセージが取得されます。GroupId
を指定し、ループ内の Get 関数呼び出しごとに MessageSequenceNumber
を 1 つ増やすことによって、グループ メッセージをループ内で取得できます。この場合、最初のメッセージの MessageSequenceNumber
は 1 になります。
フォーマットはメッセージ記述子の属性です特定のフォーマットのメッセージは、フォーマット タイプによって異なる特定の構造に準拠しています。たとえば、CICS、IMS、MQRFH2 などのフォーマットがあります。組み込みの MQSeries フォーマットの構造はそれぞれ異なり、MQSeries によって定義されています。MQSeries フォーマットの詳細については、以下の URL にある MQSeries のオンライン ドキュメントを参照してください。
MQSeries コントロールを使用して、組み込みの MQSeries フォーマットやユーザ定義フォーマットに対応するメッセージを送信できます。これを行うには、putMessageAsBytes
関数を使用する必要があります。
MQSeries フォーマットに準拠したメッセージを送信するには、プロセス JPD ファイルに Java コードを追加する必要があります。その例を以下に示します。
putin
などの変数を宣言します。public com.bea.wli.control.mqmdHeaders.MQMDHeadersDocument putin;
この変数は、putMessage
関数の入力 MQMDHeaders ドキュメント XML Bean 変数を表します。
public void perform() throws Exception
{
putin.getMQMDHeaders().setFormat(MQC.MQFMT_CICS);
bytmsg = getCICSHeader();
}
public byte[] getCICSHeader() throws Exception {
ByteArrayOutputStream bstream = new ByteArrayOutputStream();
DataOutputStream ostream = new DataOutputStream (bstream); ostream.writeChars("CIH "); // Struct id
ostream.writeInt(1); // Version
ostream.writeInt(164); // StrucLength
ostream.writeInt(273); // Encoding
ostream.writeInt(819); // CodedCharSetId
ostream.writeChars(" "); // Format
ostream.writeInt(0); //Flags
ostream.writeInt(0); //ReturnCode
ostream.writeInt(0); //CompCode
ostream.writeInt(0); //Reason
ostream.writeInt(273); //UOWControl
ostream.writeInt(-2); //GetWaitInterval
ostream.writeInt(1); //LinkType
ostream.writeInt(-1); //OutputDataLength
ostream.writeInt(0); //FacilityKeepTime
ostream.writeInt(0); //ADSDescriptor
ostream.writeInt(0); //ConversationalTask
ostream.writeInt(0); //TaskEndStatus
ostream.writeBytes("\0\0\0\0\0\0\0\0"); //Facility
ostream.writeChars(" "); //Function
ostream.writeChars(" "); //AbendCode
ostream.writeChars(" "); //Authenticator
ostream.writeChars(" "); //Reserved1
ostream.writeChars(" "); //ReplyToFormat
ostream.writeChars(" "); //RemoteSysId
ostream.writeChars(" "); //RemoteTransId
ostream.writeChars(" "); //TransactionId
ostream.writeChars(" "); //FacilityLike
ostream.writeChars(" "); //AttentionId
ostream.writeChars(" "); //StartCode
ostream.writeChars(" "); //CancelCode
ostream.writeChars(" "); //NextTransactionId
ostream.writeChars(" "); //Reserved2
ostream.writeChars(" "); //Reserved3
ostream.writeChars("HelloWorld");
ostream.flush();
byte[] bArr = bstream.toByteArray();
return bArr;
}
このコードは、putMessage
関数の入力 MQMD Headers ドキュメント内の Format
要素を、文字列 MQCICS
で表す MQC.MQFMT_CICS
に設定します。
getCICSHeader
関数は、CICS ヘッダで表現されたフィールドをバイト配列の出力ストリームに書き出して、バイト配列を返します。この例で示すフィールドの値は、必要に応じて変更できます。実際のメッセージをバイト配列の最後に追加し、MQSeries キューに Put することができます。バイト配列は putMessageAsBytes
関数の最初のパラメータとして指定できます。これは、プロセス JPD ファイルの実行ノードの後に追加されます。putMessage
関数の詳細については、「メッセージの送受信」を参照してください。
putin
などの変数を宣言します。public com.bea.wli.control.mqmdHeaders.MQMDHeadersDocument putin;
この変数は、putMessage
関数の入力 MQMDHeaders ドキュメント XML Bean 変数を表します。
public void perform() throws Exception
{
putin.getMQMDHeaders().setFormat(MQC.MQFMT_IMS);
bytmsg = getIMSHeader();
}
public byte[] getIMSHeader() throws Exception {
ByteArrayOutputStream bstream = new ByteArrayOutputStream();
DataOutputStream ostream = new DataOutputStream (bstream);
ostream.writeBytes("IIH "); // Struct id
ostream.writeInt(1); // Version
ostream.writeInt(84); // Length
ostream.writeInt(0); // Encoding
ostream.writeInt(0); // CodedCharacterSet
ostream.writeBytes(" "); // Format (8 characters)
ostream.writeInt(0); // Flags
ostream.writeBytes(" "); // LTermOverride
ostream.writeBytes(" "); // MFSMapName
ostream.writeBytes(" "); // ReplyToFormat
ostream.writeBytes(" "); // Authenticator
ostream.writeBytes("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); // TransInstanceId
ostream.writeBytes(" "); //Transtate
ostream.writeBytes("1"); // CommitMode
ostream.writeBytes("F"); // Security Scope
ostream.writeBytes(" "); // Resrved
ostream.writeChars("HelloWorld");
ostream.flush();
byte[] bArr = bstream.toByteArray();
return bArr;
}
上記のコード行は、putMessage
関数の入力 MQMD Headers ドキュメント内の Format
要素を、文字列 MQIMS
で表す MQC.MQFMT_IMS
に設定します。
getIMSHeader
関数は、IMS ヘッダ構造で表現されたフィールドをバイト配列の出力ストリームに書き出して、バイト配列を返します。この例で示すフィールドの値は、必要に応じて変更できます。実際のメッセージをバイト配列の最後に追加し、MQSeries キューに Put することができます。バイト配列は putMessageAsBytes
関数の最初のパラメータとして指定できます。これは、プロセス JPD ファイルの実行ノードの後に追加されます。putMessage
関数の詳細については、「メッセージの送受信」を参照してください。
putin
などの変数を宣言します。public com.bea.wli.control.mqmdHeaders.MQMDHeadersDocument putin;
この変数は、putMessage
関数の入力 MQMDHeaders ドキュメント XML Bean 変数を表します。
public void perform() throws Exception
{
putin.getMQMDHeaders().setFormat(MQC.MQFMT_RF_HEADER_2);
bytmsg = getMQRFH2Header();
}
public byte[] getMQRFH2Header() throws Exception { ByteArrayOutputStream bstream = new ByteArrayOutputStream(); DataOutputStream ostream = new DataOutputStream (bstream);
String strVariableData = "<mcd><Msd>jms_text</Msd></mcd><jms><Dst>someplace</Dst></jms>";
int iStrucLength = MQC.MQRFH_STRUC_LENGTH_FIXED_2 + strVariableData.getBytes().length;
while(iStrucLength % 4 != 0)
{
strVariableData = strVariableData + " ";
iStrucLength = MQC.MQRFH_STRUC_LENGTH_FIXED_2 + strVariableData.getBytes().length;
}
ostream.writeChars(MQC.MQRFH_STRUC_ID);//StrucID ostream.writeInt(MQC.MQRFH_VERSION_2);//Version ostream.writeInt(iStrucLength );//StrucLength ostream.writeInt(273);//Encoding ostream.writeInt(1208);//CodedCharSetID ostream.writeChars(MQSTR);//Format ostream.writeInt(MQC.MQRFH_NO_FLAGS);//Flags ostream.writeInt(1208);//NameValueCCSID ostream.writeInt(strVariableData.getBytes().length);//NameValueLength ostream.writeChars(strVariableData ); //NameValueData ostream.writeChars("HelloWorld");
ostream.flush();
byte[] bArr = bstream.toByteArray();
return bArr;
}
上記のコードは、putMessage
関数の入力 MQMD Headers ドキュメント内の Format 要素を、文字列 MQHRF2
で表す MQC.MQFMT_RF_HEADER_2
に設定します。
getMQRFH2Header
関数は、MQRFH2 ヘッダ構造で表現されたフィールドをバイト配列の出力ストリームに書き出して、バイト配列を返します。この例で示すフィールドの値は、必要に応じて変更できます。実際のメッセージをバイト配列の最後に追加し、MQSeries キューに Put することができます。バイト配列は putMessageAsBytes
関数の最初のパラメータとして指定できます。これは、プロセス JPD ファイルの実行ノードの後に追加されます。putMessage
関数の詳細については、「メッセージの送受信」を参照してください。
MQSeries コントロールのプロパティは、実行時に動的に変更できます。変更できる MQSeries コントロールのプロパティは MQDynamicProperties ドキュメントで指定されます。このドキュメントは、MQSchemas.jar
ファイル内にある MQDynamicProperties スキーマに準拠します。
setDynamicProperties
関数に続くすべての MQSeries の Get 操作および Put 操作では、MQDynamicProperties ドキュメントで指定するプロパティを使用します。警告 : | 明示的なトランザクション モードを使用する場合は、必ず Begin 関数の前か、Commit 関数または Rollback 関数の後に、setDynamicProperties 関数を呼び出します。この順序に従わない場合、ビジネス プロセスは実行時に例外をスローします。 |
<?xml version="1.0"?>
<xs:schema xmlns="http://www.bea.com/wli/control/MQDynamicProperties" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.bea.com/wli/control/MQDynamicProperties" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="MQDynamicProperties">
<xs:complexType>
<xs:sequence>
<xs:element name="connectionType" type="connType" minOccurs="0" maxOccurs="1"/>
<xs:element name="queueManager" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="requireAuthorization" type="authType" minOccurs="0" maxOccurs="1"/>
<xs:element name="host" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="port" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="channel" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="ccsid" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="user" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="password" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="sendExit" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="receiveExit" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="securityExit" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="defaultQueueName" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="implicitTransactionRequired" type="transType"
minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="connType">
<xs:restriction base="xs:string">
<xs:enumeration value="Bindings"></xs:enumeration>
<xs:enumeration value="TCP"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="authType">
<xs:restriction base="xs:string">
<xs:enumeration value="Yes"></xs:enumeration>
<xs:enumeration value="No"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="transType">
<xs:restriction base="xs:string">
<xs:enumeration value="true"></xs:enumeration>
<xs:enumeration value="false"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:schema>
以下は、MQDynamicProperties ドキュメントのサンプルです。実行時に、ビジネス プロセスを実行するときに、このドキュメントを提供する必要があります。
<?xml version="1.0"?>
<even:MQDynamicProperties
xmlns:even="http://www.bea.com/wli/control/MQDynamicProperties">
<even:connectionType>TCP</even:connectionType>
<even:queueManager>newqm</even:queueManager>
<even:requireAuthorization>Yes</even:requireAuthorization>
<even:host>localhost</even:host>
<even:port>1869</even:port>
<even:channel>chn</even:channel>
<even:ccsid>437</even:ccsid>
<even:user>WebLogic</even:user>
<even:password>WebLogic</even:password>
<even:defaultQueueName>errqueue</even:defaultQueueName>
</even:MQDynamicProperties>
MQSeries コントロールをコンフィグレーションするときに TCP 接続モードを選択した場合にのみ、SSL 機能を使用できます。MQSeries コントロールのコンフィグレーション オプションの詳細については、「MQSeries コントロールの新しいインスタンスを作成およびコンフィグレーションする」を参照してください。
サンプル : ワークフロー内での SSL のコンフィグレーション
暗号スイート アルゴリズムは、MQSeries サーバと MQSeries クライアントとの間のメッセージ通信を暗号化および復号化する際に使用されます。新しい MQSeries コントロールを作成するときに 2 つの SSL オプションのいずれかを選択した場合は、メッセージをキューとの間でやり取りする前に、SSL 暗号スイートを設定する必要があります。これを行うには、以下の関数を使用します。
void setSSLCipherSuite(java.lang.String cipherSuite);
この関数のパラメータは、選択した SSL 暗号スイートを表す文字列です。暗号スイートのさまざまな値を、MQControlConstants クラスの final static 変数から取得できます。
MQSeries コントロールのいずれかの SSL オプションを有効にした後は、メッセージをキューとの間でやり取りする前に、サーバサイドの SSL プロパティを設定する必要があります。これを行うには、以下の関数を使用します。
void setServerSideSSL(java.lang.String trustStoreLocation, java.lang.String trustStoreType, java.lang.String trustStorePassword) throws com.bea.control.ControlException;
MQSeries コントロールの双方向 SSL を有効にした後は、メッセージをキューとの間でやり取りする前に、サーバサイドおよびクライアントサイドの SSL プロパティを設定する必要があります。クライアントサイドの SSL プロパティを設定するには、次の関数を使用します。
void setClientSideSSL(java.lang.String keyStoreLocation, java.lang.String keyStoreType, java.lang.String keyStorePassword, java.lang.String keyPassword);
新しい MQSeries コントロールを作成するときに 2 つの SSL オプションのいずれかを選択した後は、ワークフローが、以下の図に示す MQSeries コントロールの関数の呼び出し順序に従う必要があります
警告 : | SSL 認証が必要な場合に、ワークフローが図 10-1 の順序に従っていないと、MQSeries コントロールは実行時に例外をスローします。 |
SSL 接続用にキュー マネージャを設定する方法については、http://www.IBM.com にある MQSeries 製品のドキュメントを参照してください。SSL は WebSphere MQ バージョン 5.3 以降でのみサポートされます。
MQSeries コントロール バージョン 8.1 SP3 が含まれるワークフローを、MQSeries コントロール バージョン 8.1 SP4 が含まれるワークフローに移行する場合は、Workshop アプリケーションを以下のように変更する必要があります。
MQSeries イベント ジェネレータは、MQSeries キューをポーリングしてメッセージの有無を確認し、WebLogic メッセージ ブローカ チャネルにメッセージをパブリッシュします。MQSeries イベント ジェネレータは、3 種類のデータ型 (バイト、文字列、および XML) をサポートします。
メッセージ ブローカ チャネル名を使用して、データ型ごとにイベント ジェネレータ チャネルをコンフィグレーションできます。それにより、指定した MQSeries キューにメッセージが入ると、そのメッセージ ブローカ チャネルにメッセージがパブリッシュされます
MQSeries コントロールと同様に、MQSeries イベント ジェネレータにも 2 つの接続モード (TCP-IP とバインディング) があります。コンテンツフィルタを実装して、特定のコンテンツに基づいてメッセージをフィルタ処理することもできます。それにより、必要なメッセージに対してだけイベントを生成できます。
MQSeries イベント ジェネレータは、イベントの複数のスレッドを開始することもできます。それぞれのスレッドが、MQSeries キューを個別にポーリングできます。それぞれのポーリングでイベント ジェネレータ スレッドが取得するメッセージの数をコンフィグレーションできます。
詳細については、「Integration イベント ジェネレータの使用」を参照してください。