multiconsumer Queue with an Oracle Type from Java

You have a multi consumer queue with a user defined type


CREATE TYPE topic_message AS OBJECT(Subject VARCHAR2(30),Text VARCHAR2(80))
/
BEGIN
  dbms_aqadm.create_queue_table(
    'topic_queue_table', 
    'topic_message', 
    Multiple_consumers=>TRUE);
  dbms_aqadm.create_queue(
    'toy_topic', 
    'topic_queue_table');
  dbms_aqadm.start_queue(
    'toy_topic');
END;
/

You create the corresponding java class with JPublisher (check the documentation of Database JPublisher User’s Guide 12c Release 1 (12.1) from which I took this example). JPublisher does need to be installed, it is already in your Oracle Home.


CLASSPATH=$ORACLE_HOME/jdbc/lib/ojdbc5.jar ### for java 5
CLASSPATH=$CLASSPATH:$ORACLE_HOME/sqlj/lib/translator.jar
CLASSPATH=$CLASSPATH:$ORACLE_HOME/sqlj/lib/runtime12.jar
CLASSPATH=$CLASSPATH:$ORACLE_HOME/jlib/jta.jar
CLASSPATH=$CLASSPATH:$ORACLE_HOME/rdbms/jlib/aqapi.jar
CLASSPATH=$CLASSPATH:$ORACLE_HOME/rdbms/jlib/jmscommon.jar
CLASSPATH=$CLASSPATH:.

export CLASSPATH

LIBPATH=$ORACLE_HOME/lib ### or LD_LIBRARY_PATH on some plateforms
export LIBPATH

JAVA_HOME=$ORACLE_HOME/jdk
export JAVA_HOME

PATH=$ORACLE_HOME/bin:$JAVA_HOME/bin:/usr/bin:/bin
export PATH

java oracle.jpub.Doit -user=scott/tiger -sql=toy_topic:ToyTopic


SCOTT.TOPIC_MESSAGE
SCOTT.TOY_TOPIC
Note: /u01/app/oracle/java/ToyTopic.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Now I can publish and receive from that queue


import java.util.Properties;
import java.sql.*;
import javax.jms.*;
import oracle.jms.*;

public class Test {
  public static void main(String argv[]) throws SQLException, 
JMSException {
    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS="+
"(PROTOCOL=TCP)(Host=srv01)(Port=1521))(CONNECT_DATA=(SID=DB01)))";
    Properties props = new Properties();
    props.setProperty("user", "SCOTT");
    props.setProperty("password", "tiger");
    DriverManager.registerDriver(new oracle.jdbc.
OracleDriver());
    java.sql.Connection conn = DriverManager.getConnection(url, props);

    ToyTopic topic = new ToyTopic(conn);
    TopicMessage m = new TopicMessage("scooby doo", "lights out");

    topic.publish(m, new String[]{"ToyParty", "ToyFactory"});
    System.out.println("Message broadcasted: " + m.getSubject() 
+ " " + m.getText());
    m = new TopicMessage("dalmatian", "solve the puzzle");
    topic.publish(m, new String[]{"ToyParty", "ToyLand"});
    System.out.println("Message broadcasted: " + m.getSubject() 
+ " " + m.getText());

    m = topic.receive("ToyParty");
    System.out.println("ToyParty receive " + m.getSubject() 
+ " " + m.getText());
    m = topic.receive("ToyParty");
    System.out.println("ToyParty receive " + m.getSubject() 
+ " " + m.getText());

    m = topic.receiveNoWait("ToyLand");
    System.out.println("ToyFactory receive " + m.getSubject() 
+ " " + m.getText());
    m = topic.receiveNoWait("ToyFactory");
    System.out.println("ToyFactory receive " + m.getSubject() 
+ " " + m.getText());
    m = topic.receiveNoWait("ToyFactory");
  }
}

Try it :


$ javac Test.java
$ java Test
Message broadcasted: scooby doo lights out
Message broadcasted: dalmatian solve the puzzle
ToyParty receive scooby doo lights out
ToyParty receive dalmatian solve the puzzle
ToyFactory receive dalmatian solve the puzzle
ToyFactory receive scooby doo lights out

Published by

Laurent Schneider

Oracle Certified Master

Leave a Reply

Your email address will not be published.


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>