Shallow Copy & Deep Copy

■Overview
Javaには、オブジェクトのクローンと呼ばれる、オブジェクトのコピーメカニズムがある。
オブジェクトのコピーは、Shallow CopyとDeep Copyの2通りある。

■Shallow Copy
オブジェクトのbit-wiseなコピー。
newOject(コピー生成された新しいオブジェクト)は、originalObject(コピー元のオブジェクト)と同じ値を保持する。
originalObjectに、他のオブジェクトを参照するフィールドがあった場合、その参照値だけがnewObjectにコピーされる。
つまり、
originalObjetのそのフィールドと、newObjectのそのフィールドは、同じオブジェクトを参照する。

■Deep Copy
オブジェクトの完全なコピー。
originalObjetが、他のオブジェクトを参照する場合、参照先のオブジェクトもクローンが生成される。
つまり、
Deep Copyはプリミティブ値のコピーのみならず、サブオブジェクト(originalObjetが参照するオブジェクト)をも同様にコピーする。

■Tips For Deep Copy
Objectが提供するclone()は、ただのシャローコピー。
ディープコピーしたい場合は、自分で小細工する必要がある。
小細工しても、それを継承したクラスがきちんとオーバーライドせんことには、ディープコピーにならんことも。
と、まぁ、いろいろディープコピーはメンドウ。
ゆう時は、シリアライズが便利。
シリアライザブルをimplementsすれば、万事解決。
ただ、パフォーマンスクリティカルなケースは、きちんと考慮して選択すべし。

詳細は、記事参照。


ref:
What is shallow copy and deep copy in Java?
http://www.coders2020.com/what-is-shallow-copy-and-deep-copy-in-java
Java Tip 76: An alternative to the deep copy technique
http://www.javaworld.com/javaworld/javatips/jw-javatip76.html

続きを読む

2009-06-22 05:43 : __lang__java : コメント : 0 : トラックバック : 0 :

Timer and Work Manager API

TimerWorkManager
Oracle (bea) と IBMが共同作成した仕様。
TimerWorkManagerで、JavaEEアプリ内にEJBとサーブレットを同時プログラミングが可能になる。
※別名称をCommonJ。

CommonJ Timer API は、
作業を特定の間隔でスケジューリングする場合を想定したAPI。
CommonJ Work API は、
作業を優先順位に基づいて処理する場合を想定したAPI。

Timer API @commonj.timer package
アプリ内に定義された特定のリスナに対し、
アプリでタイマー通知コールバックをスケジューリングして受信できる。

Work Manager API @commonj.work
アプリでEJBまたはServlet内の作業の優先順位を決められる。
アプリは、複数の作業項目をコンテナ内部でプログラム的に実行できる。

Timer API
IF:
TimerManager
 管理対象の環境においてタイマーを作成及び使用するためのスレッドセーフなIFで
 アプリ内の全般的なスケジューリングする。
 デプロイメント記述子に定義すると
 そのインスタンスはローカルJava環境でJNDIルックアップでアクセス可能で、
 lookup()する度、TimerManagerの新しい論理インスタンスが返される。
 ※1アプリに複数のTimerManagerインスタンスを設定できる。
 TimerManager.schedule()でTimerListenerを特定の時刻に/間隔で実行するよう
 スケジューリングする。
 ―TimerManagerの中断/再開/停止
   TimerManager.suspend(): 中断
   ※中断中のタイマーは再開されるまで保留される。
   TimerManager.resume(): 再開
   TimerManager.stop(): 停止 (全アクティブタイマーの停止)
   ※stop()されたTimerManagerインスタンスは
    全てのTimerListenerインスタンスのモニタを停止する。
*TimerListener
 タイマー通知を受信するIFで、開発者が実装する。
*Timer
 TimerManagerを介してタイマーがスケジューリングされた時に返される。
 ローカルタイマーとクラスタワイドタイマーがある。
 -ローカルタイマー
  単一のサーバJVM内でスケジューリングされる。
  JVMが動作している限り動作し続け、JVMが終了すると失敗する。
 -クラスタワイドタイマー
  クラスタ内の各サーバを含む他のJVMを認識する。
  クラスタメンバの少なくとも1つが有効である限り、動作し続ける。
  ゆわゆるジョブスケジューラ。
  ※ジョブスケジューラでは以下メソッドはサポート外。
    -CancelTimerListener
    -StopTimerListener
    -TimerManager#suspend()
    -TimerManager#resume()
    -TimerManager#scheduleAtFixedRate()
    -TimerManager#stop()
    -TimerManager#waitForStop()
    -TimerManager#waitForSuspend()

□ジョブのキャンセル
ジョブは、プログラムまたは、AdministrationConsoleでキャンセルできる。
*プログラムでのキャンセル
 JobRuntimeMBean#cancel()を呼ぶ。
 *JobRuntimeMBeanの取得方法
   -方法1
     JobScheduler.schedule()で取得したTimerオブジェクトの
       toString()でID(スケジュールされたジョブID)を取得する。
     スケジュールされたジョブIDで
       JobSchedulerRuntimeMBean.getJob(id)を呼ぶ。
   -方法2
     JobSchedulerRuntimeMBean.getExecutedJobs()で
       少なくとも1回実行されたジョブのJobRunTimes配列を取得する。
 ※一度も実行されていないジョブはキャンセル出来ない。

□デバッグ
-Dweblogic.debug.DebugSingletonServices=true -Dweblogic.JobScheduler=true

Work API
1アプリ内での複数の作業項目の同時実行を可能にするAPI。
≒java.lang.Thread APIのコンテナ管理の代替機能。

IF:
WorkManager
*Work
*WorkItem
*WorkListener
*WorkEvent
*RemoteWorkItem

ref:
Timer and Work Manager API , dev2dev, Oracle / bea
http://otndnld.oracle.co.jp/document/products/wls/docs103/commonj/commonj.html

tag : Timer Work Manager WebLogic

2009-06-22 02:23 : j2ee : コメント : 0 : トラックバック : 0 :

generic interface

--Main--------------------------------------------
package pkg.y2009.m06.test002;

public class Main {

/**
* generic interface
* @param args
*/
public static void main(String[] args) {
Integer[] integers = {8, 7, 6, 5, 12, 11, 10};
Character[] characters = {'a', 's', 'd', 'f', 'g'};
MinMaxImpl i = new MinMaxImpl(integers);
MinMaxImpl c = new MinMaxImpl(characters);

System.out.println("integers.min: " + i.min());
System.out.println("integers.max: " + i.max());
System.out.println("characters.min: " + c.min());
System.out.println("characters.max: " + c.max());
}
}
--/Main-------------------------------------------
--MinMax------------------------------------------
package pkg.y2009.m06.test002;

public interface MinMax <'T extends Comparable<'T>> {
  T min();
  T max();
}
--/MinMax-----------------------------------------
--MinMaxImpl--------------------------------------
package pkg.y2009.m06.test002;

public class MinMaxImpl<'T extends Comparable<'T>> implements MinMax<'T> {
  T[] vals;
  MinMaxImpl(T[] ts) { vals = ts; }
  public T min() {
    T min = vals[0];
    for (T t : vals)
      if (t.compareTo(min) < 0) min = t;
    return min;
  }
  public T max() {
    T max = vals[0];
    for (T t : vals)
      if (t.compareTo(max) > 0) max = t;
    return max;
  }
}
--/MinMaxImpl-------------------------------------
--console log-------------------------------------
integers.min: 5
integers.max: 12
characters.min: a
characters.max: s
--/console log------------------------------------

ref:
http://www.java2s.com/Code/Java/Language-Basics/Agenericinterfaceexample.htm
2009-06-22 02:13 : __lang__java : コメント : 0 : トラックバック : 0 :

how to get a seq No among several threads.

--Main.jave---------------------------------------
package pkg.y2009.m06.test001;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import pkg.test001.Runnablee;
import pkg.test001.Runnablee2;

public class Main {

  /**
   * @param args
   */
  public static void main(String[] args) {
    try {
      test001();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

  /**
   * how to get a seq no among several threads.
   * @throws InterruptedException
   *
   */
  private static void test001() throws InterruptedException {
    int hangingTime = 2000;
    int runnerListSize = 10;
    
    ////////////////////Runnablee
    int subId = 1;
    Thread.currentThread().getThreadGroup().list();
    List list = Runnablee.getInstanceList(runnerListSize, subId);
    for (Runnablee t : list) t.run();//1st execution
    Thread.sleep(hangingTime);
    
    subId = 2;
    Thread.currentThread().getThreadGroup().list();
    list = Runnablee.getInstanceList(runnerListSize, subId);
    for (Runnablee t : list) t.run();//renew and execute again
    Thread.sleep(hangingTime);
    
    subId = 3;
    Thread.currentThread().getThreadGroup().list();
    list = Runnablee.getInstanceList(runnerListSize, subId);
    ExecutorService es = Executors.newFixedThreadPool(2);
    for (Runnablee t : list) es.execute(t);
    es.shutdown();
    Thread.sleep(hangingTime);
    
    subId = 4;
    Thread.currentThread().getThreadGroup().list();
    list = Runnablee.getInstanceList(runnerListSize, subId);
    es = Executors.newCachedThreadPool();
    for (Runnablee t : list) es.execute(t);
    es.shutdown();
    Thread.sleep(hangingTime);
    
    Thread.currentThread().getThreadGroup().list();
    
    ////////////////////Runnablee2
    subId = 1;
    Thread.currentThread().getThreadGroup().list();
    List list2 = Runnablee2.getInstanceList(runnerListSize, subId);
    for (Runnablee2 t : list2) t.run();//1st execution
    Thread.sleep(hangingTime);
    
    subId = 2;
    Thread.currentThread().getThreadGroup().list();
    list2 = Runnablee2.getInstanceList(runnerListSize, subId);
    for (Runnablee2 t : list2) t.run();//renew and execute again
    Thread.sleep(hangingTime);
    
    subId = 3;
    Thread.currentThread().getThreadGroup().list();
    list2 = Runnablee2.getInstanceList(runnerListSize, subId);
    ExecutorService es2 = Executors.newFixedThreadPool(2);
    for (Runnablee2 t : list2) es2.execute(t);
    es2.shutdown();
    Thread.sleep(hangingTime);
    
    subId = 4;
    Thread.currentThread().getThreadGroup().list();
    list2 = Runnablee2.getInstanceList(runnerListSize, subId);
    es2 = Executors.newCachedThreadPool();
    for (Runnablee2 t : list2) es2.execute(t);
    es2.shutdown();
    Thread.sleep(hangingTime);

    Thread.currentThread().getThreadGroup().list();
  }

}
--/Main.jave--------------------------------------
--Runnablee.jave----------------------------------
package pkg.y2009.m06.test001;

import java.util.ArrayList;
import java.util.List;

public class Runnablee implements Runnable {

  static final String SYSOUT_PREFIX = "【TEST001】";

  static {
    System.out.println("Runnablee.threadId has the overrided get-method which returns next value.");
  }

  public static int SEQ = 0;

  public static synchronized int next() {
    return ++SEQ;
  }

  public static ThreadLocal threadId = new ThreadLocal() {

    @Override
    public Integer get() {
      return next();
    }

    @Override
    protected Integer initialValue() {
      return next();
    }

  };

  int subId = -1;

  public Runnablee(int subId) {
    this.subId = subId; 
  }


//  @Override
  public void run() {

    sysout(subId, this.hashCode(), threadId.get(), Thread.currentThread().getId(), this.getClass().getName());

  }

  static void sysout(int subId, int hashCode, Integer seq, long threadId, String className) {
    System.out.println(SYSOUT_PREFIX + className + "(" + subId + "): " + seq
        + "\t (threadId: " + threadId + ")" + " [ " + hashCode + " ]");
  }

  public static List getInstanceList(int listSize, int subId) {
    List list = new ArrayList();
    for (int i = 1; i <= listSize; i++) {
      list.add(new Runnablee(subId));
    }
    return list;
  }

}
--/Runnablee.jave---------------------------------
--Runnablee2.jave---------------------------------
package pkg.y2009.m06.test001;

import java.util.ArrayList;
import java.util.List;

public class Runnablee2 implements Runnable {

  static {
    System.out.println("Runnablee2.threadId2 doesnt have the overrided get-method.");
  }

  public static int SEQ2 = 0;

  public static synchronized int next2() {
    return ++SEQ2;
  }

  /**
   * no get overriding.
   */
  public static ThreadLocal threadId2 = new ThreadLocal() {

    @Override
    protected Integer initialValue() {
      return next2();
    }

  };

  public Runnablee2(int subId) {
    this.subId = subId; 
  }
  
  int subId = -1;
  
//  @Override
  public void run() {

    Runnablee.sysout(subId, this.hashCode(), threadId2.get(), Thread.currentThread().getId(), this.getClass().getName());

  }

  public static List getInstanceList(int listSize, int subId) {
    List list = new ArrayList();
    for (int i = 1; i <= listSize; i++) {
      list.add(new Runnablee2(subId));
    }
    return list;
  }

}
--/Runnablee2.jave--------------------------------
--console log-------------------------------------
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
Runnablee.threadId has the overrided get-method which returns next value.
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 1  (threadId: 1) [ 11394033 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 2  (threadId: 1) [ 4384790 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 3  (threadId: 1) [ 9634993 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 4  (threadId: 1) [ 1641745 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 5  (threadId: 1) [ 11077203 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 6  (threadId: 1) [ 14576877 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 7  (threadId: 1) [ 12677476 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 8  (threadId: 1) [ 33263331 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 9  (threadId: 1) [ 6413875 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(1): 10  (threadId: 1) [ 21174459 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 11  (threadId: 1) [ 827574 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 12  (threadId: 1) [ 17510567 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 13  (threadId: 1) [ 27744459 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 14  (threadId: 1) [ 6927154 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 15  (threadId: 1) [ 24355087 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 16  (threadId: 1) [ 5442986 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 17  (threadId: 1) [ 10891203 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 18  (threadId: 1) [ 9023134 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 19  (threadId: 1) [ 19336051 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(2): 20  (threadId: 1) [ 6336176 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 21  (threadId: 7) [ 21091971 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 22  (threadId: 7) [ 23746042 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 23  (threadId: 7) [ 3327002 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 24  (threadId: 7) [ 15244180 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 25  (threadId: 7) [ 20848735 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 26  (threadId: 7) [ 29324282 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 27  (threadId: 7) [ 5718203 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 28  (threadId: 8) [ 5947506 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 29  (threadId: 7) [ 1088076 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(3): 30  (threadId: 8) [ 131577 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 31  (threadId: 9) [ 12848256 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 32  (threadId: 10) [ 14410104 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 33  (threadId: 11) [ 28286498 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 34  (threadId: 12) [ 11988197 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 35  (threadId: 13) [ 24825485 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 36  (threadId: 13) [ 26130918 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 37  (threadId: 13) [ 21944831 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 38  (threadId: 12) [ 30028170 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 39  (threadId: 14) [ 24807699 ]
【TEST001】pkg.y2009.m06.test001.Runnablee(4): 40  (threadId: 13) [ 29193342 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
Runnablee2.threadId2 doesnt have the overrided get-method.
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 22485126 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 17514905 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 33536220 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 29459700 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 33537384 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 15472292 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 29530802 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 20591247 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 30246505 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(1): 1  (threadId: 1) [ 3373112 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 18468004 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 13249998 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 25516242 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 25839584 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 24431647 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 17108511 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 14831146 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 24756869 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 13755908 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(2): 1  (threadId: 1) [ 5510959 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 32320232 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 27010805 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 12694833 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 22982825 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 27284232 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 11227341 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 21352552 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 3  (threadId: 16) [ 7704521 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 2  (threadId: 15) [ 3341135 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(3): 3  (threadId: 16) [ 17905416 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 4  (threadId: 17) [ 23105029 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 5  (threadId: 18) [ 783148 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 6  (threadId: 19) [ 9042915 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 6  (threadId: 19) [ 16259139 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 5  (threadId: 18) [ 56667 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 4  (threadId: 17) [ 12893404 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 7  (threadId: 20) [ 4932403 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 6  (threadId: 19) [ 19456522 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 5  (threadId: 18) [ 17829242 ]
【TEST001】pkg.y2009.m06.test001.Runnablee2(4): 4  (threadId: 17) [ 15006066 ]
java.lang.ThreadGroup[name=main,maxpri=10]
  Thread[main,5,main]
--/console log------------------------------------
2009-06-22 01:37 : __lang__java : コメント : 0 : トラックバック : 0 :

WebSphere/ トランザクションタイムアウト

■EJBコンテナ別のトランザクションタイムアウトの設定
Increase the lifetime timeout value of the WebSphere ESB application server:
1.If necessary, restart the application server.
2.Log in to the console.
 a.Open a browser, and navigate to the following URL: http://host_name:9060/ibm/console.
  Where:
   host_name is the fully qualified host name of the server
   where the application or the network deployment manager is deployed 9060 is the port
   used to access the console (The default port is 9060.)
 b.Enter your user ID and password. The user ID is required.
  A password is only required if security is enabled.
c.Click Log in.
3.Click Servers > Application Servers.
4.Click server_name.
5.Under Container Services, click Transaction Service.
6.Type a larger value for Total transaction lifetime timeout. For more information about setting the Transaction service settings, consult the WebSphere Application Server Information Center using the link provided below.
7.Restart the application server to make your changes effective.

■EJBアプリ別のグローバルトランザクションタイムアウトの設定
project > contextMenu > Java EE > WebSphere拡張機能デプロイメント記述子の生成
--> project > ejbModule > META-INF > ibm-ejb-jar-ext.xml > GUI

--------------------------------------------------
<'?xml version="1.0" encoding="UTF-8"?>
<'ejb-jar-ext xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-ext_1_0.xsd"
version="1.0">
  <'message-driven name="HogeMessageDrivenBean">
    <'global-transaction transaction-time-out="120" />
  <'/message-driven>
<'/ejb-jar-ext>
--------------------------------------------------

default global transaction timeout: 120 sec


ref:
http://www.coderanch.com/t/77252/Websphere/we-increase-tranasaction-time-ejb
http://www-01.ibm.com/support/docview.wss?rs=2307&context=SSQH9M&dc=DB560&dc=DB520&uid=swg21330852&loc=en_US&cs=UTF-8&lang=en&rss=ct2307websphere

tag : WebSphere

2009-06-18 23:40 : apsrv : コメント : 0 : トラックバック : 0 :

[ORM][Hibernate] LINKS - native SQL

□Chap.16 Native SQL, JBoss
http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html

tag:
LINKS Hibernate JBoss native SQL ORM

tag : LINKS Hibernate JBoss native SQL ORM

2009-06-17 07:00 : 開発 : コメント : 0 : トラックバック : 0 :

LINKS/ eclipse

DL/ Tools
□eclipse@Wiki プラグイン一覧
http://www10.atwiki.jp/eclipse/

□GUIプラグイン
http://eclipsewiki.net/eclipse/index.php?GUI%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3#df4103a1

□PropertiesEditorプラグイン
http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn01/eclipseplgn01_1.html

□HTMLEditorプラグイン
http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn01/eclipseplgn01_3.html

tag : LINKS DL

2009-06-17 06:56 : ide : コメント : 0 : トラックバック : 0 :

WMQ/ Introduction

■Abs
多種なシステムを緩やかに接合するための通信ミドルウェア。

WMQが持つJavaプログラミングIF:
WMQ独自のJavaプログラミングIFであるMQ Base Java
―J2EEのJMS

アプリとQueueManagerの接続方法:
―アプリが、同一システム上で稼動するQMgrと直接接続するbinding接続
―アプリが、ネットワーク経由してQMgrと接続するクライアント接続
いずれの接続方法でも
MQ Base JavaとJMSを利用できる。


■MQ Base Java
WebSphere MQ独自のJavaプログラミングIF。
→MQIが実装しているメッセージ処理機能の殆どを
 Javaアプリから利用できる。

□プログラムの流れ
①必要なパッケージのimport
 java.io.*のimport
 com.ibm.mq.jarのimport
 (@/opt/mqm/java/lib, {WebSphereHome}/java/lib)
 +αのimport/CLASSPATHへのディレクトリ追加
②環境設定
 どのホスト上のどのQmgrに接続するか
 をMQEnvironment(@com.ibm.mq.jar)のstatic変数に設定
 hostname, channel, port, CCSiD
③キューマネージャとの接続
 MQQueueManagerクラスのconstructer呼び出しでQMgrと接続される
 生成されたinstanceが、
 MQIのMQCONNで得られる接続ハンドルに相当する。
④キューのオープン
 MQQueueクラスのinstance生成
 方法は2つ
  constructerで生成
  MQQueue q = new MQQueue(
    qMgr,
    "qName",
    pmo/*MQI#MQPUT, MQGET, MQSET, MQINQ*/,
    null/*qMgrName*/,
    null/*dynamicQName*/,
    null/*userId*/);
  qMgr.accessQueue()で取得
  MQQueue q = qMgr.accessQueue(
    "qName",
    pmo/*MQI#MQPUT, MQGET, MQSET, MQINQ*/,
    null/*qMgrName*/,
    null/*dynamicQName*/,
    null/*userId*/);
 キューインスタンスが、
 MQIのMQOPENで得られるオブジェクト・ハンドルに相当する。
⑤各種パラメータの設定
 MQIでいうMQPMO/MQGMO構造体に当たる
 MQPut/GetMessageOptionsへの必要なparameter設定
 MQPutMessageOptions pmo = new MQPutMessageOptions();
 pmo.Options = parameter setting..
 MQGetMessageOptions gmo = new MQGetMessageOptions();
 gmo.Options = parameter setting..
 WebSphereMQでのメッセージは、
 メッセージの属性、宛先情報を保持するヘッダ部分と
 ユーザデータ部分から成る2層構造をとる。
 MQ Base Javaでは、
 MQMessageがこれら情報の入れ物になる。
 MQMessage msg = new MQMessage();
 ヘッダ部分に設定する情報は、
 MQMessageクラスの各変数に設定される。
 msg.messageType = MQC.MQMT_DATARAM;
 msg.characterSet = 932;//msgに含まれるデータCCSID
 msg.format = MQC.MQFMT_STRING;//ユーザデータ型
 msg.persistence = MQC.MQPER_PERSISTENT;//パーシスタント・メッセージ
 MSGをキューに書き込む場合
 MQMessageインスタンスのユーザデータ部分に
 任意の情報を格納する。
 msg.writeString("hogepiyo");
 *Unicodeを扱う場合:writeChar()/wirteChars()
 *Javaオブジェクトを扱う場合:wirteObject()
⑥メッセージお送受信
 *キューへの書き込み
  q.put(msg, pmo);
 *キューからの読み取り
  gmoインスタンスの生成、必要なparameterの設定
  msgインスタンスの生成、必要なparameterの設定
  ユーザデータを格納するbufferの準備
  をして
  q.get(msg, gmo);
  ユーザデータの読み出しは、データタイプに依存する。
  *readLine():
   MQMessage.CCSIDで指定されたCCSIDから
   Unicodeへデータ変換し、
   1行分の文字列を指定されたbufferにコピーする。
   String msgContent = null;
   msg.readLine(msgContent);
  *readChar():Unicode用
  *readLine():Unicodeに変換し
   指定された長さ分の文字列を読み込む
  *readObject:Javaオブジェクト用
⑦キューのクローズ
 q.close();
⑧キューマネージャからの切断
 qMgr.disconnect();

□エラー処理
MQ Base Javaの各メソッドは、
MQIのように理由コードや完了コードをアプリに返さない。
異常終了時は完了コードをMQExceptionでアプリに通知する。
→アプリは、try/catchでエラー処理が出来る。
try {
 q.put( msg1, pmo1 );
 q.put( msg2, pmo2 );
 q.put( msg3, pmo3 );
} catch( MQException mqe ) {
 System.out.println(" 問題発生/理由: " + mqe.reasonCode + "/ 状態: " + mqe.completionCode );
 q.close();
 qMgr.disconnect();
}

□マルチスレッド対応
MQ Base Javaでは、
MQQueueManagerオブジェクトやMQQueueオブジェクトを、
複数スレッドで共有できる。
ただし、
WebSphere MQ関連のメソッドが"synchronized"されているため、
あるスレッドで呼び出されたWebSphere MQ関連のメソッドの処理中は、
他のスレッドは処理を待たされる。
待たせたくない場合は、スレッド毎にqMgrオブジェクトやqオブジェクトを生成する。


JMS
□プログラムの流れ
①必要なパッケージのimport
 WebSphere MQを使ったJMSアプリには以下jarが必要
 com.ibm.mq.jar(jms.jarでも可)
 更に、
 ConnectionFactoryをJNDIネームスペースから取得する場合、
 jndi.jar等も必要
 import javax.jms.*;
 import javax.naming.*;
 ※ConnectionFactoryをアプリ実行時に生成する場合は、
  com.ibm.mq.jms.jarが必要。
②ConnectionFactoryの取得
 ConnectionFactoryは、
 JMSClient(JMSアプリ)とJMSProvider(WMQ etc)とを
 接続させるために必要な情報。
 この際、
 JNDI等で、
 予め登録済みの各種情報にアクセスする。
 (WMQのMQEnvironmentの設定に相当)
 //InitialContextFactoryの生成
 java.util.Hashtable env = new Hashtable();
 env.put(Context.INITIAL_CONTEXT_FACTORY, icf);
 env.put(Context.PROVIDER_URL, url);
 Context ctx = new InitialContext(env);
 //ConnectionFactoryの取得
 ConnectionFactory factory;
 factory = (ConnectionFactory)ctx.lookup(...);
③Destinationの取得
 Destinationとは、
 メッセージの送信先/取り出し元のオブジェクト(キュー)。
 予めネームスペースにその実体や名前や各種属性を登録しておき、
 JMSClientがlookupすることで
 Destinationを取得する。
 ※実体はQueueかTopic
 Queue q;
 q = (Queue) ctx.lookup(hogeQueue);
④Connectionの生成
 qMgrに接続するための環境設定と
 Connectionオブジェクトの生成
 //ConnectionFacotryからConnectionを生成
 Connection con = factory.createConnection();
 //生成したConnectionはまだ停止状態
 ※このConnectionオブジェクトは
  JMSClientとJMSProviderとの
  networkLevelの接続的イメージ
⑤Sessionの生成
 ConnectionオブジェクトからSessionオブジェクトの生成
 Sesseion session = con.createSession(
  transactionFlag/*同期点処理するかの指定*/,
  Session.AUTO_ACKNOWLEDGE/*省略値*/
  );
⑥MessageProducerの生成 / ⑨MessageConsumerの生成
 ⑥MessageProducer msgSender;
  msgSender = session.createProducer( myQueue );
  connection.start();
 ⑨MessageConsumer msgReceiver;
  msgReceiver = session.createConsumer( myQueue );
  connection.start();
⑦Messageの生成 / ⑩Messageの受信
 ⑦String msgContent = "contents";
  TextMessage msg;
  msg = session.createTextMessage( );
  msg.setText( msgContent );
 ⑩long waitInteral = 3000; // メッセージ受信待ち時間(msec)
  Message receivedMsg = msgReceiver.receive(waitInterval);
⑧Messageの送信 / ⑪メッセージタイプの確認と処理
 ⑧mySender.send( msg );
 ⑪if( receivedMsg instanceof TextMessage ){
   // TextMessage処理
   String userData = ( (TextMessage)receivedMsg ).getText( );
   .......
  }else if( receivedMsg instanceof MapMessage ){
   // MapMessage処理
  }else if...
⑫オブジェクトのクローズ
 msgSender/msgReceiver.close();
 session.close();
 connection.stop();
 connection.close();


■MQ Base Java & JMS
MQ Base JavaはMQIをJavaへ移植したAPI
JMSはJ2EE標準におとづくAPI

MQ Base Javaは 通常のMQIで出来る殆どの操作が可能
JMSは 通常のMQIで出来る操作が可能とは限らない
MQ Base Javaは
MQMD.MsgIdの指定が可能
メッセージのSegmentatin/Groupingが可能

→MQ Base Javaが優位

JMSは
MessageSelectorをサポート
Pub/Sub機能をサポート
非同期リスナをサポート
する
→JMSが優位

□JMS/ MessageSelector
MQ Base JavaはMsgIdとCorrelIdのみが判断材料なのに対し、
MessageSelectorはプロパティをも判定材料とできる。

// 検索条件の設定(Message Selectorの生成)
String msgSelector = "(Weather = Rain) or (Weather = Typhoon)";
MessageConsumer msgReceiver;
// myQueueは、先に取得済み(Queueオブジェクト)
msgReceiver = session.createConsumer( myQueue, msgSelector );
// この後メッセージ受信を開始すると、プロパティーの"Weather"が
// "Rain"か"Typhoon"という値になっているメッセージだけを
// このアプリケーションは読み出すことになる.


■選択
1つアプリでMQ Base JavaとJMSの両方を使うことは不可。
→どちらかを選択する。



ref:
http://download.boulder.ibm.com/ibmdl/pub/software/dw/jp/websphere/wmq/mq_intro/9.pdf

tag : WMQ WebSphere JMS

2009-06-16 22:13 : __j2ee__jms : コメント : 0 : トラックバック : 0 :
ホーム  次のページ »

search

ad



counter


tag cloud

category cloud