Tôi đang cố gắng gửi một thông báo JMS điểm tới điểm từ thủ tục lưu trữ cơ sở dữ liệu oracle đến một ứng dụng java. Hai 'điểm' ngồi trên các máy khác nhau, mà tôi đã xác nhận có thể nói chuyện với nhau thông qua ping.Oracle: Thủ tục lưu sẵn Java gửi thông báo JMS
Tôi đã tạo một ứng dụng java có thể nhận tin nhắn thành công ngoài hàng đợi trong máy chủ ứng dụng. Ứng dụng đang chạy trong một máy chủ JBoss v4.2.3. Tôi đã có thể gửi thành công một tin nhắn JMS từ một ứng dụng java từ xa, vì vậy tôi chắc chắn rằng mã chạy trong máy chủ là ok.
Tôi đã lấy mã từ ứng dụng java từ xa đang hoạt động và tải thành công này vào một thủ tục lưu trữ oracle. Tôi cũng đã quản lý (tôi tin!) Tải vào oracle các tệp jar yêu cầu bằng cách sử dụng tiện ích loadjava. Ba tệp jar tôi đã tải là:
* jms-1.1
* jbossmq-3.2.3
* jboss-client-4.0.2
Ba lọ được sử dụng trong ứng dụng java từ xa đang hoạt động và dường như là tất cả những gì bắt buộc. Mã được chứa trong quy trình được lưu trữ như sau:
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;
}
}
Tôi đã thêm chuỗi kết quả để tôi có thể thử và xác định vị trí mã nằm trên đó. Để tạo và kiểm tra quy trình này, tôi đang thực hiện các lệnh sau trong 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;
Tất cả mọi thứ dường như được nạp và biên dịch một cách chính xác, tuy nhiên thông báo sẽ không được gửi đi. Chuỗi kết quả trả về có nghĩa là nó rơi xuống khi cố gắng truy xuất lớp QueueConnectionFactory từ InitialContext. Chuỗi kết quả được trả lại là:
Starting -> Environment -> Context -> Exception
Tôi không biết tại sao điều này không hoạt động và không thể thu thập thêm từ ngoại lệ được ném. Bất cứ ai có thể xác nhận rằng tôi đang làm điều này một cách chính xác, và nếu tôi, hãy xem những gì tôi đang làm sai?
Xin lỗi vì bài đăng dài nhưng cảm ơn bạn đã xem trước!
Cũng giống như một lưu ý: Oracle đi kèm với một triển khai JMS được xây dựng trên đầu tiên của xếp hàng nâng cao. Có ai từng thành công trong việc tương tác với JBoss hoặc một máy chủ ứng dụng khác bằng cách sử dụng JMS tích hợp, có thể thậm chí không sử dụng Java mà chỉ là các gói PL/SQL? – Codo
Tôi đã có một cái nhìn bằng cách sử dụng hàng đợi trước được cung cấp bởi JBoss. Các luồng Oracle cũng có thể được sử dụng cho JMS. Tôi nghĩ sẽ dễ dàng hơn cho cách tiếp cận mà tôi đã làm. Tôi bắt đầu nghĩ khác đi :) – ScreamingMage