2011-07-15 13 views
0

私はデータベースからデータを取り出してフォーマットするセッションBeanを持っています。近い将来、データを転送するユーティリティ(XML-RPCをラップする)を呼び出す必要がありますが、今は入力としてファイルを受け取るコマンドラインスクリプトを実行する必要があります(つまり 'command -f filename')。 。私はセッションBeanからファイルを書くというアイデアはあまり好きではありません(JBossはこれをやりましょうか?)、CGIスクリプトへのURLを開いていますが、それは過度のことです。では、このデータをファイルに取り込む最もクリーンでシンプルな方法は何ですか。コマンドを呼び出すことができますか?ステートレスセッションBeanからファイルにデータを移動する

追加情報:

  • 当社のサーバーは、JBossであり、それがクラスタ化されていません。
  • データはかなりのもので、10,000個のXMLエンコードされたデータが含まれている可能性があります(絶対に必要な場合は、小さなチャンクに分割できます)。

TIA、 Ilane

答えて

0

は、ここでファイルにあなたのコンテンツを取得するために、比較的単純なアプローチです。

セッションBeanでは

は、のようなものですビジネスメソッドを実装します。

public Object getContent(String fileName, <Other Args>) { 
    // Get content 
    // write to a byte array 
    byte[] content = ......; 
    return new ByteArrayFile(content, fileName); 
} 

(DBから)データを取得し、一緒に(そしてロードされたバイト配列にそれをシリアル化する必要があるメソッドの実装オプションのファイル名)をByteArrayFileのインスタンスに挿入して返します。

ByteArrayFile は(提供された名前または一時ファイルを使用して)ローカルファイルにバイト配列を変換する方法をreadResolvedとjava.ioとして呼び出し元に返さ実装シリアライズオブジェクトであります.File

ここ ByteArrayFile のラフな実装です:

public class ByteArrayFile implements Serializable { 
    protected final byte[] content; 
    protected final String fileName; 

    /** 
    * Creates a new ByteArrayFile 
    * @param content The file content 
    */ 
    public ByteArrayFile(byte[] content) { 
     this(content, null); 
    } 

    /** 
    * Creates a new ByteArrayFile 
    * @param content The file content 
    * @param fileName The file name to deserialize as 
    */ 
    public ByteArrayFile(byte[] content, String fileName) { 
     super(); 
     this.content = content; 
     this.fileName = fileName; 
    } 

    /** 
    * Returns this object as a resolved file when the object is deserialized. 
    * @return 
    * @throws ObjectStreamException 
    */ 
    protected Object readResolve() throws ObjectStreamException { 
     FileOutputStream fos = null; 
     try { 
      File f = fileName==null ? File.createTempFile(getClass().getSimpleName(), ".file") : new File(fileName); 
      if(!f.canWrite()) { 
       throw new Exception("Unable to write to designated file [" + fileName + "]", new Throwable());    
      } 
      fos = new FileOutputStream(f); 
      fos.write(content); 
      fos.close(); 
      fos = null; 
      return f; 
     } catch (Exception e) { 
      throw new RuntimeException("Failed to readResolve", e); 
     } finally { 
      try { if(fos!=null) fos.close(); } catch (Exception e) {} 
     } 
    } 
} 

これは、 ByteArrayFile を作成し、それをシリアル化して、としてそれを読み戻す表示するために(すなわちないリモートEJBコール)簡単な例でありますファイル:

public static void main(String[] args) { 
    ByteArrayFile baf = new ByteArrayFile("Hello World".getBytes()); 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(baf); 
     oos.flush(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
     ObjectInputStream ois = new ObjectInputStream(bais); 
     File file = (File)ois.readObject(); 
     System.out.println("File:" + file.getAbsolutePath() + " Size:" + file.length()); 
    } catch (Exception e) { 
     e.printStackTrace(System.err); 
    } 
} 

出力された:

ファイル:/tmp/ByteArrayFile2790187442947455193.fileサイズ:真実で11

、セッションBeanは、絶対に直接ファイルを書き込むことができます。厳密なEJBの制限はJBossによって強制されず、気にしないかもしれない移植性の保証を提供するために存在します。ただし、上記のアプローチの利点は、リモートクライアントが遠隔から呼び出しを呼び出すことができますが、ローカルでファイルを取得できることです。

+0

ニコラス - あなたの非常に徹底的な説明に感謝します。 – Ilane

+0

これは、Runtime.getRuntime()。execを使用して必要なコマンドを実行する別の既存のステートレスセッションBeanを呼び出すことによって、ファイルを使用してコマンドを呼び出すセッションBeanです(これはおそらく許可されません)。機能は既に存在します。レガシーソフトウェア - それが大好き!)ビジネスメソッドは "sendContent()"となります。このファイルは、2つのEJBに対してのみ認識されます。オブジェクトをリモートクライアントに渡すのではなく、オブジェクトをどのようにして非直列化しますか。 2番目のセッションBeanのメソッドが引数として呼び出されたときでしょうか? – Ilane

関連する問題