| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: buffer overflow, limit of 2000 bytes (how to get around)
"Scott Mattes" <Scott_at_TheMattesFamily.ws> wrote in message news:<gFLE9.6498$kO5.1886547_at_news1.news.adelphia.net>...
> I would be interested in the JAVA version. When I was trying different > things to find a adequate real time msgr I didn't seem to be able to do the > pipe idea correctly (msgs didn't always arrive, if I remember correctly). >
OK. Java version is the only one I currently have. Some history. I've got the idea from Sergei Kuchin (http://otl.sourceforge.net/) in 1996. He had it written in Pro*C at the time. Later (2000) I wrote java version. Never had problems with messages, all messages always arrived.
You need 3 pieces of software.
procedure send_msg(m in varchar2) is
ms number;
begin
dbms_pipe.pack_message(m);
ms := dbms_pipe.send_message('JavaPipe');
fnd_file.put_line(fnd_file.log, m);
end send_msg;
2. Java class implementing the listener.
// This is a listener class which connects to Oracle instance and // listens for requests. It uses Oracle package dbms_pipe. // This package allows you to send messages between different sessions. // It is implemented as a thread, so you can start several listeners for // several databases. You also can periodically check if connection is // alive by checking piperet variable. If connection appears to be dead, // you can kill and restart thread. The messages in pipe would stay there for // a long time, so if listener didn't listen for a while, it'd pick up all // messages from pipe after restart.
// You need to import the java.sql package to use JDBC import java.sql.*;
public class PipeThread extends Thread
{
String ConnectS;
String usrn;
String pwd;
int piperet;
public PipeThread(String ConnectString, String username, String passwd)
{
// Constructor. ConnectString parameter has to have format: // jdbc:oracle:<drivertype>:@<host_name/host_address>:<port>:<instance> // Example: // jdbc:oracle:thin:@alex:1521:oracle super(); piperet = 0; ConnectS = ConnectString; usrn = username; // Oracle username pwd = passwd; // Oracle password
public void run() {
try {
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Connect to the database
Connection conn =
DriverManager.getConnection (ConnectS, usrn, pwd);
// Create a Statement
Statement stmt = conn.createStatement ();
int i = 0;
int n;
String zip;
String Address;
String GetZip = "begin dbms_pipe.unpack_message(?); end;";
// Prepare statement listening the pipe.
// Get a message from pipe, set delay to 60 sec.
String GetFromPipe =
"begin ? := dbms_pipe.receive_message('JavaPipe',60); end;";
CallableStatement PipeListen = conn.prepareCall(GetFromPipe);
PipeListen.registerOutParameter(1,Types.INTEGER);
CallableStatement PipeGetZip = conn.prepareCall(GetZip);
PipeGetZip.registerOutParameter(1,Types.CHAR);
// Main loop
while (true){
PipeListen.execute();
piperet = PipeListen.getInt(1);
// Return codes from receive_message
// 0: message received
// 1: timeout
// >1: Oracle error, shoudn't happen
// If message received:
if (piperet == 0) {
PipeGetZip.execute();
zip = PipeGetZip.getString(1);
zip = zip.trim();
System.out.println(zip);
}
if (piperet > 1) System.out.println("Oops!");
}
} catch (SQLException e){
// Something wrong. Use your own printout/logging.
// I'd prefer to end thread here and restart it from
// calling class.
// I'd also recommend to check class variable piperet
// once in a while
// and kill and restart thread if it > 1.
System.out.println(e);
}
}
}
3. Example of java program running the listener.
public class PipeTest {
int myCounter = 0;
static int classCounter = 0;
public static void main (String[] args) {
PipeThread t1 = new
PipeThread("jdbc:oracle:thin:@machine_name:1521:instance_name",
"username", "password");
t1.start();
}
It's possible to run several listeners at the same time. I don't think that reading output would be easy though. All restrictions of dbms_pipe package should be taken into account. And, of course, you need jdbc thin driver.
> > "Alex Filonov" <afilonov_at_yahoo.com> wrote in message > news:336da121.0211251533.6b103a6c_at_posting.google.com...
<some snip>
> > > > There is another method of PL/SQL debugging which let's you to receive > > debugging messages real time. You just send your messages through > > dbms_pipe package. You need a listener which would receive this message > > and print it. Usually it's a small Pro*C or java program. I can post > > a sample if anyone is interested. > > > > Alex.Received on Tue Nov 26 2002 - 16:23:37 CST
![]() |
![]() |