JMS+Oracle Advanced Queue(AQ)用法实践

作者:杨大友,余川 测试员:王健
 

开发工具: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!
 
忘记告诉配置文件的问题了,罪过罪过,补上!
在程序开发完成后,有个文件projectname -oc4j-app.xml文件,在里面加上这么一段
 
<resource-provider class="oracle.jms.OjmsContext" name="demodb">   <description> OTN How-to to configure Resource Provider</description>   <property name="datasource" value="jdbc/jmsdbDS">   </property> </resource-provider>
 
当然,我的数据源(datasource)和你们的肯定不一样,你们自己建立自己的数据源了.
resource-provider的name选项必须和程序中的java:comp/resource/demodb/QueueConnectionFactories/JMSTEST_QT中的demodb一样,否则程序会报找不到资源的错误.各位好运!!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值