แสดงบทความที่มีป้ายกำกับ java แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ java แสดงบทความทั้งหมด

วันศุกร์ที่ 5 ธันวาคม พ.ศ. 2551

Update ข่าวสารของโลก java และ grails ว่ามีอะไรใหม่ๆ อออกมากันบ้าง

วันศุกร์ที่ 10 ตุลาคม พ.ศ. 2551

java.io.IOException :: Too many open file

วันพฤหัสบดีที่ 9 ตุลาคม พ.ศ. 2551

ทดลองใช้ JSR166y

พอดีไปเห็นบทความเกี่ยวกับ JSR166y ที่นี่ http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro

โดยเป้าหมายหลักของ JSR166y คือ lightweight task framework สำหรับ Java Platform ซึ่งใช้แนวคิดของ Fork and Join Framework เพื่อนำมาแก้ไขปัญหาการใช้งาน Thread ในระบบแบบขนาน เนื่องจาก Thread นั้นกินทรัพยากรของระบบมากจนเกินไป

๋JSR166y นี้เป็น library ตัวใหม่ที่วางแผนไว้ว่าจะเพิ่มเข้าไปใน JDK 7 ครับ

สำหรับ library นั้นสามารถ Download ได้ที่นี่ http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166y.jar

ส่วน JavaDoc ก็ที่นี่ครับ http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/overview-summary.html


ผมลองทำการทดสอบใช้งานดังนี้
- ทำ application เพื่ออ่าน Rss Feed จากหลายๆ เว็บ ดังนี้

Environment ที่ใช้ทดสอบ
- Windows XP
- JDK 6


String[] url = {
"http://www.grails66.com/blog/feed/",
"http://www.rails66.com/blog/feed/",
"http://www.ajax66.com/blog/feed/",
"http://www.seam66.com/blog/?feed=rss2",
"http://www.ofbiz66.com/blog/?feed=rss2"
};

ForkJoinExecutor fje = ParallelArray.defaultExecutor();
ParallelArray p = ParallelArray.createFromCopy(url, fje);
p.replaceWithMapping(new RssFeed());
System.out.println(p.asList());


สร้าง class RssFeed สำหรับการทำงานในแต่ละ process ที่แตกออกมา ( Fork ) ดังนี้

class RssFeed implements Op {

@Override
public String op(String url) {
System.out.println(System.currentTimeMillis() + " : " + url);
return getData(url);
}
}

เมื่อทำการ run แล้วจะเห้นได้ว่าจะไม่ได้ทำการแบบ sequential เลย จะทำงานแบบ parallel ครับ ตรงนี้ทำงานดูดีครับ

หรืออาจจะกำหนด Pool ของ ForkJoin process ได้เองดังนี้

ForkJoinPool pool = new ForkJoinPool(3); // กำหนดเป็น 3
ParallelArray p = ParallelArray.createFromCopy(url, pool);

ทดสอบ run ก็จะได้ผลอีกแบบครับ


เอกสารเพิ่มเติม
http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro

ป้องกันการ run process แบบไม่สิ้นสุดใน Java

วันนี้ทำการทดสอบ migrate data process ซึ่งจะมีบาง process ทำการ run process ผ่าน java.lang.Process

โดยปัญหาที่พบคือ อาจจะมีบาง process ที่ทำงานไม่จบสักที [ ไม่มี signal ออกมาจาก process นั้น ]

ส่วน code ที่เป้นปัญหาคือ มัน
while( true ) {
try {
int process_status = process.waitFor();
break;
} catch( InterruptedException e ) {
}
}

ปัญหามันเกิดขึ้นมาเมื่อ process ไม่มี signal อะไรออกมา

ดังนั้น สามารถแก้ปัญหาได้โดยการใช้ Timer มาช่วย จะกำหนด timeout ได้ ดังนี้

Timer timer = new Timer();
timer.schedule(new InterruptProcess(Thread.currentThread()), 5000);
try {
exitStatus = proc.waitFor();
}
catch (InterruptedException e) {
proc.destroy();
}
finally {
timer.cancel();
}

และ Class InterruptProcess ซึ่งจะ extends มาจาก timerTask ดังนี้

class InterruptProcess
extends TimerTask {
Thread target = null;
InterruptProcess(Thread target) {
this.target = target;
}

/**
* run
*/
public void run() {
target.interrupt();
System.out.print("-|Run Interrupt|-");
}

}

จากตัวอย่าง ผมทำการกำหนด timeout = 5 วินาที ดังนั้นถ้า process มีเวลาทำงานมากที่สุดคือ 5 วินาทีเท่านั้น ส่วน process ที่ run เสร็จเร็วก็ไม่มีปัญหาอะไร

วันศุกร์ที่ 26 กันยายน พ.ศ. 2551

ติดตั้ง RabbitMQ บน windows

หลังจากลองศึกษามาพอสมควรกับ Message Queue Server ตัวนี้ เริ่มจากลองดุที่ภาษา Erlang ซึ่งเป็นภาษาที่เหมาะสมกับระบบที่มี concurrent user จำนวนมาก แตก thread การทำงานได้เยอะๆ [ เขาว่ามาอย่างนั้น ] และมาเจอ MQ ที่ implement ด้วย Erlang คือ RabbitMQ มันยังถูกใช้ใน Twitter ซึ่งปัจจุบันใช้อยู่ประจำ จึงยิ่งทำให้เกิดความสนใจมากขึ้น ไม่พูดมากแล้ว เริ่มเลยดีกว่า ...


RabbitMQ is an implementation of AMQP, the emerging standard for high performance enterprise messaging


ขั้นตอนการติดตั้ง
1. download RabbitMQ Windows Bundle ที่ http://www.rabbitmq.com/download.html โดยใน zip file จะประกอบไปด้วย
- Erlang :: otp_win32_xxxx.exe
- RabbitMq Server :: rabbitmq-server-windows-xxxx.zip
- RabbitMq Client for Java :: rabbitmq-java-client-bin-xxxx.zip

2. ทำการติดตั้ง Erlang
3. extract rabbitmq-server-windows-xxxx.zip จะมี folder -> ebin, sbin, src, include
4. กำหนด env ตาม Link สรุปง่ายๆ เป็นดังนี้
- กำหนด ERLANG_HOME คือ folder ที่ทำการติดตั้ง erlang
- กำหนด RABBITMQ_BASE คือ folder ที่จะใช้เก็บข้อมูลต่างๆ ของ mq เช่น user account, message

5. ทดสอบ run rabbitmq server
- ไปที่ folder sbin ทำการ run
>>rabbitmq-server.bat
จะแสดงผลดังนี้ เป็นอันเสร็จสิ้น

...
starting database ...done
starting core processes ...done
starting recovery ...done
starting persister ...done
starting builtin applications ...done
starting TCP listeners ...done
ิbroke running


มาดูการจัดการหลังการติดตั้ง สามารถเข้าไปดูได้ที่ี่ http://www.rabbitmq.com/admin-guide.html โดยหลักจะทำการ
- Manage Server : stop, start
- Manage User Account
- Manage VirtualHost
- Manage Realm
- Grant permmision to user

ค่า default ของ rabbitmq เป็นดังนี้
username = guest
password = guest
virtualhost = /
realm = /data
host = localhost/ip/127.0.0.1

ผมใช้ client เป็น java ตามสิ่งที่ load มาตั้งแต่แรก ซึ่ง API ที่ให้มาก้ใช้งานไม่ยาก สามารถอ่านจากเอกสารได้ที่ http://www.rabbitmq.com/api-guide.html

ตัวอย่าง code การติดต่อ จะประกอบไปด้วย

1. Create Channel
ConnectionParameters params = new ConnectionParameters();
params.setUsername("guest");
params.setPassword("guest");
params.setVirtualHost("/");
params.setRequestedHeartbeat(0);
ConnectionFactory factory = new ConnectionFactory(params);
Connection conn = factory.newConnection("localhost", 5672);
Channel channel = conn.createChannel();
int ticket = channel.accessRequest("/data");
channel.exchangeDeclare(ticket, "exchangeName", "direct", true);
channel.queueDeclare(ticket, "queueName");
channel.queueBind(ticket, "queueName", "exchangeName","routingKey");

2. Publish Message to broker [ RabbitMQ ]
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(ticket, "exchangeName", "routingKey", null, messageBodyBytes);

3. Retrieve Message from broker [ RabbitMQ ]
GetResponse response = channel.basicGet(ticket, "queueName", noAck);
if (response == null) {
// No message retrieved.
} else {
AMQP.BasicProperties props = response.getProps();
byte[] body = response.getBody();
long deliveryTag = response.getEnvelope().getDeliveryTag();
channel.basicAck(deliveryTag, false);
System.out.println(new String(body));
}

4. Close channel
channel.close(AMQP.REPLY_SUCCESS, "Goodbye");
conn.close(AMQP.REPLY_SUCCESS);


เท่านี้ก็สามารถเริ่มใช้งาน RabbitMQ ในเบื้องต้นได้แล้วครับ