Oracle觸發器如何調用Java實現Openfire訊息發送

來源:互聯網
上載者:User

標籤:

寫在前面,要想實現整個過程的成功執行請先準備以下檔案:

1. 登陸Openfire服務端以及Spark用戶端相關程式(openfire_4_0_1.exe、spark_2_7_6.exe)

2. 串連Openfire和Oracle相關的jar包(presence.jar、smack.jar、smackx-debug.jar、smackx.jar、ojdbc.jar) 


Step1:安裝Openfire服務端並設定資料庫串連,配置參考《Openfire伺服器安裝與配置教程》

Step2:在Eclipse等IDE開發工具中編寫Java Application程式並匯入smack的3個jar包

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import org.jivesoftware.smack.Chat;import org.jivesoftware.smack.XMPPConnection;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smackx.MessageEventManager;/** * Openfire服務端發送訊息到指定用戶端帳號 *  * @author xiaolj * @date 2016-01-05 */public class SendMsgFunc {  public static void main(String args[]) {       //參數1:openfire服務端建立的帳號(發送訊息前請先用Spark用戶端登入10000帳號)       //參數2:需要發送的訊息內容       int status = sendImMessage("10000", "主減裝配一線裝置異常,請及時處理!【反饋人:張三;聯絡電話:13883638681】");       System.err.println(status);  }  /**   * 根據返回狀態確認是否發送成功   */   public static int sendImMessage(String userid, String content) {           System.out.println("開始執行訊息推送");        String ip = "127.0.0.1";//服務裡IP或伺服器對應主機名稱        String port = "5222";// 用戶端PID預設都是5222        String domain = "server-pc";//伺服器主機名稱或IP地址        String adminid = "admin";//固定不變發起人(openfire伺服器預設最進階許可權賬戶)        String pwd = "admin";//固定不變(openfire伺服器預設最進階許可權賬戶密碼)        int on_line = 0;// 是否線上        try {            // 判斷使用者是否線上:--若出現error設定外掛程式線上狀態任何許可權訪問            String url = "http://127.0.0.1:9090/plugins/presence/status?jid="+ userid + "@server-pc&type=xml";            on_line = judgUserOnline(url);            // 建立串連發送用戶端訊息            XMPPConnection con = new XMPPConnection(ip, Integer.parseInt(port));            con.login(adminid, pwd);            Chat chat = con.createChat(userid + "@" + domain);            Message msg = chat.createMessage();            msg.setSubject("系統通知訊息");            msg.setBody(content);            MessageEventManager.addNotificationsRequests(msg, true, true, true, true);            chat.sendMessage(msg);            System.err.println("執行訊息推送結束");            // 關閉串連            con.close();        } catch (Exception e) {            System.err.println("執行訊息推送錯誤");            System.out.println("〖integration〗發送訊息到OpenFire錯誤。");            e.printStackTrace();            return 3;       }       return on_line;   }   /********** 【判斷目前使用者是否線上】 ***********/   public static int judgUserOnline(String url) {       // 預設不線上       int onLineState = 0;       try {           URL oUrl = new URL(url);           URLConnection oConn = oUrl.openConnection();           InputStream inputStream = oConn.getInputStream();           if (oConn != null) {             // 讀取傳回值:openfire伺服器需先安裝外掛程式並指定任意許可權,重啟伺服器             BufferedReader oIn = new BufferedReader(new InputStreamReader(inputStream));             if (null != oIn) {                String strFlag = oIn.readLine();                oIn.close();                if (strFlag.indexOf("type=\"error\"") >= 0) {// 存取權限不足:openfire使用者不存在                   onLineState = -1;                } else if (strFlag.indexOf("type=\"unavailable\"") >= 0) {// 使用者不線上                   onLineState = 0;                } else if (strFlag.indexOf("priority") >= 0 || strFlag.indexOf("id=\"") >= 0) {// 表示使用者線上                   onLineState = 1;                } else {                   onLineState = 2; // 伺服器發生異常                }             }          }      } catch (Exception e) {          System.err.println("執行訊息推送驗證錯誤");          e.printStackTrace();          return 4;      }      System.err.println("執行訊息推送驗證結束");      return onLineState;   }}

Step3:將Java程式以及運行過程中的jar包load到Oracle資料庫

    3.1)  將調用openfire相關jar包匯入Oracle資料庫:

loadjava -r -f -o -user 使用者/密碼@IP:連接埠/執行個體名 D:\smack.jarloadjava -r -f -o -user 使用者/密碼@IP:連接埠/執行個體名 D:\smackx.jarloadjava -r -f -o -user 使用者/密碼@IP:連接埠/執行個體名 D:\smackx-debug.jar

    3.2)  在Oracle中建立一個SQL視窗建立Java source程式然後將以上Java代碼拷貝其中並編譯(源檔案名稱自訂)

create or replace and compile java source named "OpenfireClient_Func" asimport java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import org.jivesoftware.smack.Chat;import org.jivesoftware.smack.XMPPConnection;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smackx.MessageEventManager;/** * Openfire服務端發送訊息到指定用戶端帳號 *  * @author xiaolj * @date 2016-01-05 */public class SendMsgFunc {  public static void main(String args[]) {       //參數1:openfire服務端建立的帳號(發送訊息前請先用Spark用戶端登入10000帳號)       //參數2:需要發送的訊息內容       int status = sendImMessage("10000", "主減裝配一線裝置異常,請及時處理!【反饋人:張三;聯絡電話:13883638681】");       System.err.println(status);  }  /**   * 根據返回狀態確認是否發送成功   */   public static int sendImMessage(String userid, String content) {           System.out.println("開始執行訊息推送");        String ip = "127.0.0.1";//服務裡IP或伺服器對應主機名稱        String port = "5222";// 用戶端PID預設都是5222        String domain = "server-pc";//伺服器主機名稱或IP地址        String adminid = "admin";//固定不變發起人(openfire伺服器預設最進階許可權賬戶)        String pwd = "admin";//固定不變(openfire伺服器預設最進階許可權賬戶密碼)        int on_line = 0;// 是否線上        try {            // 判斷使用者是否線上:--若出現error設定外掛程式線上狀態任何許可權訪問            String url = "http://127.0.0.1:9090/plugins/presence/status?jid="+ userid + "@server-pc&type=xml";            on_line = judgUserOnline(url);            // 建立串連發送用戶端訊息            XMPPConnection con = new XMPPConnection(ip, Integer.parseInt(port));            con.login(adminid, pwd);            Chat chat = con.createChat(userid + "@" + domain);            Message msg = chat.createMessage();            msg.setSubject("系統通知訊息");            msg.setBody(content);            MessageEventManager.addNotificationsRequests(msg, true, true, true, true);            chat.sendMessage(msg);            System.err.println("執行訊息推送結束");            // 關閉串連            con.close();        } catch (Exception e) {            System.err.println("執行訊息推送錯誤");            System.out.println("〖integration〗發送訊息到OpenFire錯誤。");            e.printStackTrace();            return 3;       }       return on_line;   }   /********** 【判斷目前使用者是否線上】 ***********/   public static int judgUserOnline(String url) {       // 預設不線上       int onLineState = 0;       try {           URL oUrl = new URL(url);           URLConnection oConn = oUrl.openConnection();           InputStream inputStream = oConn.getInputStream();           if (oConn != null) {             // 讀取傳回值:openfire伺服器需先安裝外掛程式並指定任意許可權,重啟伺服器             BufferedReader oIn = new BufferedReader(new InputStreamReader(inputStream));             if (null != oIn) {                String strFlag = oIn.readLine();                oIn.close();                if (strFlag.indexOf("type=\"error\"") >= 0) {// 存取權限不足:openfire使用者不存在                   onLineState = -1;                } else if (strFlag.indexOf("type=\"unavailable\"") >= 0) {// 使用者不線上                   onLineState = 0;                } else if (strFlag.indexOf("priority") >= 0 || strFlag.indexOf("id=\"") >= 0) {// 表示使用者線上                   onLineState = 1;                } else {                   onLineState = 2; // 伺服器發生異常                }             }          }      } catch (Exception e) {          System.err.println("執行訊息推送驗證錯誤");          e.printStackTrace();          return 4;      }      System.err.println("執行訊息推送驗證結束");      return onLineState;   }}

Step4:編寫Oracle函數(觸發器只需調用該函數執行Java程式,函數名自訂,java name必須是Java程式存在的類.方法(參數類型一致),否則編譯失敗,根據需要定義返回值)

create or replace function openfire_notice_func(f_user varchar2, f_msg varchar2) return numberaslanguage java name 'SendMsgFunc.sendImMessage(java.lang.String, java.lang.String) return int';

Step5:這一步很關鍵,否則訊息不能發送成功(Oracle許可權機制,訊息發送需要Socket以及檔案讀取,因此需要給Oracle使用者進行授權,很多新手容易忽略的問題)

請用sys登入資料庫為使用者授權執行【SQL命令】:

exec sys.dbms_java.grant_permission('使用者名稱','SYS:java.net.SocketPermission', '127.0.0.1:9090', 'connect,resolve' );(IP地址是openfire伺服器IP)exec sys.dbms_java.grant_permission('使用者名稱','SYS:java.net.SocketPermission', '127.0.0.1:5222', 'connect,resolve' );(連接埠不變)exec sys.dbms_java.grant_permission('使用者名稱','SYS:java.lang.RuntimePermission', 'getClassLoader', '' );exec sys.dbms_java.grant_permission('使用者名稱','SYS:java.io.FilePermission', 'D:\Oracle目錄\PRODUCT\11.2.0\DBHOME_1\JAVAVM\lib\security\cacerts', 'read' );exec sys.dbms_java.grant_permission('使用者名稱','SYS:java.io.FilePermission','<<ALL FILE>>','read,write,execute,delete');

如果未對使用者進行授權,就會拋出如下異常:


Step6:編寫Oracle觸發器程式

-- 觸發器調用Java程式執行訊息發送create or replace trigger trigger_ofuser after insert or update on ofuser for each rowdeclare  --定義變數  MESSAGE_STATUS number;     -- 訊息發送成功傳回值狀態  MESSAGE_INFO varchar2(50); -- 待發送的訊息內容begin  dbms_output.put_line('開始執行觸發器');  --RAISE_APPLICATION_ERROR(-20000, '類比一個錯誤碼,程式將終止');  -- 一、插入操作,  if inserting then      --1、插入使用者記錄(略)      --insert into ofuser values(...);      --2、發送訊息根據返回狀態記錄通知使用者是否接收到通知,曆史跟蹤,判斷目前使用者發送訊息是否成功      MESSAGE_INFO :='測試訊息發送【測試人:'||:new.username||'】';      begin        select openfire_notice_func(:new.username, MESSAGE_INFO) into MESSAGE_STATUS from dual;        if (MESSAGE_STATUS = -1) then             dbms_output.put_line('通知已成功(使用者未註冊用戶端)');        elsif (MESSAGE_STATUS = 0) then             dbms_output.put_line('通知發送成功(使用者不線上)');        elsif (MESSAGE_STATUS = 1) then             dbms_output.put_line('通知發送成功(使用者已接收通知)');        elsif (MESSAGE_STATUS = 2) then             dbms_output.put_line('通知發送失敗(伺服器發生異常,請稍後重試)');        else             dbms_output.put_line('通知發送失敗(伺服器發生訊息異常,請聯絡系統管理員)');        end if;      end;   end if;  --二、更新操作  if updating then      update ofuser t set t.plainpassword = '123456' where t.username = :new.username;  end if; end trigger_ofuser;

Step7:編寫測試視窗進行測試



以上Oracle如何調用Java程式執行訊息發送教程,若有疑問可以聯絡博主。

聲明:以上教程為博主原創,若需轉載請註明出處,謝謝。


Oracle觸發器如何調用Java實現Openfire訊息發送

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.