Posts tagged ‘Java’

jBatch(JSR-352) on Java SE 環境

先日のデブサミの発表後、jBatch (JSR-352) についてご質問を頂き、また別件でも同じ質問を頂きましたので、その内容を共有致します。

jBatch を cron 等で実行したいのだが、jBatch は Java EE 環境でしか実行できないのか?とのご質問を頂きました。
答えは、jBatch の仕様上、Java SE 環境上でも動作するように実装されております。

ただし、Java EE 環境上で実装する方がとても簡単に実装・運用ができますので個人的にはJava EE 環境上での動作をお薦めします。仮に Java SE 環境上で jBatch (jBatch の RI)を実行したい場合は下記をご参照ください。

1. 準備

Java SE 環境上で jBatch を稼働させるためには、JavaDB(Derby) が必要です。
また、jBatch の RI を使って Java SE 環境上で動作させるためには、
jBatch RI の実行に必要なライブラリ一式を下記より入手します。

https://java.net/projects/jbatch/downloads/download/jsr352-SE-RI-1.0.zip

zip を展開すると下記のファイルが含まれています。下記全ファイルを lib 配下にコピーしてください。

  • derby.jar
  • javax.inject.jar
  • jsr352-SE-RI-javadoc.jar
  • javax.batch.api.jar
  • jsr352-RI-spi.jar
  • jsr352-SE-RI-runtime.jar

2. Batch コンテナを実行するための設定

次に Batch コンテナを稼働させるためのプロパティの設定を行います。
META-INF ディレクトリ配下に services ディレクトリを作成して
それぞれ下記のファイルを作成してください。

src/META-INF/services/batch-config.properties

JDBC_DRIVER=org.apache.derby.jdbc.EmbeddedDriver
# JDBC_URL=jdbc:derby://localhost:1527/batchdb;create=true
JDBC_URL=jdbc:derby://localhost:1527/batchdb

src/META-INF/services/batch-services.properties

J2SE_MODE=true

以上で基本的には Java SE 環境上で動作させるために必要な設定は完了です。

3. 動作確認

それでは、バッチであるファイルの内容を別のファイルに書き出すサンプルを作成します。(※ 以降は Java EE 環境での実装と同じです。)
下記に、本 jBatch プロジェクトのディレクトリ構成を下記に示します。

まず、メイン・メソッドから Batch の JOB: “my-batch-job” を起動します。

package com.yoshio3.main;

import java.util.Properties;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;

/**
 *
 * @author Yoshio Terada
 */
public class StandAloneBatchMain {

    public static void main(String... args) {
        JobOperator job = BatchRuntime.getJobOperator();
        long id = job.start("my-batch-job", new Properties());
    }    
}

この、”my-batch-job” の処理内容は、META-INF/batch-jobs ディレクトリ配下に、”my-batch-job.xml” として定義します。

“my-batch-job” の内容を下記に示します。プロパティを2つ input_file,output_file 定義し、それぞれ /tmp/input.txt, /tmp/output.txt を示します。また、JOB の step としてチャンク形式の step を1つ定義し、データの読み込み用(reader)、処理用(processor)、書き込み(writer)用の処理を、それぞれ、MyItemReader, MyItemProcessor, MyItemWriter に実装します。

<job id="my-batch-job"
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
    <properties>
        <property name="input_file" value="/tmp/input.txt"/>
        <property name="output_file" value="/tmp/output.txt"/>
    </properties>

    <step id="first-step">
        <chunk item-count="5">
            <reader    ref="com.yoshio3.chunks.MyItemReader"/>
            <processor ref="com.yoshio3.chunks.MyItemProcessor"/>
            <writer    ref="com.yoshio3.chunks.MyItemWriter"/>
        </chunk>
    </step>
</job>

読み込み用の処理は、ItemReader を実装したクラスを作成します。ここでは、input_file で指定されたプロパティのファイル(/tmp/input.txt)ファイルを読み込み、1行読み込んでその値を返します。

package com.yoshio3.chunks;

import java.io.BufferedReader;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.batch.api.chunk.ItemReader;
import javax.batch.runtime.context.JobContext;
import javax.inject.Inject;

public class MyItemReader implements ItemReader {

    @Inject
    JobContext jobCtx;

    BufferedReader bufReader;

    @Override
    public void open(Serializable checkpoint) throws Exception {        
        String fileName = jobCtx.getProperties()
                .getProperty("input_file");
        bufReader = Files.newBufferedReader(Paths.get(fileName),Charset.forName("UTF-8"));
    }

    @Override
    public void close() throws Exception {
        bufReader.close();
    }

    @Override
    public Object readItem() throws Exception {
        String data = bufReader.readLine();
        System.out.println("Reader readItem : " + data);
        return data;
    }

    @Override
    public Serializable checkpointInfo() throws Exception {
        return null;
    }
}

次に、読み込んだデータの加工処理部分は、ItemProsessor を実装したクラスに記述します。ここでは、読み込んだデータ(文字列)に対して、文字列を付加して返しています。

package com.yoshio3.chunks;

import javax.batch.api.chunk.ItemProcessor;

/**
 *
 * @author Yoshio Terada
 */
public class MyItemProcessor implements ItemProcessor {

    @Override
    public Object processItem(Object item) throws Exception {
        String line = (String)item ;
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("Processor processItem : ");
        sBuilder.append(line);
        String returnValue = sBuilder.toString();
        System.out.println(returnValue);
        return returnValue;
    }    
}

最後に書き出し部分を ItemWriter を実装したクラスに記述します。ここでは、oputput_file のプロパティを取得して書き出すファイル名を取得しています。次にファイルに対して取得したデータを書き出しています。

package com.yoshio3.chunks;

import java.io.BufferedWriter;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import javax.batch.api.chunk.ItemWriter;
import javax.batch.runtime.context.JobContext;
import javax.inject.Inject;

/**
 *
 * @author Yoshio Terada
 */
public class MyItemWriter implements ItemWriter {

    @Inject
    JobContext jobCtx;

    String fileName;

    BufferedWriter bufWriter;

    @Override
    public void open(Serializable checkpoint) throws Exception {
        fileName = jobCtx.getProperties()
                .getProperty("output_file");
        bufWriter = Files.newBufferedWriter(Paths.get(fileName), Charset.forName("UTF-8"));
    }

    @Override
    public void close() throws Exception {
        bufWriter.close();
    }

    @Override
    public void writeItems(List<Object> items) throws Exception {
        for (Object obj : items) {
            String data = (String) obj;
            System.out.println("Writer writeItems : " + data);

            bufWriter.write(data);
            bufWriter.newLine();
        }
    }

    @Override
    public Serializable checkpointInfo() throws Exception {
        return null;
    }
}

上記を実装した後、コンパイルをしてください。


# java -classpath
  lib/jsr352-ri-1.0/javax.inject.jar:
  lib/jsr352-ri-1.0/derby.jar:
  lib/jsr352-ri-1.0/jsr352-RI-spi.jar:
  lib/jsr352-ri-1.0/javax.batch.api.jar:
  lib/jsr352-ri-1.0/jsr352-SE-RI-javadoc.jar:
  lib/jsr352-ri-1.0/jsr352-SE-RI-runtime.jar:
  build/classes com.yoshio3.main.StandAloneBatchMain

実行すると下記のようなログを確認できます。chunk 形式ではデフォルトで 10 件まとめて読み込み&処理を実施し、
まとめて 10 件書き込むという動作を下記からも確認できるかと思います。

2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createSchema
情報: JBATCH schema does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: CHECKPOINTDATA table does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: JOBINSTANCEDATA table does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: EXECUTIONINSTANCEDATA table does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: STEPEXECUTIONINSTANCEDATA table does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: JOBSTATUS table does not exists. Trying to create it.
2 18, 2014 12:10:50 午後 com.ibm.jbatch.container.services.impl.JDBCPersistenceManagerImpl createIfNotExists
情報: STEPSTATUS table does not exists. Trying to create it.
Reader readItem : hogehoge1
Processor processItem : hogehoge1
Reader readItem : hogehoge2
Processor processItem : hogehoge2
Reader readItem : hogehoge3
Processor processItem : hogehoge3
Reader readItem : hogehoge4
Processor processItem : hogehoge4
Reader readItem : hogehoge5
Processor processItem : hogehoge5
Reader readItem : hogehoge6
Processor processItem : hogehoge6
Reader readItem : hogehoge7
Processor processItem : hogehoge7
Reader readItem : hogehoge8
Processor processItem : hogehoge8
Reader readItem : hogehoge9
Processor processItem : hogehoge9
Reader readItem : hogehoge10
Processor processItem : hogehoge10
Writer writeItems : Processor processItem : hogehoge1
Writer writeItems : Processor processItem : hogehoge2
Writer writeItems : Processor processItem : hogehoge3
Writer writeItems : Processor processItem : hogehoge4
Writer writeItems : Processor processItem : hogehoge5
Writer writeItems : Processor processItem : hogehoge6
Writer writeItems : Processor processItem : hogehoge7
Writer writeItems : Processor processItem : hogehoge8
Writer writeItems : Processor processItem : hogehoge9
Writer writeItems : Processor processItem : hogehoge10
Reader readItem : hogehoge11
Processor processItem : hogehoge11
Reader readItem : hogehoge12
Processor processItem : hogehoge12
Reader readItem : hogehoge13
Processor processItem : hogehoge13
Reader readItem : hogehoge14
Processor processItem : hogehoge14
Reader readItem : hogehoge15
Processor processItem : hogehoge15
Reader readItem : hogehoge16
Processor processItem : hogehoge16
Reader readItem : hogehoge17
Processor processItem : hogehoge17
Reader readItem : hogehoge18
Processor processItem : hogehoge18
Reader readItem : hogehoge19
Processor processItem : hogehoge19
Reader readItem : hogehoge20
Processor processItem : hogehoge20
Writer writeItems : Processor processItem : hogehoge11
Writer writeItems : Processor processItem : hogehoge12
Writer writeItems : Processor processItem : hogehoge13
Writer writeItems : Processor processItem : hogehoge14
Writer writeItems : Processor processItem : hogehoge15
Writer writeItems : Processor processItem : hogehoge16
Writer writeItems : Processor processItem : hogehoge17
Writer writeItems : Processor processItem : hogehoge18
Writer writeItems : Processor processItem : hogehoge19
Writer writeItems : Processor processItem : hogehoge20
Reader readItem : null

書き込む間隔を変更したい場合は、Job XML の設定を変更し<chunk item-count=”5″>を設定します。

<job id="my-batch-job"
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
    <properties>
        <property name="input_file" value="/tmp/input.txt"/>
        <property name="output_file" value="/tmp/output.txt"/>
    </properties>

    <step id="first-step">
        <chunk item-count="5">
            <reader    ref="com.yoshio3.chunks.MyItemReader"/>
            <processor ref="com.yoshio3.chunks.MyItemProcessor"/>
            <writer    ref="com.yoshio3.chunks.MyItemWriter"/>
        </chunk>
    </step>
</job>

<chunk item-count=”5″>を設定した後、実行すると下記のような結果が得られます。

run:
Reader readItem : hogehoge1
Processor processItem : hogehoge1
Reader readItem : hogehoge2
Processor processItem : hogehoge2
Reader readItem : hogehoge3
Processor processItem : hogehoge3
Reader readItem : hogehoge4
Processor processItem : hogehoge4
Reader readItem : hogehoge5
Processor processItem : hogehoge5
Writer writeItems : Processor processItem : hogehoge1
Writer writeItems : Processor processItem : hogehoge2
Writer writeItems : Processor processItem : hogehoge3
Writer writeItems : Processor processItem : hogehoge4
Writer writeItems : Processor processItem : hogehoge5
Reader readItem : hogehoge6
Processor processItem : hogehoge6
Reader readItem : hogehoge7
Processor processItem : hogehoge7
Reader readItem : hogehoge8
Processor processItem : hogehoge8
Reader readItem : hogehoge9
Processor processItem : hogehoge9
Reader readItem : hogehoge10
Processor processItem : hogehoge10
Writer writeItems : Processor processItem : hogehoge6
Writer writeItems : Processor processItem : hogehoge7
Writer writeItems : Processor processItem : hogehoge8
Writer writeItems : Processor processItem : hogehoge9
Writer writeItems : Processor processItem : hogehoge10
Reader readItem : hogehoge11
Processor processItem : hogehoge11
Reader readItem : hogehoge12
Processor processItem : hogehoge12
Reader readItem : hogehoge13
Processor processItem : hogehoge13
Reader readItem : hogehoge14
Processor processItem : hogehoge14
Reader readItem : hogehoge15
Processor processItem : hogehoge15
Writer writeItems : Processor processItem : hogehoge11
Writer writeItems : Processor processItem : hogehoge12
Writer writeItems : Processor processItem : hogehoge13
Writer writeItems : Processor processItem : hogehoge14
Writer writeItems : Processor processItem : hogehoge15
Reader readItem : hogehoge16
Processor processItem : hogehoge16
Reader readItem : hogehoge17
Processor processItem : hogehoge17
Reader readItem : hogehoge18
Processor processItem : hogehoge18
Reader readItem : hogehoge19
Processor processItem : hogehoge19
Reader readItem : hogehoge20
Processor processItem : hogehoge20
Writer writeItems : Processor processItem : hogehoge16
Writer writeItems : Processor processItem : hogehoge17
Writer writeItems : Processor processItem : hogehoge18
Writer writeItems : Processor processItem : hogehoge19
Writer writeItems : Processor processItem : hogehoge20
Reader readItem : null

以上のように、Java SE の環境でも jBatch (JSR-352) を実行する事ができます。今回は参考のため jBatch の RI を使用しましたが、各 Java EE 7 準拠のアプリケーション・サーバで必要なライブラリはそれぞれ異なるかと想定します。必要なライブラリは各アプリケーション・サーバでお調べください。

2014年2月18日 at 12:51 午後 2件のコメント

Java EE 7 トレーニング・コースについて

Oracle University では、現在 Java EE 7 のトレーニング・コース(Java EE 7: New Features Coming Soon (¥145,530) )を全世界への提供に向けて準備しています。

これは、Java EE 7 に含まれる新機能を2日間で紹介し、加えてラボで実際に手を動かしながら演習を行うこともできるトレーニング・コースになっています。これによりいち早く Java EE 7 の全体像とプログラミング方法を習得できます(このトレーニング・コースに関してはレビューの要望が私の元にも入ってきたため、一部私もレビューをし改善を加えた部分もあります)。

本トレーニング・コースでは Batch, JSON, WebSocket, JAX-RS, EL 3.0, JMS 2.0 , EJB, JPA, CDI, Bean Validation 等 Java EE 7 に含まれるの技術をとりあげ、既存のアプリケーションを Java EE 7 に対応させるために必要な情報も提供してくれます。

本トレーニング・コースについて日本の担当者と話をした所、本コースは世界で正式公開された後も、現時点では英語でのみ提供予定のようです。ただし、日本の Oracle University に対して、日本語での開催リクエストを行い、かつご希望者が多い場合、日本人講師による日本語でのサービス提供も可能との事でした。

Java EE 7 のトレーニング・コースを日本語で受講されたい方は、今から本トレーニング・コースに対する日本語開催リクエストを出されてみては如何でしょうか。

トレーニングの紹介ページにアクセスした後、「コース開催日のリクエスト」を押下するとリクエストを行う事ができます。途中の質問で「集合研修(Clasroom Training)」にチェックしてください。

どうぞ宜しくお願いします。

2013年6月14日 at 5:29 午後

Virtual Developer Day-Java 開催 (6/19 or 6/25)




Oracle Technology Network (通称:OTN) 主催で Virtual Developer Day : Java が開催されます。下記のスケジュールに詳細を記述していますが、Java SE/FX/Embedded/EE の各テクノロジーに関して、無償で、オンラインでご覧頂く事ができます。Java SE 8 に含まれる 52 の新機能、Lambda 式、JavaFX、Java EE 7、Raspberry Pi など各テクノロジーの最新情報をご確認いただけます。またライブ・チャットもご用意しておりますので、エキスパートに対して直接質問を投げかける事もできます。本イベントにご興味のある方はご登録の上受講してください。
(※ 日本の開発者の皆様は恐らく 6 月 25 日開催のヨーロッパ向けの方が受講しやすい時間帯かと思います。)

  • アメリカ    :6 月 19 日(日本時間夜中の1時〜5時)
  • ヨーロッパ:6 月 25 日(日本時間夕方5時〜9時)

詳しくは、コチラをご参照ください。

2013年6月14日 at 3:28 午後

JJUG CCC 2013 Spring の発表資料について

本日、JJUG CCC 2013 Spring が開催されました。Oracle からはUS Oracle Corporation からJim Weaver (Twitter : @JavaFXpert) が基調講演で「What’s New for JavaFX in JDK 8」を発表し、午後一のセッションで、「Java EE 6 から Java EE 7 に向かって」というセッションを担当しそれぞれ発表しました。2人の発表資料を公開しましたのでご報告します。

(※ 私のプレゼン資料ですが、SlideShare にアップロードした際、SlideShare 側の問題で、フォントが無いせいか、私が使用しているオリジナル・フォントからは変わって表示されています。その点ご了承頂ければ幸いです。)


基調講演-2 What’s New for JavaFX in JDK 8


H-1 Java EE 6 から Java EE 7 に向かって

今日の私のプレゼン中で行った EL(Expression Language) 3.0のデモのソース・コードも下記に公開します。デモ用に簡単に作ったものであるため、本来 JPA で DB 接続すべき所を簡単にダミーデータ(Person#createDummyData())を作成しています。

本コードは JSF 2.0 と CDI をご存知の方であれば容易にご理解いただけるかと思いますが、「全データ抽出」のボタンを押下すると、CDI の getAllData() が呼び出され、indexManagedBean.data(ArrayList) に全データがコピーされ、その一覧が dataTable に表示されます。

次に、「年齢フィルタ」のテキストフィールド(デフォルト:0)に対して年齢を入力すると、入力された年齢以上のデータを表示しています。内部的には Ajax を使って、入力された年齢情報(indexManagedBean.ageFileter)をサーバに送信し、Ajax のリスナーとして定義しているindexManagedBean.updateData()を実行していいます。ただ、indexManagedBean.updateData()は処理は何もしていません、ここでは execute=”ageFilter” をサーバに送信し、その結果を render=”tabledata” 、つまり dataTable の内容を更新するためだけにupdateData()を呼び出しています。

<h:dataTable id="tabledata" value="#{afilter = indexManagedBean.ageFileter;indexManagedBean.data.stream().filter(p-> p.age >= afilter).toList()}" var="person" border="1">

この例では、一度 DBに対してクエリを実行し、その結果をコレクションにコピーした後、さらにそのコピーしたデータに対して絞り込みを行っています。DB に対して再度クエリをなげるのではなく、EL 3.0 の Lambda 式を使って、一旦取得したデータを元に再フィルタリングを 行っています。

セッション中でも話をしましたが EL 3.0 で Lambda 式(及び LINQ 式)が使えるようになった事でビューにロジックを埋め込む事が可能になりますが、あまりやりすぎると可読性の低下にもつながりますので使う範囲はよくご検討頂いた方がよいのではないかと思います。(※ .Net の LINQ 式は DB に対しても操作可能ですが、EL 3.0 における LINQ 式はコレクションに対してのみ有効です。)

今回の例では、一旦取得したデータのフィルタンリグ等でご使用頂く事で、DB に対する負荷、インメモリ・グリッドにあるキャッシュから取得するよりもパフォーマンスがよくなる事を想定し記載しています。なぜならばヒープメモリ内にあるデータを直接操作する方がパフォーマンス的に優れるためです。(※ コレクションに対して有効な操作である事をご認識頂き用途は十分にご検討ください。)

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      >
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="全データ抽出" action="#{indexManagedBean.getAllData()}"/><br/>

            <h:outputLabel value="年齢フィルタ"/>:
            <h:inputText id="ageFilter" value="#{indexManagedBean.ageFileter}" autocomplete="off">
                <f:ajax event="keyup" execute="ageFilter" render="tabledata" listener="#{indexManagedBean.updateData()}"/>
            </h:inputText>

            <h:dataTable id="tabledata" value="#{afilter = indexManagedBean.ageFileter;indexManagedBean.data.stream().filter(p-> p.age >= afilter).toList()}" var="person" border="1">
                <h:column> 
                    <f:facet name="header">
                        <h:outputText value="名前"/> 
                    </f:facet>
                    <h:outputText value="#{person.name}"/>
                </h:column> 
                <h:column> 
                    <f:facet name="header">
                        <h:outputText value="年齢"/> 
                    </f:facet>
                    <h:outputText value="#{person.age}"/>
                </h:column> 
                <h:column> 
                    <f:facet name="header">
                        <h:outputText value="性別"/> 
                    </f:facet>
                    <h:outputText value="#{person.sex}"/>
                </h:column> 
            </h:dataTable>
        </h:form>
    </h:body>
</html>
package jp.co.oracle.ee7samples.cdi;

import java.util.ArrayList;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import jp.co.oracle.ee7samples.model.Person;

@Named
@ViewScoped
public class IndexManagedBean {

    private ArrayList data;
    private Integer ageFileter;

    public ArrayList getData() {
        return data;
    }

    public void setData(ArrayList data) {
        this.data = data;
    }

    public Integer getAgeFileter() {
        if (ageFileter == null) {
            return new Integer(0);
        }
        return ageFileter;
    }

    public void setAgeFileter(Integer ageFileter) {
        this.ageFileter = ageFileter;
    }

    public String getAllData() {
        setData(Person.createDummyData());
        return "";
    }

    public String updateData() {
        return "";
    }
}

デモの中でもお伝えしましたが、本来 JPA で DB に接続して Person Entity に対して全レコードを抽出するコードを書く方が現実的なのですが、EL 3.0 は本来 Collection を対象とする事をわかりやすくするため、JPA を使わずに自分でダミーのデータをcreateDummyData()で作成しています。

package jp.co.oracle.ee7samples.model;

import java.util.ArrayList;

public class Person {
    private String name;
    private Integer age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public static ArrayList createDummyData() {
        ArrayList<Person> data = new ArrayList<>();
        Person person;
        for (int i = 0; i < 100; i++) {
            person = new Person();
            person.setAge(Integer.valueOf(i));
            if (i % 2 == 1) {
                person.setName("山田 太郎" + i);
                person.setSex("男性");
            } else {
                person.setName("山田 花子" + i);
                person.setSex("女性");
            }
            data.add(person);
        }
        return data;
    }
}

2013年5月11日 at 3:01 午後

デブサミの発表資料公開と Java イベントのご案内

2013年2月14日(木)・15日(金)目黒雅叙園で開催された Developers Summit 2013 (通称 デブサミ2013)に参加しました。今回のデブサミのテーマは Action という事で、Java で今現在とるべき Action 、将来に備えた Action を下記に分類し紹介致しました。

● 今とるべき Action
 1. Java SE 7 のご適用
 2. JavaFX の導入
 3. Java EE 6 のご適用
● 将来に備えて準備 Action
 4. Java EE 7 の情報収集&事前検証
 5. Java SE 8 の情報収集&事前検証
● 今後の情報収集、貢献などの Action
 6. Participation (参加)
 7. Java イベントのご案内 (2013/5/14)




発表の中で、
オラクル主催の Java イベントの日程も公開致しました。追って詳細はご案内致しますが、日程は、2013 年 5 月 14 日(火)に正式決定致しました。

昨年の JavaOne Tokyo 後から、多くの Java 技術者の皆様から次回の JavaOne Tokyo の開催希望を頂いておりました(Togetter : またJavaOne Tokyoやってほしいなぁ)。このように開発者の皆様から頂いたお声に応えるために、かねてより社内で Java セミナー開催の企画を行なっておりましたが、ようやく日程を正式に公開できる運びとなりました。今回のイベントは、JavaOne という名前のイベントではございませんが、丸1日 Java の技術だけを扱うイベントになります。また昨年の JavaOne Tokyo 同様、海外からエンジニアを呼ぶ事も決まっております。
Java の開発者の皆様におかれましては、是非今から 5 月 14 日(火)のスケジュールを確保頂き、是非、本イベントまで足をお運びいただければ誠に幸いです。

また、上記イベントの直前である、5 月 11 日(土)には、日本 Java ユーザ・グループでも JJUG CCC Spring 2013 の開催を予定しております。そして只今、JJUG CCC Call for Papers の募集も行なっていますので、JJUG のイベントで登壇してみたいという方がいらっしゃいましたら、是非 Call for Papers へご応募ください。

ゴールデン・ウィーク後1週間は、日本で Java ウィークになりますので、皆様どうぞ楽しみにしていてください。

両イベントで皆様とお会いできる事を心より楽しみに致しております。

2013年2月15日 at 6:00 午後

WebLogic Server 12c Forum 2013 開催


「WebLogic Server 12c Forum 2013
       ~ Java EEの現在と未来、WebLogicが拓く新たな可能性 ~ 」

  日時 :2013年2月1日(金)13:30~17:30 (受付開始 13:00~)
  場所: オラクル青山センター
     〒107-0061 東京都港区北青山2-5-8
  お申し込み:コチラから

2013/02/01 にオラクル青山センターで WebLogic/Java EE 関連のイベントを開催します。本セミナーでは US 本社より Fusion Middleware の Product Management である、マイク・リーマンを招き、世界のJava EE 6活用状況や、昨年開催した Oracle OpenWorld における WebLogic Server の最新情報、さらには今後のWebLogic の姿に至るまで、様々なトピックをご紹介致します。


アジェンダ

13:30~13:35 開催のご挨拶
13:35~14:40 WebLogic Server12cの現在と未来、そして新たな取り組み  
14:50~15:35 Oracle RAC の性能を最大限に引き出す!:
       WebLogic 新機能 Active GridLink for RAC の詳細解説
15:35~15:50 コーヒーブレイク
15:50~16:20 Java EE 6 – 今注目すべきポイント
16:20~17:30 【Java EE Special Panel Discussion】【同時通訳】
       Java EE 6の現在とJava EE 7、そしてその先へ
17:30~ オラクル社員犬 キャンディ がお見送り

個人的には、中でも Oracle RAC の性能を最大限に引き出す Active GridLink for RAC の性能検証に興味があります。これは Oracle と NEC さんとで実際に検証を行なった内容の詳細を発表する予定ですが、とても興味深い内容です。

皆様のご参加を心よりお待ち申し上げます。

2013年1月17日 at 6:22 午後

JavaOne 2011 サンフランシスコ

コミュニティからの多大な建設的なご意見とご支援を頂いた後、我々は 2011年10月2日から6日までの間、サンフランシスコで JavaOne 2011 の開催を決定した事をここにお知らせします。JavaOne イベントに対する投資の拡大と、イベントに対する多くの大幅な改善により、Oracle は JavaOne を再び成功させるために、今年もそして今後も取り組んでまいります。

過去 15 年間、JavaOne は Java コミュニティと共に協力して教育イベントを導いてきました。今年は 待望の JDK 7 や JavaFX 2.0 がリリースされる Java にとってエキサイティングな年になり、イベントでは今までと同様、最新の技術コンテンツを提供する他、今後 Java が提供する新機能等の情報を提供します。
また前回の JavaOne カンファレンスと同様、Oracle は今年のイベントで提供するコンテンツを作成するため、 Java コミュニティのリーダを通じてアイディアを募集しています。2010 年のコンテンツ制作メンバーはこちらからご確認いただけます。 JavaOne Program Review Committee page

Call for Papers

我々は、Call for Papers の募集開始を 4/27 を予定し 5/23 に終了する事を予定しています。そこで募集開始のアナウンスを注意してお待ちください。今年は下記の技術的トラックが用意されており、これらの技術トピックの中から検討し応募頂く事が可能です。

1. コア Java プラットフォーム
2. 新しいプログラミング言語、ツール、技術
3. エンタープライズ・サービス・アーキテクチャやクラウド
4. Java EE Web プロファイルや Enterprise Platform の技術
5. Java ME, モバイル, 組み込み、デバイス
6. Java SE, クライアント技術、リッチクライアント技術
7. Java フロンティア

Call For Papers に対して何らかの疑問がある場合は、speaker-services_ww@oracle.com までどうぞご連絡ください。

JavaOne カンファレンスの改善

  • Oracle OpenWorld と同一週にイベントは開催されますが、JavaOne は、独自の完全専用会議スペースを用意し OpenWorld とは別イベントとして、また単独カンファレンスとして開催します。
  • 技術セッションや、BoF、ハンズオンラボを含むコンテンツを増加します。
  • カンファレンス開催期間中、開発者が対話やコラボレーションできるような時間と空間を提供します。
  • イベントの計画や進行に関してコミュニティの代表者に直接関与して頂きます。

登録

カンファレンスの経験を最大限に活用する最善の方法は、イベントに対する早期の登録とホテルのベストレートを確保する事です。早期登録により、より良い宿泊オプションを得る事ができるでしょう。 ご登録はこちらから

JavaOne に関する情報提供の継続

JavaOne カンファレンスに関するニュースを継続して受け取りたい場合、 JavaOne Conference blog をブックマークして頂くか、もしくは web site へご訪問ください。また下記の SNS を利用する事も可能です。
• Twitter: @javaoneconf
• Facebook: http://www.facebook.com/javaone
• LinkedIn: http://www.linkedin.com/groups?gid=1749197

この記事は下記の記事の翻訳です。
JavaOne 2011

2011年4月26日 at 11:33 午前

EJB 3.1 の新機能概要

EJB 3.1 の新機能をプレゼン形式でまとめてみました。
かんたんに概要を紹介します。

EJB 3.0 から EJB 3.1 になり、かんたん開発に向けて多くの改善が施されています。まず、パッケージの簡略化が挙げられます。今までアプリケーションの種類に応じて .ear, .war 等のアーカイブにまとめる必要がありましたが、EJB コンポーネントも .war に含めることができるようになったため開発時の手間が大幅に削減されます。また、EJB 3.1 Lite が提供されフル Java EE の機能の一部の機能だけを利用できるようになったため、フル Java EE の機能が必要ないお客様にとっては不要なメモリリソースを消費せずに運用できる等のメリットがあります。

次のポイントはローカルビジネスインタフェースの実装が必要なくなった点です。これは開発者の生産性が向上するだけではなく、修正の手間も大幅に削減してくれます。例えば、過去に実装したクラスにおいて、特定のメソッドに対する引数や返り値の変更が必要になった場合を想定してください。今まではインタフェースのメソッド定義と実装クラスのメソッド定義を両方変更しなければなりませんでしたが、インタフェースの定義が必要がなくなったため、実装クラスのメソッド定義を変更するだけでよくなります。

次に、移植可能な Global JNDI 名では、今までベンダー独自に実装していた Global の JNDI 名が仕様の中で標準化されましたので、今後アプリケーションを他のアプリケーションサーバへ移行したいような場合、Global JNDI 名を変更する必要がなくなり移植性が高まります。

また、Java SE に組み込み可能な EJB コンテナ は開発時におけるテストの手間を大幅に削減してくれるようになります。今までは EJB のアプリケーションをテストする際、アプリケーションサーバにデプロイして Global 経由でアクセスする等の必要がありました。これは別の Java VM のプロセスとして稼働するためデバッグ等も困難でしたが、EJB 3.1 では Java SE のプロセス内に EJB コンテナをロードして実行する事ができるようになるため、同一 Java プロセス内で処理ができる他、EJB の単体テスト等がしやすくなります。

その他の追加機能として、Singleton Session Beans が追加された事が挙げられます。これはアプリケーション間で同一の情報を扱いたい場合に有効です。今までは独自に Singleton のクラスを作成して運用しなければなりませんでしたが、クラスタ環境のように複数台で実現するためには苦労していたかと思います。なぜなら異なる JVM プロセスの間で Sigleton のインスタンスを共有させる事は面倒だったからです。しかしEJB 3.1で提供する Singleton Session Bean はコンテナを跨ぐ環境においても唯一のインスタンスが保障されるため、こういった実装の手間が必要なく、アノテーションの追加だけで利用できるようになります。その他、タイマーサービスや非同期処理もそれぞれアノテーションを利用して簡単に実装できるようになっています。

最後に、
EJB といえば実装が難しい、設定も面倒という時代は今や過去の事で、今では実装がとてもかんたんになっています。また便利な機能をデフォルトで数多く持っている便利なフレームワークですので、今一度EJB を見直し利用をご検討ください。



























2010年4月7日 at 8:32 午後

Java SE 5 Update 19 リリース



Java エバンジェリストの戸島さんから教えて頂いたのですが、

Java SE 5 Update 19 がリリースされたようです。



このバージョンから IE8, Windows Server 2008 がサポートされるように

なったとようです。configuration の page には vista もリストされているので

vista も対応されたようです。




http://java.sun.com/j2se/1.5.0/ReleaseNotes.html#150_19



http://java.sun.com/j2se/1.5.0/system-configurations.html




IE8, Windows Server 2008, Vista ユーザの皆様

お待たせいたしました。


2009年5月20日 at 12:36 午前

Java EE 6のパブリックレビューが承認



Java EE 6の承認がおりたみたいですね。



JavaOne 2009まで残り4ヶ月ですが、

JavaOne 2009の目玉になりそうですね。




JSR #316 JavaTM Platform, Enterprise Edition 6 (Java EE 6) Specification

Public Review Ballot




PS.

時期的に、残り4ヶ月で GlassFish v3(Java EE 6のRI) が

完成するかどうかは微妙ですが、是非開発者の皆様

頑張ってほしいです。


2009年2月25日 at 8:46 午後

新しい投稿


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2022年11月
 123456
78910111213
14151617181920
21222324252627
282930  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 1,256,318 hits

RSSフィード

アーカイブ