MQSeries上のキューを読み書きするために、JMS スタンドアロンアプリケーションを開発しようとしています。私の上司は、pure Java JMS(ibm.mq libではありません)を使用してそれを行うように頼みました。
Jms接続を確立するために必要な情報は次のとおりです。
mq.hostname=10.10.10.10
mq.channel=API.CLIENTCHL
mq.queueManager=MQPETAPI
mq.port=1422
それを行う方法を知っていますか、それを行うように教えてくれるリンクがありますか。
ここでの問題は、「上司がそれを行うために純粋なJava JMS(ibm.mq libではなく)を使用するように要求した。)」という要件です。JMSは仕様であり、各実装はAPIに準拠する必要がありますセマンティクスですが、低レベルで自由に実行できますトランスポートベンダーが提供する実装クラスを常に使用する必要があるため、トランスポートとしてWebSphere MQを使用する場合は、IBM MQを使用する必要があります。 JMSアプリケーションを作成するJMSクラス。
つまり、純粋なJMS APIコールを使用すると、トランスポートベンダーのクラスをプラグインできるようになります。これは、元の投稿で言及されているような要件が与えられている場合に通常意図されているものです。
スタンドアロンのJava WebSphere MQ V6.0のアプリケーションの実行JMS APIのみを使用し、ローカルファイルシステム(.bindingsファイル)でJNDIを使用します。別のベンダーのIBM JMSクラスを交換し、JNDIツールを使用すると、プラグインが可能になりますこのアプローチを使用してコードを変更せずに、JMSトランスポートで。
JNDIを使用せずに同じことを行う場合は、Javaクラスを取得したMQクライアントインストールで提供されるサンプルプログラムを参照してください。UNIX/ Linuxシステムでは、これらは/opt/mqm/samp
およびWindowsではinstall_dir/tools/jms/samples
。 SimpleRequestor.Java
サンプルには、JNDIなしで接続ファクトリを初期化するための次のコードが含まれています。
try {
// Create a connection factory
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
// Set the properties
cf.setStringProperty(WMQConstants.WMQ_Host_NAME, "localhost");
cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");
このアプローチではJNDIを使用しないため、トランスポートベンダー間でトランスポートできないコードを記述する必要があります。 IBM WebSphere MQ固有です。
どこかからMQ jarを入手し、フルインストールがない場合(したがってサンプルがない場合)は、 SupportPac MQC7 としてダウンロードできます。ダウンロードは無料です。一般に、バックレベルキューマネージャーを使用する場合でも、最新のクライアントを使用する必要があります。明らかに、V6 QMgrからV7機能を取得することはありませんが、V6クライアントのJMS実装は、V6機能であっても大幅に改善されています。何らかの理由で本当にV6クライアントを使用する必要がある場合は、 SupportPacMQC6 としてダウンロードできます。使用するクライアントバージョンに関係なく、対応するInfocenterを使用してください。
最後に、すべてのSupportPacsのインデックス付きのランディングページは here です。
TextMessageを備えた完全な(同期)スタンドアロンJMSアプリケーション
IBM WebSphere MQ固有です。
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;
public class JMSApplicationStandAlone {
public static void main(String[] args) {
try {
/*MQ Configuration*/
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName("localhost");
mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
mqQueueConnectionFactory.setPort(1416);
mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider
mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
/*Create Connection */
QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
queueConnection.start();
/*Create session */
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
/*Create response queue */
Queue queue = queueSession.createQueue("QUEUE.RESPONSE");
/*Create text message */
TextMessage textMessage = queueSession.createTextMessage("put some message here");
textMessage.setJMSReplyTo(queue);
textMessage.setJMSType("mcd://xmlns");//message type
textMessage.setJMSExpiration(2*1000);//message expiration
textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt
/*Create sender queue */
QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
queueSender.setTimeToLive(2*1000);
queueSender.send(textMessage);
/*After sending a message we get message id */
System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";
/*Within the session we have to create queue reciver */
QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);
/*Receive the message from*/
Message message = queueReceiver.receive(60*1000);
String responseMsg = ((TextMessage) message).getText();
queueSender.close();
queueReceiver.close();
queueSession.close();
queueConnection.close();
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注:構成値を置き換えます
WMQ固有のコードを書くことを気にしないなら、あなたはできる
MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
その後、通常のJMSリソース
Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);
最後にメッセージを作成して送信します
Message m = s.createTextMessage("Hello, World!);
p.send(m);
(私はそれを私の頭の上に入力したので、タイプミスを除外することはできませんが、それは基本的に正しいです)。本当に「純粋なJMS」を使用することになっている場合(つまり、プロバイダー固有のオブジェクトがない場合)、JNDIでMQConnectionFactoryオブジェクトをバインドする必要があります(JMSAdminツールをご覧ください。ドキュメントにあります)。あなたのアプリケーションから、すなわち.
InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name
通常、JMSを使用すると、コンテナでQueueConnectionFactory
を定義し、それを使用可能にする構成メカニズムを介してコンテナのJNDIレジストリに追加します。各コンテナには、それを行うための独自のメソッドがあります(つまり、Tomcat対WebSphere)。
JNDIを廃止したい場合は、 com.ibm.mq.jms.MQQueueConnectionFactory
のインスタンスを直接作成し、ホスト名、ポート、queueManager、およびチャネルのプロパティを設定できます。その後、javax.jms.QueueConnectionFactory
のインスタンスを実装するので、そのオブジェクトを使用できます。
JMSを1回の投稿で教えることはできませんが、私がJMSを学習するために使用したリソースの一部を紹介することはできます。
これはかなり一般的です。 ここ はいくつかの例です。