Re: [Quickfix-developers] Using quickfix in jboss
Brought to you by:
orenmnero
From: Oren M. <or...@qu...> - 2004-10-07 15:25:59
|
Brad, There were a couple of thread on using QuickFIX with jboss. Maybe some=20= of these will be helpful to you. At the very least they will show you=20= some contacts for people who have successfully integrated QuickFIX with=20= jboss. I'll create a bug report for this and see if we can duplicate=20 the problem. http://sourceforge.net/mailarchive/message.php?msg_id=3D4160033 http://sourceforge.net/mailarchive/message.php?msg_id=3D4164853 http://sourceforge.net/mailarchive/message.php?msg_id=3D3668061 --oren On Oct 6, 2004, at 9:04 PM, Brad Harvey wrote: > Hi All, > > I am investigating using quickfix in a jmx mbean in jboss and have run=20= > into some troubles.=A0 Has anyone had any success running it in an=20 > appserver before? > > At present I am able to run my code as a standard java app (a junit=20 > test in eclipse, to be precise) and it seems to work ok - it connects=20= > to the executor sample application and exchanges logon/logoff=20 > messages. > > However, when I fire it up within jboss I run into some troubles.=A0 = The=20 > loadLibrary call completes ok, and I am able to make calls through the=20= > jni layer.=A0 For example, I can get configuration exceptions back, = and=20 > I can get Session created log messages.=A0 Unfortunately, as soon as = the=20 > Connection succeeded log is written I get a dialog pop up: > > Microsoft Visual C++ Runtime Library > Runtime Error! > Program c:\j2sdk1.4.2\bin\java.exe > abnormal program termination > > When I hit ok on the dialog jboss ends (but it actually continues to=20= > run until I hit ok).=A0 What is especially strange is that it doesn't = do=20 > a stack dump (like it does when you get a Unexpected Signal :=20 > EXCEPTION_ACCESS_VIOLATION) - the java process just dies. > > I am using: > windows xp > quickfix 1.9.2 vc7 binary > jboss 3.2.5 > > I have also tried with the vc6 binary.=A0 This just terminates jboss=20= > immediately with an abnormal termination error message.=A0 I also = tried=20 > with quickfix 1.8 and got the same error.=A0 I have tried as both=20 > initiator and acceptor and get the same problem both ways.=A0 > > Here's some sample log messages.=A0 The first set were from the unit=20= > test, the second are from the appserver. > > 20041006-22:57:35 : Created session > 20041006-22:57:37 : Connecting to 127.0.0.1 on port 65001 > 20041006-22:57:37 : Connection succeeded > 20041006-22:57:38 : Initiated logon request > 20041006-22:57:38 : Received logon response > 20041006-22:57:38 : Received ResendRequest FROM: 13 TO: 0 > 20041006-22:57:38 : Sent SequenceReset TO: 15 > 20041006-22:58:27 : Initiated logout request > 20041006-22:58:27 : Received logout response > 20041006-22:58:27 : Disconnecting > > 20041006-22:58:55 : Created session > 20041006-22:58:55 : Connecting to 127.0.0.1 on port 65001 > 20041006-22:58:55 : Connection succeeded > (crashes now) > > Any hints on what I might be doing wrong (or why I should avoid the=20 > whole concept) would be appreciated.=A0 I've included the code and=20 > settings below.=A0 It's pretty close to the samples given in the=20 > documentation, with some extra stuff to make it an mbean (the=20 > interface). > > Thanks, > Brad. > > # default settings for sessions > [DEFAULT] > ConnectionType=3Dinitiator > ReconnectInterval=3D60 > SenderCompID=3DTW > FileStorePath=3DD:\tmp\fixstore > FileLogPath=3DD:\tmp\fixstore > > # session definition > [SESSION] > # inherit ConnectionType, ReconnectInterval and SenderCompID from=20 > default > BeginString=3DFIX.4.2 > TargetCompID=3DARCA > StartTime=3D00:00:00 > EndTime=3D23:59:59 > HeartBtInt=3D20 > SocketConnectPort=3D65001 > SocketConnectHost=3D127.0.0.1 > DataDictionary=3DD:\downloads\quickfix\spec\FIX42.xml > > > > > /* > =A0* Two files, HelloWorld.java (which implements the MBean) and=20 > HelloWorldMBean.java which defines it. > =A0* I compile these, jar them and stick them in the jboss deploy=20 > directory. > =A0* The quickfix.jar also lives in there, but quickfix_jni.dll is in=20= > the $JBOSS_HOME/bin directory. > =A0* > =A0* The deployment descriptor is fairly simple, just specifies that=20= > HelloWorld.jar and quickfix.jar are on the classpath > =A0* and sets the helloMessage string to the name of the settings = file=20 > and sets acceptor to true or false. > =A0* > =A0* The MBean deploys fine, but when I invoke startSessions() and a=20= > connection is established it crashes :( > =A0*/ > > /* HelloWorld.java */ > package com.test.mbean; > > import java.io.FileInputStream; > > import quickfix.Acceptor; > import quickfix.Application; > import quickfix.DefaultMessageFactory; > import quickfix.DoNotSend; > import quickfix.FieldNotFound; > import quickfix.FileLogFactory; > import quickfix.FileStoreFactory; > import quickfix.IncorrectDataFormat; > import quickfix.IncorrectTagValue; > import quickfix.Initiator; > import quickfix.LogFactory; > import quickfix.Message; > import quickfix.MessageFactory; > import quickfix.MessageStoreFactory; > import quickfix.RejectLogon; > import quickfix.SessionID; > import quickfix.SessionSettings; > import quickfix.SocketAcceptor; > import quickfix.SocketInitiator; > import quickfix.UnsupportedMessageType; > > public class HelloWorld implements HelloWorldMBean, Application { > =A0=A0=A0=A0 > =A0=A0=A0=A0 /* should really rename this var, left over from my hello = world=20 > mbean.... */ > =A0=A0=A0=A0 private String helloMessage =3D "d:\tmp\session.ini"; > =A0=A0=A0=A0 private boolean isAcceptor =3D true; > =A0=A0=A0=A0 private Acceptor acceptor; > =A0=A0=A0=A0 private Initiator initiator; > > =A0=A0=A0=A0 static { > =A0=A0=A0=A0=A0=A0=A0=A0 System.loadLibrary("quickfix_jni"); > =A0=A0=A0=A0 } > > =A0=A0=A0=A0 /** > =A0=A0=A0=A0=A0 * @return Returns the helloMessage. > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public String getHelloMessage() { > =A0=A0=A0=A0=A0=A0=A0=A0 return helloMessage; > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /** > =A0=A0=A0=A0=A0 * @param helloMessage The helloMessage to set. > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void setHelloMessage(String helloMessage) { > =A0=A0=A0=A0=A0=A0=A0=A0 this.helloMessage =3D helloMessage; > =A0=A0=A0=A0 } > > =A0=A0=A0=A0 public String startSession() { > =A0=A0=A0=A0=A0=A0=A0=A0 try { > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 SessionSettings settings = =3D new SessionSettings(new=A0 > FileInputStream(helloMessage)); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 MessageStoreFactory = storeFactory =3D new=20 > FileStoreFactory(settings); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 LogFactory logFactory =3D = new FileLogFactory(settings); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 MessageFactory = messageFactory =3D new=20 > DefaultMessageFactory(); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 if (isAcceptor) { > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 = acceptor =3D new SocketAcceptor > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0 = =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0=A0=A0 (this, storeFactory,=20= > settings, logFactory,=A0 > messageFactory); > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acceptor.start(); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 } else { > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 = initiator =3D new SocketInitiator > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0 = =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0=A0=A0 (this, storeFactory,=20= > settings, logFactory,=A0 > messageFactory); > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 initiator.start(); > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 = System.out.println("Initiator started"); > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 } > =A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 return getHelloMessage(); > =A0=A0=A0=A0=A0=A0=A0=A0 } catch (Exception e) { > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return "ERROR: " + = e.getMessage(); > =A0=A0=A0=A0=A0=A0=A0=A0 } > =A0=A0=A0=A0 } > > =A0=A0=A0=A0 public void stopSession() { > =A0=A0=A0=A0=A0=A0=A0=A0 if (acceptor !=3D null) { > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 acceptor.stop(); > =A0=A0=A0=A0=A0=A0=A0=A0 } > =A0=A0=A0=A0=A0=A0=A0=A0 if (initiator !=3D null) { > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 initiator.stop(); > =A0=A0=A0=A0=A0=A0=A0=A0 } > =A0=A0=A0=A0 } > > =A0=A0=A0=A0 /** > =A0=A0=A0=A0=A0 * @return Returns the acceptor. > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public boolean isAcceptor() { > =A0=A0=A0=A0=A0=A0=A0=A0 return isAcceptor; > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /** > =A0=A0=A0=A0=A0 * @param acceptor The acceptor to set. > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void setAcceptor(boolean acceptor) { > =A0=A0=A0=A0=A0=A0=A0=A0 this.isAcceptor =3D acceptor; > =A0=A0=A0=A0 } > > > > =A0=A0=A0=A0 /* auto generated methods for application */ > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#onCreate(quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void onCreate(SessionID arg0) { > =A0=A0=A0=A0=A0=A0=A0=A0 System.out.println("Session created: " + = arg0); > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#onLogon(quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void onLogon(SessionID arg0) { > =A0=A0=A0=A0=A0=A0=A0=A0 System.out.println("Logon: " + arg0); > > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#onLogout(quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void onLogout(SessionID arg0) { > =A0=A0=A0=A0=A0=A0=A0=A0 // TODO Auto-generated method stub > > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#toAdmin(quickfix.Message,=A0 > quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void toAdmin(Message arg0, SessionID arg1) { > =A0=A0=A0=A0=A0=A0=A0=A0 // TODO Auto-generated method stub > > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see quickfix.Application#toApp(quickfix.Message,=A0 > quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void toApp(Message arg0, SessionID arg1) throws = DoNotSend=20 > { > =A0=A0=A0=A0=A0=A0=A0=A0 // TODO Auto-generated method stub > > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#fromAdmin(quickfix.Message,=A0 > quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void fromAdmin(Message arg0, SessionID arg1) = throws=A0 > FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon { > =A0=A0=A0=A0=A0=A0=A0=A0 // TODO Auto-generated method stub > > =A0=A0=A0=A0 } > =A0=A0=A0=A0 /* (non-Javadoc) > =A0=A0=A0=A0=A0 * @see = quickfix.Application#fromApp(quickfix.Message,=A0 > quickfix.SessionID) > =A0=A0=A0=A0=A0 */ > =A0=A0=A0=A0 public void fromApp(Message arg0, SessionID arg1) = throws=A0 > FieldNotFound, IncorrectDataFormat, IncorrectTagValue,=A0 > UnsupportedMessageType { > =A0=A0=A0=A0=A0=A0=A0=A0 // TODO Auto-generated method stub > > =A0=A0=A0=A0 } > } > > > > /* HelloWorldMBean.java */ > /* > =A0* The MBean interface declaration defines what > =A0* methods are availble to the mbean server > =A0*/ > package com.test.mbean; > > public interface HelloWorldMBean { > > =A0=A0=A0=A0 public void setHelloMessage(String helloMessage); > =A0=A0=A0=A0 public String getHelloMessage(); > > =A0=A0=A0=A0 public void setAcceptor(boolean acceptor); > =A0=A0=A0=A0 public boolean isAcceptor(); > > =A0=A0=A0=A0 public String startSession(); > =A0=A0=A0=A0 public void stopSession(); > > > > } > > > =20= |