It doesn't seem to work across threads. Maybe I did it wrong. The code below hangs once it tries to call the perl callback, requiring a <ctrl>c as in:
[EMAIL PROTECTED]:~/inline$ ./whole Server Version:24 TWS Time at connection:20051225 14:29:34 CST inside nextValidId <ctrl>c Do you see anything wrong or have suggestions? Thanks Jay #!/usr/bin/perl use strict; package my_callback; sub new { my $class = shift; bless {}, $class; } sub tickPrice { my $self = shift; print join(":", @_),"\n"; } sub nextValidId { my $self = shift; print join(":", @_),"\n"; } package main; use Inline ( Java => "DATA", JNI => 1, AUTOSTUDY => 1, STUDY => ['com.ib.client.EClientSocket', 'com.ib.client.Contract', ], ); my $callback = my_callback->new(); my $api = Inline_Bridge->new($callback); my $ib = com::ib::client::EClientSocket->new($api); $ib->eConnect("localhost","7496",$$); my $i = 1; foreach (qw/YHOO/) { my $contract = com::ib::client::Contract->new(); $contract->{m_symbol} = $_; $contract->{m_secType} = 'STK'; $contract->{m_exchange} = 'SMART'; $ib->reqMktData($i++,$contract); } while ((my $rc = $api->WaitForCallback(.1)) > -1){ if (! $rc){ } else { $api->ProcessNextCallback() ; } } __DATA__ __Java__ import org.perl.inline.java.*; import com.ib.client.*; class Inline_Bridge extends InlineJavaPerlCaller implements EWrapper { InlineJavaPerlObject perlobj; public Inline_Bridge(InlineJavaPerlObject PerlObj) throws InlineJavaException { perlobj = PerlObj; } public void tickPrice(int tickerId, int field, double price, int canAutoExecute) { try { perlobj.InvokeMethod( "tickPrice", new Object [] { tickerId, field, price, canAutoExecute } ); } catch (InlineJavaPerlException pe){ } catch (InlineJavaException pe) { pe.printStackTrace() ;} } public void tickSize(int tickerId, int field, int size) { } public void orderStatus(int orderId, String status, int filled, int remaining, double avgFillPrice, int permId, int parentId, double lastFillPrice, int clientId) { } public void openOrder(int orderId, Contract contract, Order order) { } public void error(String str) { } public void connectionClosed() { } public void updateAccountValue(String key, String value, String currency, String accountName) { } public void updatePortfolio(Contract contract, int position, double marketPrice, double marketValue, double averageCost, double unrealizedPNL, double realizedPNL, String accountName) { } public void updateAccountTime(String timeStamp) { } public void nextValidId(int orderId) { System.out.println("inside nextValidId"); try { perlobj.InvokeMethod("nextValidId", new Object [] {"hi"}) ; } catch (InlineJavaPerlException pe){ } catch (InlineJavaException pe) { pe.printStackTrace() ;} System.out.println("after"); } public void contractDetails(ContractDetails contractDetails) { } public void bondContractDetails(ContractDetails contractDetails) { } public void execDetails(int orderId, Contract contract, Execution execution) { } public void error(int id, int errorCode, String errorMsg) { } public void updateMktDepth(int tickerId, int position, int operation, int side, double price, int size) { } public void updateMktDepthL2(int tickerId, int position, String marketMaker, int operation, int side, double price, int size) { } public void updateNewsBulletin(int msgId, int msgType, String message, String origExchange) { } public void managedAccounts(String accountsList) { } public void receiveFA(int faDataType, String xml) { } public void historicalData(int reqId, String date, double open, double high, double low, double close, int volume, double WAP, boolean hasGaps) { } public void scannerParameters(String xml) { } public void scannerData(int reqId, int rank, ContractDetails contractDetails, String distance, String benchmark, String projection) { } }