Websphere Application ServerにデプロイするEARがあります。このEARは、関数を使用して、JMSを使用してMQにメッセージを送信し、別のキューからすぐにメッセージを受信します。
ConnectionFactory cf = null;
InitialContext context = null;
String[] arrDatos_SR = null;
Connection conn = null;
Session session = null;
Queue queue = null;
Queue queue2 = null;
Destination dest = null;
Destination dest2 = null;
MessageConsumer consumer = null;
MessageProducer producer = null;
TextMessage message = null;
String comando = "";
int tamanio = 0;
String tamanio2 = "";
String cadena = "";
try {
context = new InitialContext();
cf = (ConnectionFactory) context.lookup(arrDatos[1].trim());
conn = cf.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) context.lookup(arrDatos[2].trim());
queue2 = (Queue) context.lookup(arrDatos[3].trim());
dest = (Destination) queue;
dest2 = (Destination) queue2;
producer = session.createProducer(dest);
// Create a text message using the queue session.
TextMessage textMessage = session.createTextMessage();
textMessage.setText(arrDatos[4]);
textMessage.setJMSReplyTo(dest2);
textMessage.setJMSMessageID(arrDatos[6]);
textMessage.setJMSCorrelationID(arrDatos[7]);
producer.send(textMessage);
} catch (NamingException e) {
// TODO Auto-generated catch block
logger.error("MQSendReceive() - Exception e2 = "
+ e, e);
} catch (JMSException e) {
// TODO Auto-generated catch block
logger.error("MQSendReceive() - Exception e2 = "
+ e, e);
}
arrDatos[5] = arrDatos[5].trim();
try{
conn.start();
consumer = session.createConsumer(dest2);
Message receivedMessage = consumer.receive(Long.parseLong(arrDatos[5]) * 1000);
if(receivedMessage != null)
{
message = (TextMessage)receivedMessage;
comando = message.getText();
comando = comando.trim();
tamanio = comando.length();
tamanio2 = StringUtils.leftPad(Integer.toString(tamanio), 9, '0');
comando = StringUtils.rightPad(comando, Constantes.TAMANIO_RESPUESTA_DES_C1, ' ');
cadena = arrDatos[0] + comando + tamanio2;
}
else
{
comando = new String();
comando = "";
tamanio = comando.length();
tamanio2 = StringUtils.leftPad(Integer.toString(tamanio), 9, '0');
cadena = arrDatos[0] + comando + tamanio2;
}
arrDatos_SR = new String[2];
arrDatos_SR[0] = cadena;
arrDatos_SR[1] = arrDatos[0];
}
catch(Exception e)
{
logger.error("MQSendReceive() - Excepcion:" + e);
}
finally
{
try {
consumer.close();
session.close();
conn.close();
context.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
logger.error("MQSendReceive() - Error desconectando de MQ - Excepcion:" + e);
} catch (NamingException e) {
// TODO Auto-generated catch block
logger.error("MQSendReceive() - Error desconectando de MQ - Excepcion:" + e);
}
}
return arrDatos_SR;
メッセージはMQキュー#1に送信され、次に別のMQキュー#2に転送されます。これは、別のMQキュー#3への送信キューです。メッセージをこのキューに入れるWebsphereMQ管理GUIでテストしたところ、メッセージはスムーズに転送されました。しかし、何らかの理由でコードを使用すると、すぐに送信されません。代わりに、受信が終了した後(タイムアウトが期限切れになったとき、または実際にメッセージを受信したとき)に実行されます。
なぜこれが起こっているのか誰かに教えてもらえますか?
更新:(2014年3月31日)@ LocalBean、@ Singleton、および@TransactionManagement(TransactionManagementType.CONTAINER)アノテーションが付いたEJBコンテナーを使用していることを忘れました。SO(http://goo.gl/JBSW7r)からこの投稿を読んで、接続全体を作成する3つのクラスと、パブリックメソッドを使用するオブジェクトとしてそれらすべてを使用する1つのメインがあることに気付きました。 。これらのクラスも同じアノテーションでEJBに変換することにしました。また、各メソッドの@TransactionAttributeタイプを、いくつかが機能するかどうかをテストするために、一度に1つずつREQUIRED、NOT SUPPORTED、およびMANDATORYに変更しようとしました。また、セッション行を次のように変更しました。
session = conn.createSession(true, Session.SESSION_TRANSACTED);
結果は同じように見えます。MessageConsumerのタイムアウト間隔中にメッセージが受信されている間、メッセージはまだ送信キューに留まっています。
誰かが私にこれらについていくつかの考えを与えることができますか?
何度も試した後、EJBの削除を終了しました。ロジック全体でWebプロジェクトを作成しました。whileループのあるスレッドを使用して、コードの繰り返しを制御することにしました。ブール変数を使用して、EARの開始とシャットダウンのwhileループの初期化と停止を制御します。
さて、Webアプリケーションに戻ると、正常に機能します。なぜこのように機能し、他の方法では機能しないのかはまだわかりませんが、今のところは問題ないと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加