开发工具:Oracle Jdeveloper 10131
软硬件环境:
操作系统linux redhat 3.0 数据库为Oracle 10G 10.0.2
应用服务器为SOA Application Server 10131
开发语言:java
关于体系结构,说多了也让人觉得晕.我直接示例一个做法,至于理解,就慢慢看书吧!
步骤:
1. 创建Oracle AQ
首先以超级用户登陆数据库,修改必要参数,建立AQ用户,并给权限.我是使用sqlplus
Conn sys/******@SID as sysdba
Alter system set AQ_TM_PROCESSES=6
Alter system set JOB_QUEUE_PROCESSES=10
Create user aq identified by aq1234 default tablespace users temporary tablespace temp quota unlimited on users;
Grant connect,resource to aq;
Grant aq_administrator_role to aq;
Grant execute on dbms_aqadm to aq;
Grant execute on dbms_aq to aq;
Grant create any table to aq;
Grant enqueue any queue,dequeue any queue to aq;
在这插一句,这样创建只是为了便于操作,大家在外面使用应该再创建用户,只需要授予connect,resource,操作dbms_aqadm和 dbms_aq的权限就足够了.如果你想用一个用户操作另外一个用户的queue(比如aq1操作aq创建的queue),那么只需要执行下面的命令:
Conn aq/aq1234@sid
Execute dbms_aqadm.grant_queue_privilege(‘enqueue’,’aq_queue’,’aq1’,false);
解释:第一个参数是权限,可以有三个值,enqueue,dequeue,all(all就是前面两个都有).第二个参数是queue的名字,第三个参数的把权限给哪个人,第四个的意思,暂不明白,就不说.
下面就是建立queue tables和queue的时间了.用oem来创建是最简单的,大家自己看一下,我把用命令创建的过程说下:
Conn aq/aq1234@sid
--create a queue table.
BEGIN
dbms_aqadm.create_queue_table(
queue_table=>'JMSTEST_QT',
queue_payload_type=>'SYS.AQ$_JMS _MESSAGE',
multiple_consumers => false,
comment => 'Queue Table For Resource Provider');
END;
/
--create a queue
BEGIN
dbms_aqadm.create_queue (
queue_name => 'JMSTEST',
queue_table => 'JMSTEST_QT');
END;
/
--start this queue
EXECUTE dbms_aqadm.start_queue (queue_name=>'JMSTEST')
/
2. 建立JMS目标
打开SOA应用服务器.默认安装应该是http://hostname:8888/em
登陆名:oc4jadmin 密码:***
我在这里只谈一下数据库持久的JMS
我的是kevin.user
点这个应用服务器进入,先创建一个OC4J,名字为JMS(当然,这个名字你自己取).启动这个OC4J实例.
然后到主页,点JMS,然后是管理.把这些全部展开,可以看到服务这个节点.,先选择JDBC资源配置.然后创建一个新的数据源,选择本机数据源,其他默认进入下一步.填上名称,JNDI位置,JDBC URL,用户名和口令,就是aq和aq1234.然后完成,测试一下,看通不通.
我的名称是”demodb”,JNDI位置是”jms/demodb”.
然后在企业消息传送服务节点下有个数据库持久性.现在来配置这个.
点部署,资源适配器模块名就取一个名字吧,下面选择第二个,就可以选到你刚才配置的JDBC数据源了.确定.我取的模块名是jmstest.
然后回到刚才的OC4J页面,有个节点是JMS目标,就选这个.如果是基于文件的和基于内存的,就要选JMS连接工厂
点了JMS目标后,选新建,取个目标名字吧,我的是JMSTEST,持久性选基于数据库的持久性,如果前面没有配数据库持久性,这里就不能选.确定就创建好了.下面进入编程阶段.
3. 开发应用程序
我用的JD建了一个servlet发送消息,收消息就是一个onMessage方法,自己研究了.
package aqtest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
public class SendMsg extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>SendMsg</title></head>");
out.println("<body>");
try {
//get the initial context
Context jndiContext=new InitialContext();
//lookup the queuetable and create the queueconnectionfactory
QueueConnectionFactory queueCF=(QueueConnectionFactory)jndiContext.lookup("java:comp/resource/demodb/QueueConnectionFactories/JMSTEST_QT");
//create a connection to the queuetable
QueueConnection queueconnection=queueCF.createQueueConnection();
//start the connection
queueconnection.start();
//create a session to the queue
QueueSession queuesession=queueconnection.createQueueSession(true,Session.AUTO_ACKNOWLEDGE);
//create a queue
Queue queue=(Queue)jndiContext.lookup("java:comp/resource/demodb/Queues/JMSTEST");
//create an object through which this program enqueues
QueueSender sender=queuesession.createSender(queue);
//create a Text message to be enqueued
Message msg=queuesession.createTextMessage("hello kevin!");
//enqueue the message in the queue
sender.send(msg);
queuesession.commit();
queuesession.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
out.println("</body></html>");
out.close();
}
}
也可以直接在数据库端看看你发的消息,用一个存储过程.
set serveroutput on;
declare
deqopt dbms_aq.dequeue_options_t;
mprop dbms_aq.message_properties_t;
msgid RAW(16);
payload SYS.AQ$_JMS_MESSAGE;
begin
deqopt.navigation := DBMS_AQ.FIRST_MESSAGE;
deqopt.wait := 1;
dbms_aq.dequeue(
queue_name => 'jmstest',
dequeue_options => deqopt,
message_properties => mprop,
payload => payload,
msgid => msgid
);
commit;
dbms_output.put_line('The Message Sent to the Queue is: ' || payload.TEXT_VC);
end;
结果: The Message Send to the Queue is: hello,Kevin!