Oracle 데이터베이스 저장 프로 시저에서 Java 응용 프로그램으로 지점 간 JMS 메시지를 보내려고합니다. 두 개의 '포인트'는 서로 다른 컴퓨터에 있으며, 나는 핑 (ping)을 통해 서로 대화 할 수 있습니다.Oracle : JMS 저장 프로 시저를 보내는 Java 저장 프로 시저
응용 프로그램 서버 내의 대기열에서 메시지를 성공적으로 가져올 수있는 Java 응용 프로그램을 만들었습니다. 애플리케이션은 JBoss v4.2.3 서버에서 실행됩니다. 원격 Java 응용 프로그램에서 JMS 메시지를 성공적으로 보낼 수 있었으므로 서버 내에서 실행중인 코드가 정상적으로 작동합니다.
작업중인 원격 Java 응용 프로그램에서 코드를 가져 와서 이것을 oracle 저장 프로 시저에 성공적으로로드했습니다. 나는 또한 loadjava 유틸리티를 사용하여 필요한 jar 파일을 oracle에로드 할 수 있었다 (나는 믿는다!). 내가로드 한 세 개의 jar 파일은 다음과 같습니다
* jms-1.1
* jbossmq-3.2.3
* jboss-client-4.0.2
세 항아리 작업 원격 자바 응용 프로그램 내에서 사용되는 모든 필요한 것으로 나타납니다. 다음과 같이 저장 프로 시저에로드 포함 된 코드는 다음과 같습니다 나는 코드가 넘어 어디 그래서 나는 시도하고 결정할 수있는 결과 문자열을 추가 한
package com.base.jms.client;
import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class StandAloneClient {
public static String send() throws Exception {
String result = "Starting -> ";
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "192.168.111.242:1099");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
result = result + "Environment -> ";
// set up stuff
Context ic = new InitialContext(env);
result = result + "Context -> ";
QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ic.lookup("ConnectionFactory");
result = result + "Factory -> ";
Queue queue = (Queue) ic.lookup("queue/A");
result = result + "Queue -> ";
QueueConnection connection = connectionFactory.createQueueConnection();
result = result + "Connection -> ";
QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
result = result + "Session -> ";
QueueSender sender = session.createSender(queue);
connection.start();
result = result + "Sender -> ";
TextMessage myMessage = session.createTextMessage();
myMessage.setText(result);
sender.send(myMessage);
result = result + "Sending Message -> ";
sender.close();
session.close();
connection.close();
result = result + "Close";
} catch (JMSException e) {
result = result + "JMS Exception";
/*
if(e.getMessage() != null) {
result = result + ":" + e.getMessage();
}*/
} catch (Exception e) {
result = result + "Exception";
/*
if(e.getMessage() != null) {
result = result + ":" + e.getMessage();
}*/
}
return result;
}
}
. 이 절차를 작성하고 테스트하기 위해, 내가 SQLPLUS에서 다음 명령을 실행 해요 :
create or replace function send_jms return VARCHAR2 as language java name 'com.base.jms.client.StandAloneClient.send() return java.lang.String';
variable myString varchar2(20);
call send_jms() into :myString;
Call completed.
print myString;
모든로드 할 것으로 보인다 올바르게 컴파일, 그러나 메시지가 전송되지 않습니다. 반환 된 결과 문자열은 InitialContext에서 QueueConnectionFactory 클래스를 검색 할 때 넘어지는 것을 의미합니다. 반환되는 결과 문자열은 다음과 같습니다
Starting -> Environment -> Context -> Exception
나는이 작동하지 않는 이유에 손실에있어, 던져 예외에서 자세한 내용을 주울 수 없었습니다. 아무도 내가 이것을 올바르게하고 있음을 확인할 수 있습니까? 만약 내가 틀렸다면, 내가 뭘 잘못하고 있는지보십시오.
오래 게시물에 사과드립니다. 미리 보셔서 감사합니다!
을 그냥 보조 노트로 : 오라클 고급 큐의 상단에 내장 된 JMS 구현되어 있습니다. JBoss 나 다른 응용 프로그램 서버와 함께 내장 JMS를 사용하여 공동 작업에 성공한 사람이 있습니까? Java를 사용하지 않고 PL/SQL 패키지 만 사용할 수 있습니까? – Codo
JBoss에서 제공하는 Advance Queues를 사용하고 있습니다. Oracle 스트림도 JMS에 사용할 수 있습니다. 내가 한 접근 방식을 사용하는 것이 더 쉬울 것이라고 생각했습니다. 나는 다르게 생각하기 시작했습니다. :) – ScreamingMage