まつざきの技術メモ

エンジニアの私的な技術メモです。


2件のコメント

CDIで複数データソースの切り替え

将来的にはJavaEEの仕様にマルチテナント機能が組み込まれますが、
僕は今のところ、複数データソースの切り替えが出来れば十分なので、
CDIを使ってやってみました。
これで1つのJavaEE6アプリで複数のデータベースへの接続を切り替える事が可能です。

では早速、実際のソースを見てみましょう。

 

まずはプロデューサ・メソッドから。
EntityManagerがDIされるフィードを複数持ち、プロデューサ・メソッドで何れかをreturnします。
今回の例ではシステム日付の秒で分岐しましたが、
実際はURLパラメータやCookieに保持した値などで分岐する事になると思います。
また、RequestScopedアノテーションを付けて、リクエスト毎に呼ばれるようにします。

public class EntityManagerFactory {

    @PersistenceContext(unitName = "pu01")
    private EntityManager em01;
    @PersistenceContext(unitName = "pu02")
    private EntityManager em02;

    @RequestScoped
    @Produces
    @EntityManagerQualifier
    public EntityManager getEntityManager() {
        // システム日付が偶数秒ならem01に接続する。
        DateTime dt = new DateTime();
        int sec = Integer.parseInt(dt.toString("s"));
        if (sec % 2 == 0) {
            return em01;
        } else {
            return em02;
        }
    }
}

次にDIでEntityManagerを受け取る側
DIで受け取ったEntityManagerを使うだけです。
今回の例ではコントローラに書いてます。

@Model
public class SampleController {

    @Inject
    @EntityManagerQualifier
    private EntityManager em;

    public String getName() {
        Query query = em.createNamedQuery("findAll", Sample.class);
        return ((Sample) query.getSingleResult()).getName();
    }
}

EntityManagerQualifierアノテーションはQualifier(限定子)です。
インジェクションの対象を限定(紐付け?)させています。

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface EntityManagerQualifier {
}

ソースはGitHubにアップしてます。
READMEに環境構築の手順メモも書いてます。
サンプルソース

以上、久々のJavaネタでした!

広告


2件のコメント

似てる #fluentd プラグインの比較

 

これはウィークリーFluentdユースケースエントリリレーの参加エントリです。

@oranieさんによるまとめエントリはこちら

 

Fluentdのプラグインって沢山ありますよね?
その中から、似てるものを見つけて違いが気になったので調べてみました。

・fluent-plugin-rewrite
by @kentaroさん
fluent-plugin-rewriteというプラグインを作成した #fluentd

・fluent-plugin-rewrite-tag-filter
by @yoshi_kenさん
自在にタグを書き換える fluent-plugin-rewrite-tag-filter でログ解析が捗るお話 #fluentd

今回は、@studio3104さんのこちらのブログエントリを元に構成を作りました。
fluent-plugin-rewriteを使用されています。
# 素晴らしいエントリありがとうございます!

今回の比較とは関係ないのですが、HTTPステータスコードのカウントを取ってみたかったので、
fluent-plugin-datacounterの設定を追加しています。

・送信側の設定例

・受信側の設定例

 

これで、GrowthForecastにこんなグラフが出力できます。
※host01.top.mixという複合グラフは手で作りました。

 
で、fluent-plugin-rewrite-tag-filter版がこちら。

・2つの設定ファイルのdiffはこちら。

グラフはこちら
※top.mixという複合グラフは手で作りました。

 
2つのプラグインの違いのまとめ
fluent-plugin-rewrite
マッチした文字列自体や書き換えを行った文字列を、
渡ってきた元のタグに付加して新しいタグとして再emit。

fluent-plugin-rewrite-tag-filter
マッチした文字列自体や書き換えを行った文字列を、
新しいタグとして再emit。
※今日時点のバージョン(v1.0.0)では、渡ってきた元のタグを残す事が出来ない。
(上記の例で言うと、host01という文字列です)

という違いになります。

fluent-plugin-rewrite-tag-filterの場合、
送信側でタグにホスト名を含めておいて、
グラフをホスト別に出力するという事が出来ない気がします。

それ以外は全く同じ事が出来るので、どちらを使うかはお好みでよろしいかと思います!!

間違いなどあれば、ご指摘ください m(_ _)m

2012/11/17 追記
fluent-plugin-rewrite-tag-filterの作者である@yoshi_kenさんからご連絡いただき、
早速機能追加していただきました。ありがとうございます!