'Articles'에 해당되는 글 116건

  1. 2013/07/11 용비 Jetty 8.1.11 Embedded Java Application
  2. 2013/07/06 용비 Jetty를 이용한 간단한 WAS 만들기
  3. 2013/07/03 용비 Java NIO의 진실
  4. 2013/07/02 용비 Java NIO를 이용한 Command Line Interface
  5. 2013/06/27 용비 Java NIO를 이용한 Event Driven Socket Server
Jetty를 Embedding하여 RESTful API를 제공하는 Java Application을 작성하였다.
Jetty의 Distribution Version은 8.1.11.

Jersey Version : 1.8

<Main.java>
public class Main {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {

//Jetty Server Start for RESTful Service
JettyServer jettyServer = new JettyServer();

if (!jettyServer.isStarted())
jettyServer.start();
}

}

<JettyServer.java>
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;

public class JettyServer {

private Server server;
public JettyServer() {
this(8080);
}
public JettyServer(Integer port) {
server = new Server(port);
server.setStopAtShutdown(true);
server.setSendServerVersion(true);
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/");
handler.addServlet(new ServletHolder(new ServletContainer(new PackagesResourceConfig("restful_resource_package"))), "/");
server.setHandler(handler);
}
public void setHandler(ContextHandlerCollection contexts) {
server.setHandler(contexts);
}
public void start() throws Exception {
server.start();
}
public void stop() throws Exception {
server.stop();
server.join();
}
public boolean isStarted() {
return server.isStarted();
}
public boolean isStopped() {
return server.isStopped();
}
}

한가지 유의할 사항은, Jersey Annotation을 사용하여 작성할 모든 Resource는 restful_resource_package에 작성되어야 한다는 것이다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/568

프로젝트를 진행하면서 다음 요건을 충족시켜야 하는 Web Application을 만들어야 한다.

1. RESTful API 제공
2. Embedded Distributed Infinispan Memory Grid
3. Infinispan에 Data CRUD

위의 3가지를 모두 만족시키기 위해서 처음에는 Jboss AS 7.1.1.Final을 이용하려고 했으나
아쉽게도 Jboss에 내장되어 있는 Infinispan의 Version과 Java NIO를 이용하여 구현한 Socket Server에 내장되어 있는 Infinispan의 Version이 서로 달라 Clustering으로 묶이지 않았다.

그래서 결국, Jetty를 이용하여 RESTful API를 제공하고, Infinispan을 내장하고 있는 Java Application을 별도로 만들기로 했다.

프로그램으로 먹고 사는 사람들이 생각하는 바는 비슷한가 보다.
필요에 의해서 WAS와 같은 무거운 툴이 아닌 필요한 기능만 제공하는 것이 없을까 찾아보니 이미 Jetty를 Open Source Project로 제공하고 있다니...

오늘날 시대의 변화에 발맞춰 따라가려면 역시 이것저것 세상이 돌아가는 Trend를 잘 알고 있어야겠다는 생각이 문득 든다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/567

Java NIO의 진실

Articles 2013/07/03 10:29 용비
Java NIO.
NIO의 진정한 의미는 Non-Blocking IO가 아니라 JDK 1.4 이후로 포함된 New IO라는 의미....
지금까지 잘못알고 있었넹...
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/566

현재 만들고 있는 플랫폼에서 Management 기능을 제공하기 위해 필요한 것이 Event 기반 표준 IO를 컨트롤 하는 것이다.

Event 기반 Command-Line Interface를 만들기 위해서 이것저것 찾아보니 NIO를 이용해서 가능할 것 같다.

이거 아무래도 Java I/O를 Event기반으로 처리하려면 Java NIO를 공부해야겠다는 생각이 든다.

근데, 다 만들고 나서 Source를 Open해도 되려나..?
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/565

일반적인 Client-Server Socket 통신은 Sync 구조이다.
대부분 Server에서는 Client가 연결을 요청한 후 데이터를 보내기만을 기다린다.

따라서, 한번 Connection이 맺어지고 Client의 요청으로 들어온 데이터를 읽고 처리한 이후에는
Server에서는 Client에서 동일한 Connection으로 데이터를 보내도 알 수가 없다.
이것을 처리하기 위해서는 Server에서 Connection의 InputStream에 데이터가 있는지 없는지를 알기 위해 InputStream.available()을 통해 무한루프를 돌면서 감시하고 있어야 한다.

그 결과 컴퓨터의 CPU 리소스를 엄청 잡아 먹는다.
오늘날에야 멀티코어가 대세로 자리잡아서 코어 하나를 Connection을 유지하는 Thread하나에 할당해주면 된다지만, 분명 한계는 있다.

그래서 Connection의 InputStream으로 데이터가 들어올 때, Event로 데이터가 들어왔음을 알려주고, 그 이후 서버에서 InputStream을 읽어서 처리하도록 하기 위해서 Java NIO(Non-blocking I/O)를 이용하여 Socket Server 프로그램을 작성해 보았다.

로컬에 있는 Virtual Machine에서 테스트를 했기에 크게 의미 있는 데이터는 아니지만, 놀랍게도 5배 정도의 성능 향상을 보였다.

누군가는 Java NIO를 따로 공부하느니, Node.js를 사용하여 Socket Server를 만드는 것이 더 쉽다고 이야기하는 분들도 있지만, 처음 접하는 사람이라면 Node.js도 공부해야 한다.(-.-)

여하튼, 앞으로 프로그래밍의 대세는 Asyncronous한 Event Driven Approach인 것은 분명해 보인다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/563