달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

K사 프로젝트 중 다음과 같은 에러가 발생. 27일에는 단기적으로 발생하다가 28일에는 DB 커넥션에 거의 실패를 했음. 29일부터 31일까지 계속 커넥션이 되지 않음.

- 드라이버를 사용하여 커넥션을 연결한 경우.
java.sql.SQLException: IO 예외 상황: Broken pipe

- 톰켓의 데이터소스를 사용한 경우.
2006. 1. 31. 오전 10:39:26 org.apache.tomcat.util.threads.ThreadPool logFull
심각: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status
2006. 1. 31. 오전 10:39:36 org.apache.coyote.http11.Http11Protocol pause
정보: Pausing Coyote HTTP/1.1 on http-5010
2006. 1. 31. 오전 10:39:36 org.apache.jk.common.ChannelSocket acceptConnections
경고: Exception executing accept
java.net.SocketException: Invalid argument
 at java.net.PlainSocketImpl.socketSetOption(Native Method)
 at java.net.PlainSocketImpl.setOption(PlainSocketImpl.java:240)
 at java.net.Socket.setSoLinger(Socket.java:814)
 at org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:300)
 at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:638)
 at org.apache.jk.common.SocketAcceptor.runIt(ChannelSocket.java:847)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
 at java.lang.Thread.run(Thread.java:534)
2006. 1. 31. 오전 10:39:37 org.apache.catalina.core.StandardService stop
정보: Stopping service Catalina
2006. 1. 31. 오전 10:39:37 org.apache.catalina.core.StandardHostDeployer remove
정보: Removing web application at context path /admin
2006. 1. 31. 오전 10:39:37 org.apache.catalina.logger.LoggerBase stop
정보: unregistering logger Catalina:type=Logger,path=/admin,host=localhost
2006. 1. 31. 오전 10:39:38 org.apache.catalina.core.StandardHostDeployer remove
메모리와 java 프로세스가 10~15%로 증가하다가 1%로 떨어지는 현상발생

http://javaservice.co.kr/~java/bbs/search.cgi?m=resource&b=engine&p=0&c=search&k=java.net.SocketException&o=tb&sb=engine


단지 커넥션의 문제인 줄 알았던 이슈. 로그를 보니 threadPool  이라는 메세지를 찾았다. server.xml 의 maxThread 갯수는 150 개 였는데 pop3로 메일을 가져오는 프로세스를 타는 순간 스레드갯수가 늘어난다. 스레드 갯수가 부족하여 다른 request 도 처리하지 못하고. 메일을 가져오지도 못한 상태로 멈춰버리는 현상이 발생한 것.
250 으로 늘리니 정상적으로 동작했다. 하지만 cpu 점유율이 25% 까지 증가. 메모리 증가.
정상적으로 메일을 가져온 후로는 cpu점유와 메모리 점유가 정상적으로 떨어졌다.

이후로 커넥션의 문제도 사라졌다. 커넥션 풀을 사용하는 경우. 스레드의 갯수가 부족했던 것이 원인이었던 듯.
톰켓의 데이터소스와 개별적으로 만든 커넥션 풀. 두가지를 모두 사용하고 있었으니 스레드의 갯수가 부족하게 되면서 커넥션관리가 제대로 되지 않았던 듯하다.
Broken pipe 의 경우도 네트웍의 문제라기보다는 커넥션 풀의 문제였던것이다.

실제로 jdbc로 테스트를 해본 결과 문제없이 동작했다;

'java' 카테고리의 다른 글

서블렛 + JDBC 연동시 코딩 고려사항 -제1탄-  (0) 2006.02.21
리소스 누수현상  (0) 2006.02.21
Jakarta POI - 쓰기  (0) 2005.11.30
이미지포함된 워드 파일 다운로드 시  (0) 2005.11.30
Jakarta POI - 읽기  (0) 2005.11.30
Posted by 알 수 없는 사용자
|


테스트 성공.

* Blocking 문제
java 프로세스 실행 시, I/O 가 끝날 때까지 thread 가 run 상태이다. blocking 이 문제가 된다면 thread 를 따로 생성해서 사용하자.
만약 web 에서 구현 시 servlet 을 사용한다면, 문제가 되겠지. application 을 스케쥴걸어서 동작시키는 것이 좋겠다.
http://okjsp.pe.kr/bbs?act=VIEW&seq=46721&bbs=bbs3&keyfield=content&keyword=pop3&pg=
K사에서 구현 시, 스케쥴러 돌려달라고 요청했음.

http://okjsp.pe.kr/bbs?act=VIEW&bbs=bbs3&keyfield=content&keyword=pop3&seq=23441&pg=2


JavaMail을 찾다가 본 소스 입니다. 실제 실행되는지는 잘 모르겠고요.
한번 해보시기 바랍니다.

일단 메일함에 접근을 하기 위해서는 session과 store, folder라는 세가지가 필요합니다.
그러기 위해선 다음과 같이 import해야 합니다.

import javax.mail.*;
import javax.mail.internet.*;
import javax.actication.*;

private Session sess;
private Store store;
private Folder folder;

그리고 나선 smtp 서버와 pop3 서버에 연결을 해야 겠지요 다음과 같습니다.

Properties prop = System.getProperties();
prop.put("mail.smtp.host",smtp 서버);
sess = Session.getInstance(prop, null); // 세션 smtp 시작

store = sess.getStore("pop3");
store.connect(pop3서버, user, pwd); // pop3 에 스토어로 연결됨

folder = store.getFolder("INBOX"); // store를 통해 편지함에 접근합니다.
folder.open(Folder.READ_ONLY); // Inbox 받은편지함을 엽니다.

이렇게 하면 이제 편지들을 가져 올준비가 됐습니다.
folder.open 메소드에 쓰인 상수는 Javamail API에서 찾아보시기 바랍니다.

가져오는 간단한 예제를 보지여.
Message[] messages = folder.getMessages(); // Message 는 편지를 의미합니다.

//내용을 뽑아내는 부분은 반복문으로 뽑아내시는게 좋을겁니다. for문을 쓰면
for (int i=0;i<messages.length;i++) 이하는 대충 넘어가고

보낸 날짜 받기.. 는 String date = messages[i].getSentDate() // 날짜 포맷에 맞춰 바꾸세요.
사이즈 뽑아내기는 String size = messages[i].getSize() // 사이즈도 포맷에 맞춰 바꾸세요.
보낸 사람 주소 Address addr = messages[i].getFrom()[0];
제목  String subject[] = messges[i].getHeader("subject");
      subject[0] 이 제목입니다.

모든 데이터는 한글 변환 처리 해주셔야 할겁니다.
그리고 연결을 끝낼때는 folder와 store를 닫아 주셔야 합니다.

그리고 위에 코드들을 쓰는 method는 모두 MessageException 처리를 해주셔야 합니다.
꼭 성공하세요.. 저도 소스는 구했지만 테스트를 해볼곳이 없어서 아직 못해봤습니다.


* 메일 내용 받기

Part p = body.getBodyPart(0);
 
 if(p.isMimeType("text/*")){
  Object content = p.getContent();             <------- 요기
        if (content instanceof String) {
          mail.contents = (String) content;
        } else if (content instanceof InputStream) {
          InputStream in = (InputStream) content;
          ByteArrayOutputStream bout = new ByteArrayOutputStream();
          byte[] buffer = new byte[8192];
          int amount = 0;
          while ((amount = in.read(buffer)) >= 0) {
            bout.write(buffer, 0, amount);
          }
          mail.contents = new String(bout.toString());
        }
 }



* 특정 경로의 첨부파일 가져오기


try{ 
    Properties props = new Properties(); 
    Session session = Session.getDefaultInstance(props, null); 
    Store store = session.getStore("pop3"); 
    store.connect(host, user, password); 

    Folder folder = store.getFolder("INBOX"); 
    folder.open(Folder.READ_ONLY); 

    Message message[] = folder.getMessages();
    for (int i=0, n=message.length; i<n; i++) { 
        if(message[i].isMimeType("text/plain")){
            System.out.println("일반텍스트메일입니다.");
        }else if(message[i].isMimeType("multipart/*")) {   // 첨부파일일때
            System.out.println("첨부메일입니다.");
            filename =  part.getFileName(); 
            if(filename != null){ 
                InputStream in = part.getInputStream(); 
                FileOutputStream fout = new FileOutputStream(new File(filename)); 
                while(c!=-1){ 
                    fout.write(c); 
                    c=in.read(); 
                } 
                fout.close(); 
                in.close(); 
            }
        }
    }
    folder.close(true); 
    store.close(); 
}catch(Exception e){ 
    System.out.print(e); 
}


'java' 카테고리의 다른 글

Jakarta POI - 읽기  (0) 2005.11.30
스케쥴러 구현  (0) 2005.11.30
정규식  (0) 2005.11.30
DB를 이용한 채번  (0) 2005.11.28
파일 업로드와 MultipartRequest  (0) 2005.11.28
Posted by 알 수 없는 사용자
|