2010-06-19 4 views
1

종료하기 전에 응용 프로그램을 개발하려고합니다. 새 데몬 프로세스를 실행하여 main 메소드를 실행해야합니다. 수업.JDK 6 : 지정된 클래스의 main 메소드를 실행하는 새 Java 프로세스를 실행하는 방법이 있습니까?

주 응용 프로그램이 종료 된 후 데몬 프로세스가 여전히 실행 중이어야합니다.

오라클 DB에서 실행되는 Java 저장 프로 시저이므로 Runtime.exec을 사용할 수 없습니다. 파일 시스템 파일 대신 데이터베이스 구조에 정의되어 있기 때문에 운영 체제 쉘에서 Java 클래스를 찾을 수 없기 때문에 Runtime.exec을 사용할 수 없습니다.

특히 원하는 동작은 원격 데이터베이스 세션 동안 내가

호출 데몬 프로세스를 실행 및 실행 상태에서 데몬 프로세스를 떠나 종료 최초의 자바 방법으로 할 수 있어야한다고해야

및 그 다음, 결과적으로

호 (최종적으로 통신의 끝에 종료) 데몬 프로세스와 통신하는 방법

를 (마지막 통화를 종료하기 때문에, 가입 데몬 프로세스 및 세션 제어를 갖는)

이것이 가능합니까?

감사

업데이트

내 정확한 필요 (최고의 성능에 도달) 호스트가에서 파일 전송 서비스가없는 것을 가정하여 데이터베이스에 큰 텍스트 파일을 생성하고로드하는 것입니다 Java JDK6 클라이언트 응용 프로그램은 JDBC-11G oci 드라이버를 사용하여 Oracle 11gR1 DB에 연결합니다.

입력으로 주어진 LOB (대형 데이터베이스 오브젝트)를 파일에 저장하는 프로 시저를 호출하여 작업 솔루션을 이미 개발했지만 그러한 메소드는 피하고 싶지 않은 중간 구조를 너무 많이 사용합니다.

그래서 첫 번째 호출로 DB에 ServerSocket을 만들고 나중에 연결하고 직접적이고 빠른 통신으로 데이터 전송을 설정하는 방법을 생각했습니다.

ServerSocket을 생성하는 Java 프로 시저가 종료되어 실행중인 스레드/프로세스에서 해당 소켓과 클라이언트를 수신하여 ServerSocket이 생성되었는지 확인할 수 없으므로 문제가 발생합니다 나머지 작업을 처리하기 위해 별도의 스레드를 실행하십시오.

희망 하시겠습니까?

답변

1

가능하다면 놀랄 것입니다. 사실 DB 서버 머신을 불명확 한 수의 데몬 프로세스로 가득 채울 수 있습니다.

이러한 일이 가능한 경우 기술은 Oracle에만 한정적입니다.

아마도 데이터베이스 트리거 또는 기타 이벤트 기반 데이터베이스 기능을 사용하여 원하는 효과를 얻을 수 있습니다.

해결하려는 정확한 문제를 설명하는 것이 좋습니다. 왜 데몬이 필요합니까? 제게는 데몬의 생명을 관리하려고 시도하는 것이 엄청 복잡해질 것이라는 것입니다. 두 인스턴스가 시작되는 것을 방지하거나, 예기치 않게 데몬이 종료되거나, 유지 보수가 필요할 때 데몬을 중지시키는 등의 문제를 처리해야 할 필요가 있습니다.이런 종류의 물건들은 정말 엉망이 될 수 있습니다.

예를 들어, 매 시간마다 일부 Java 코드를 실행하려면 거의 확실하게 그 효과를 얻을 수있는 간단한 방법이 있습니다. 운영 체제와 데이터베이스는 원하는 시간에 작업을 시작할 수있는 좋은 방법이 있습니다. 따라서 필요할 때 호출되는 저장 프로 시저를 사용하면 아마도 사용자 환경에 이미있는 기능 일 것입니다. 따라서 저장 프로 시저에 원하는 코드를 넣기 만하면됩니다. 공예품을 손으로 쥐고 시작하고 관리 할 필요가 없습니다. 이 접근법의 중요한 이점 중 하나는 환경의 다른 사람들이 이미 이해하고있는 기술을 사용하여 끝내는 것입니다.

생각하고있는 종류의 코드를 작성하는 것은 매우 재미있는 일이지만 상업적인 환경에서는 종종 많은 노력이 필요합니다.

+0

멋진 기타 +1;) – OlimilOops

+0

나는 의심 스러웠지만 가능했다.하지만 나는 다른 해결책을 찾고있다. 이벤트 프로그래밍을 사용하는 것으로 평가하지는 않았지만 이렇게하기 위해 조금 더 복잡 할 것입니다. 왜냐하면 이렇게해야합니다. DB에 연결하여 첫 번째 세션을 설정 한 다음 종료하기 전에 QUIT 이벤트를 기다립니다. 다른 스레드에서 DB에 다시 한 번 연결하고 데몬 프로세스와 같은 역할을하는 두 번째 세션을 설정하고 QUIT 이벤트를 생성합니다. 첫 번째 세션이 종료되면 스레드가 나머지 세션과 통신을 수행 할 수 있습니다. 작동한다고 생각하십니까? –

+0

@Oops - 네, Takamine LTD 99입니다. 조금 더 잘할 수 있으면 좋겠어요! – djna

0

다른 메인 클래스에 다른 jar를 만들고 메인 애플리케이션 내에서 다른 Main 클래스를 실행하는 외부 프로그램 (다른 JVM)을 실행해야하는 Runtime.getRuntime(). exec() 메소드를 사용하여 jar를 호출하십시오.

+0

질문에서 언급했듯이 OS에서 접근 할 수없는 데이터베이스 저장 프로 시저를 사용하기 때문에 Runtime.exec()를 사용할 수 없습니다. –

0

자바에서 서브 프로세스를 시작하는 방법은 Runtime.exec() (또는보다 편리한 래퍼, ProcessBuilder)입니다. 그것이 작동하지 않는다면, 네이티브 코드를 사용하여 동등한 기능을 구현할 수 없다면 (솔직히 C++ 레벨에서 서브 프로세스를 시작하는 방법을 배우기 위해 다른 질문을 던지십시오) 이상이어야합니다. 오류가 발생하기 쉬운 코드로 표준 방법을 사용하여.

오라클과 같은 응용 프로그램 서버가 하위 프로세스를 시작하거나 네이티브 코드를로드 할 수있는 기능에 액세스 할 수있게 된 것을보고 깜짝 놀랐습니다. 둘 모두 엄청난 장난을 일으켜 신뢰할 수없는 코드가 그로부터 금지됩니다. 편집을 살펴보면 가장 좋은 방법은 실제 문제를 해결하는 방법을 다시 생각하는 것입니다. 예를 들어, NIO를 사용하여 소켓을보다 효율적인 방식으로 관리하고 디스크에 여분의 파일을 만들지 않도록하십시오. 그들을 청소하는 여분의 정교한 코드를 넣어야한다.)