nablarch.fw.messaging.provider.JmsMessagingProvider Maven / Gradle / Ivy
package nablarch.fw.messaging.provider;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import nablarch.core.log.Logger;
import nablarch.core.log.LoggerManager;
import nablarch.fw.messaging.InterSystemMessage.HeaderName;
import nablarch.fw.messaging.MessagingContext;
import nablarch.fw.messaging.MessagingException;
import nablarch.fw.messaging.MessagingProvider;
import nablarch.fw.messaging.ReceivedMessage;
import nablarch.fw.messaging.SendingMessage;
import nablarch.fw.messaging.provider.exception.BasicMessagingExceptionFactory;
/**
* JMSプロバイダを利用したメッセージング機能の実装。
*
* 各JMSプロバイダが実装するConnectionFactoryおよびQueueオブジェクトを設定
* することにより、メッセージング機能が利用可能となる。
*
*
* Poison電文の退避
* 本実装ではPoison電文の退避処理を独自に実装しており、リトライ上限、 * 退避キュー名称を指定することができる。 * ただし、この機能はJMSXDeliveryCountヘッダに依存しているため、同ヘッダを * サポートしない一部のMOM製品/バージョンでは利用できない。 * なお、以下のMOMについては最新版における同ヘッダのサポートを確認している。 *
* - Websphere MQ * - WebLogic MQ * - ActiveMQ ** * @author Iwauo Tajima */ public class JmsMessagingProvider implements MessagingProvider { /** メッセージングログを出力するロガー */ private static final Logger LOGGER = LoggerManager.get("MESSAGING"); // ------------------------------------------------------ structure /** JMSプロバイダによるコネクションファクトリ実装 */ private ConnectionFactory factory; /** キュー名をキーとするJMS QueueオブジェクトのMap */ private final Map
(受信キュー名).POISON
* となる。
* 当該のキューが存在しなかった場合はデフォルトの退避キュー名を使用する。
*
* @param pattern 退避キューの論理名を決定する際に使用するパターン文字列
* @return このオブジェクト自体
*/
public JmsMessagingProvider setPoisonQueueNamePattern(String pattern) {
poisonQueueNamePattern = pattern;
return this;
}
/**
* デフォルトで使用する受信退避キューの論理名を設定する。
* 当該のキューが存在しなかった場合は、MessgingExceptionを送出する。
* 明示的に指定しなかった場合は、DEFAULT.POISON
を使用する。
* @param queueName キュー名称
* @return このオブジェクト自体
*/
public JmsMessagingProvider setDefaultPoisonQueue(String queueName) {
defaultPoisonQueue = queueName;
return this;
}
/**
* MOMによる受信リトライの上限回数を設定する。
* 受信メッセージのJMSXDeliveryCountヘッダの値がこの上限値を越えると、
* メッセージを退避キューに転送した上で、MessagingExceptionを送出する。
*
* この値が0以下の数値であった場合は、退避処理自体が無効化される。
* 明示的に指定しない場合のデフォルトは0である。
*
* @param limit 受信リトライの上限回数
* @return このオブジェクト自体。
*/
public JmsMessagingProvider setRedeliveryLimit(int limit) {
redeliveryLimit = limit;
return this;
}
/**
* {@link MessagingException}ファクトリオブジェクトを設定する。
*
* デフォルトは{@link BasicMessagingExceptionFactory}。
*
* @param messagingExceptionFactory {@link MessagingException}ファクトリオブジェクト
* @return このオブジェクト自体
*/
public MessagingProvider setMessagingExceptionFactory(
MessagingExceptionFactory messagingExceptionFactory) {
this.messagingExceptionFactory = messagingExceptionFactory;
return this;
}
/**
* メッセージングコンテキストのJMSベース実装
*/
public static class Context extends MessagingContext {
// ---------------------------------------------------- Structure
/** このインスタンスが使用するJMSプロバイダに対するコネクション */
private final Connection conn;
/** このインスタンスが使用するJMSセッション */
private final Session sess;
/** 各種設定 */
private final JmsMessagingProvider provider;
/** MessageProducerを保持しておくキャッシュ */
private Map