Hola, hallamos la solución a tu pregunta, desplázate y la obtendrás un poco más abajo.
Solución:
Del código anterior, veo que tiene una aplicación iniciadora (el cliente) y también necesita crear una acceptor
aplicación (el servidor). A continuación, adjunto las dos clases que harán lo que quieras.
Primero enumeraré los acceptor
solicitud:
public class ServerApplication implements Application
@Override
public void onCreate(SessionID sessionID)
@Override
public void onLogon(SessionID sessionID)
@Override
public void onLogout(SessionID sessionID)
@Override
public void toAdmin(Message message, SessionID sessionID)
@Override
public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon
@Override
public void toApp(Message message, SessionID sessionID) throws DoNotSend
@Override
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType
System.out.println("FromApp: " + message);
public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound
SessionSettings settings = new SessionSettings("res/acceptor.config");
Application application = new ServerApplication();
MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings);
LogFactory logFactory = new ScreenLogFactory( true, true, true);
MessageFactory messageFactory = new DefaultMessageFactory();
Acceptor initiator = new SocketAcceptor(application, messageStoreFactory, settings, logFactory, messageFactory);
initiator.start();
CountDownLatch latch = new CountDownLatch(1);
latch.await();
Esta es una aplicación de servidor que permanecerá iniciada y escuchará los mensajes de los clientes que se conecten a ella. Aquí está el archivo de configuración (acceptor.properties
) utilizado por él:
[default]
ApplicationID=server
FileStorePath=storage/messages/
ConnectionType=acceptor
StartTime=00:01:00 Europe/Bucharest
EndTime=23:59:00 Europe/Bucharest
HeartBtInt=30
UseDataDictionary=Y
DataDictionary=FIX42.xml
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
RefreshOnLogon=Y
[session]
BeginString=FIX.4.2
SocketAcceptPort=9877
SenderCompID=server
TargetCompID=client
AcceptorTemplate=N
lockquote
El siguiente es el código de la aplicación cliente. Intenta conectarse a un servidor y luego le enviará un mensaje:
public class ClientApplication implements Application
private static volatile SessionID sessionID;
@Override
public void onCreate(SessionID sessionID)
System.out.println("OnCreate");
@Override
public void onLogon(SessionID sessionID)
System.out.println("OnLogon");
ClientApplication.sessionID = sessionID;
@Override
public void onLogout(SessionID sessionID)
System.out.println("OnLogout");
ClientApplication.sessionID = null;
@Override
public void toAdmin(Message message, SessionID sessionID)
System.out.println("ToAdmin");
@Override
public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon
System.out.println("FromAdmin");
@Override
public void toApp(Message message, SessionID sessionID) throws DoNotSend
System.out.println("ToApp: " + message);
@Override
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType
System.out.println("FromApp");
public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound
SessionSettings settings = new SessionSettings("res/initiator.config");
Application application = new ClientApplication();
MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings);
LogFactory logFactory = new ScreenLogFactory( true, true, true);
MessageFactory messageFactory = new DefaultMessageFactory();
Initiator initiator = new SocketInitiator(application, messageStoreFactory, settings, logFactory, messageFactory);
initiator.start();
while (sessionID == null)
Thread.sleep(1000);
final String orderId = "342";
NewOrderSingle newOrder = new NewOrderSingle(new ClOrdID(orderId), new HandlInst('1'), new Symbol("6758.T"),
new Side(Side.BUY), new TransactTime(new Date()), new OrdType(OrdType.MARKET));
Session.sendToTarget(newOrder, sessionID);
Thread.sleep(5000);
El archivo de configuración para ello (initiator.config
) es casi el mismo que el utilizado para el aceptador:
[default]
ApplicationID=client
FileStorePath=storage/messages/
ConnectionType=initiator
StartTime=00:01:00 Europe/Bucharest
EndTime=23:59:00 Europe/Bucharest
HeartBtInt=30
UseDataDictionary=Y
DataDictionary=FIX42.xml
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
RefreshOnLogon=Y
[session]
BeginString=FIX.4.2
SocketConnectHost=localhost
SocketConnectPort=9877
SenderCompID=client
TargetCompID=server
Ambos archivos de configuración pierden algunas opciones, pero para fines de prueba son suficientes. Cada una de las clases tiene un método principal agregado solo para probar el caso que desea.
Normalmente manejaría un poco diferente la forma en que se inician o detienen. La aplicación del servidor escucha los mensajes/conexiones y nunca se detiene, mientras que la aplicación del cliente se detiene justo después de enviar el primer mensaje.
Hay ejemplos incluidos en la instalación de QuickFIX/J, a saber Executor
y Banzai
. Puedes leer sobre eso aquí.
QuickFIX viene con varias aplicaciones de ejemplo. Estas aplicaciones están en el solución rápida/ejemplos directorio. No están destinados a demostrar un buen diseño de aplicación ni a ser utilizados en un sistema de producción real. Simplemente se proporcionan como un tutorial sobre cómo crear una aplicación con QuickFIX.
Ejecutor es un simulador de ejecución de órdenes muy simple. Solo admite órdenes limitadas y siempre las completa por completo.
Banzai es un cliente comercial simple. Se puede usar con el Ejecutor para ver un ejemplo simple del uso de QuickFIX/J tanto en el lado de compra como en el de venta de la ejecución de una orden.
Si piensas que ha sido útil nuestro artículo, sería de mucha ayuda si lo compartieras con más entusiastas de la programación de este modo nos ayudas a dar difusión a nuestra información.