Similar to JRUBY-987?
---------------------
Key: JRUBY-1149
URL: http://jira.codehaus.org/browse/JRUBY-1149
Project: JRuby
Issue Type: Bug
Components: Java Integration
Affects Versions: JRuby 1.0.0
Environment: Windows XP using java version "1.6.0_01"
Reporter: Austin J. Newton
Fix For: JRuby 1.0.0
Right now, I'm working with an experiment connecting jruby with interactive
brokers java api.
I've written this code in Java, but I'm curious about using JRuby.
Basically, you have to implement an interface called EWrapper.
http://www.interactivebrokers.com/php/webhelp/Interoperability/Socket_Client_Java/java_ewrapper.htm
Most of the calls use EClientSocket
http://www.interactivebrokers.com/php/webhelp/Interoperability/Socket_Client_Java/java_eclientsocket.htm
Imagine I only have these four methods to implement with the EWrapper interface.
public void error(Exception e) {}
public void error(String str) {}
public void error(int id, int errorCode, String errorMsg) {}
public void tickPrice(int tickerId, int field, double price, int
canAutoExecute) {}
I'm curious about this since I can't have overloaded a methods with only one
argument in ruby, is the best way to process it inside the method?
if x.class == Exception then
...process error
elsif x.class == String then
...process error
end
Here is the code I created, which will just log onto IB TWS, and then
disconnect.
require 'java'
import com.ib.client.*
import com.ib.client.TickType
import com.ib.client.EWrapper
import com.ib.client.EClientSocket
import com.ib.client.Contract
class IBMessageHandler
include EWrapper
def error(string)
puts string
end
def error(id, error_code, error_msg)
puts error_msg
end
def tickPrice(ticker_id, field, price, canAutoExecute)
puts TickType.get_field(field)
puts price
end
end
def create_contract (symbol, security_type, exchange, expiry, currency = null)
contract = Contract.new
contract.m_symbol = symbol
contract.m_secType = security_type
contract.m_exchange = exchange
contract.m_expiry = expiry
contract.m_currency = currency
return contract
end
ib_handler = IBMessageHandler.new
ib_socket = EClientSocket.new(ib_handler)
# connection parameters
host = ""
port = 7496
client_id = 1
# basic info for creating a contract
contract = create_contract("CL", "FUT", "NYMEX", "200707", "USD")
generic_tick_list = "100,101,104,106,162,165,221,225"
ib_socket.e_connect(host, port, client_id)
ib_socket.req_mkt_data(1, contract, generic_tick_list)
sleep 100
ib_socket.disconnect
So far, it successfully connects to the IB TWS.
It works and then throws an error similar to
http://jira.codehaus.org/browse/JRUBY-987 bug report.
I'm a little confused on how to work around this?
irb(main):053:0> ib_socket.e_connect(host, port, client_id)
Server Version:32
TWS Time at connection:20070615 21:16:28 IST
=> nil
irb(main):054:0> Exception in thread "EReader" file:/C:/jruby-1.0/lib/jruby.jar!
/builtin/javasupport/proxy/interface.rb:155:in `send': Wrong # of arguments(1 fo
r 3) (ArgumentError)
from file:/C:/jruby-1.0/lib/jruby.jar!/builtin/javasupport/proxy/interfa
ce.rb:155:in `__jcreate!'
from file:/C:/jruby-1.0/lib/jruby.jar!/builtin/javasupport/proxy/interfa
ce.rb:138
...internal jruby stack elided...
from org.jruby.runtime.Block.yield(Block.java:220)
from org.jruby.runtime.Block.call(Block.java:174)
from org.jruby.RubyProc.call(RubyProc.java:173)
from org.jruby.RubyProc.call(RubyProc.java:148)
from org.jruby.javasupport.Java$1.invoke(Java.java:853)
from $Proxy0.error(Unknown Source)
from com.ib.client.EReader.run(EReader.java:62)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email