Repository: camel Updated Branches: refs/heads/master 456928d97 -> d0fbf731f
Quickfix component Asciidoc documentation Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ce42784b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ce42784b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ce42784b Branch: refs/heads/master Commit: ce42784b9ce75bd980ec1128f5bdc1fc81631c39 Parents: 6fb1216 Author: Antonin Stefanutti <[email protected]> Authored: Wed Jan 27 11:07:36 2016 +0100 Committer: Andrea Cosentino <[email protected]> Committed: Wed Jan 27 13:03:32 2016 +0100 ---------------------------------------------------------------------- .../camel-quickfix/src/main/docs/quickfix.adoc | 607 +++++++++++++++++++ .../quickfixj/QuickfixjSpringTest-context.xml | 3 +- docs/user-manual/en/SUMMARY.md | 1 + 3 files changed, 610 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/ce42784b/components/camel-quickfix/src/main/docs/quickfix.adoc ---------------------------------------------------------------------- diff --git a/components/camel-quickfix/src/main/docs/quickfix.adoc b/components/camel-quickfix/src/main/docs/quickfix.adoc new file mode 100644 index 0000000..45bb2f5 --- /dev/null +++ b/components/camel-quickfix/src/main/docs/quickfix.adoc @@ -0,0 +1,607 @@ +[[ConfluenceContent]] +[[Quickfix-QuickFIXJComponent]] +QuickFIX/J Component +~~~~~~~~~~~~~~~~~~~~ + +The *quickfix* component adapts the +http://www.quickfixj.org/[QuickFIX/J] FIX engine for using in Camel . +This component uses the standard http://www.fixprotocol.org/[Financial +Interchange (FIX) protocol] for message transport. + +[Info] +==== +**Previous Versions** + +The *quickfix* component was rewritten for Camel 2.5. For information +about using the *quickfix* component prior to 2.5 see the documentation +section below. + +==== + +Maven users will need to add the following dependency to their `pom.xml` +for this component: + +[source,xml] +---- +<dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-quickfix</artifactId> + <version>x.x.x</version> + <!-- use the same version as your Camel core version --> +</dependency> +---- + +[[Quickfix-URIformat]] +URI format +^^^^^^^^^^ + +[source] +---- +quickfix:configFile[?sessionID=sessionID&lazyCreateEngine=true|false] +---- + +The *configFile* is the name of the QuickFIX/J configuration to use for +the FIX engine (located as a resource found in your classpath). The +optional *sessionID* identifies a specific FIX session. The format of +the sessionID is: + +[source] +---- +(BeginString):(SenderCompID)[/(SenderSubID)[/(SenderLocationID)]]->(TargetCompID)[/(TargetSubID)[/(TargetLocationID)]] +---- + +The optional *lazyCreateEngine* (Camel 2.12.3+) parameter allows to +create QuickFIX/J engine on demand. Value *true* means the engine is +started when first message is send or there's consumer configured in +route definition. When **false** value is used, the engine is started at +the endpoint creation. When this parameter is missing, the value of +component's property *lazyCreateEngines* is being used. + +Example URIs: + +[source] +---- +quickfix:config.cfg + +quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange + +quickfix:config.cfg?sessionID=FIX.4.2:MyTradingCompany->SomeExchange&lazyCreateEngine=true +---- + +[[Quickfix-Endpoints]] +Endpoints +~~~~~~~~~ + +FIX sessions are endpoints for the *quickfix* component. An endpoint URI +may specify a single session or all sessions managed by a specific +QuickFIX/J engine. Typical applications will use only one FIX engine but +advanced users may create multiple FIX engines by referencing different +configuration files in *quickfix* component endpoint URIs. + +When a consumer does not include a session ID in the endpoint URI, it +will receive exchanges for all sessions managed by the FIX engine +associated with the configuration file specified in the URI. If a +producer does not specify a session in the endpoint URI then it must +include the session-related fields in the FIX message being sent. If a +session is specified in the URI then the component will automatically +inject the session-related fields into the FIX message. + +[[Quickfix-ExchangeFormat]] +Exchange Format +^^^^^^^^^^^^^^^ + +The exchange headers include information to help with exchange +filtering, routing and other processing. The following headers are +available: + +[width="100%",cols="10%,90%",options="header",] +|======================================================================= +|Header Name |Description +|EventCategory |One of `AppMessageReceived`, `AppMessageSent`, +`AdminMessageReceived`, `AdminMessageSent`, `SessionCreated`, +`SessionLogon`, `SessionLogoff`. See the `QuickfixjEventCategory` enum. + +|SessionID |The FIX message SessionID + +|MessageType |The FIX MsgType tag value + +|DataDictionary |Specifies a data dictionary to used for parsing an +incoming message. Can be an instance of a data dictionary or a resource +path for a QuickFIX/J data dictionary file +|======================================================================= + +The DataDictionary header is useful if string messages are being +received and need to be parsed in a route. QuickFIX/J requires a data +dictionary to parse certain types of messages (with repeating groups, +for example). By injecting a DataDictionary header in the route after +receiving a message string, the FIX engine can properly parse the data. + +[[Quickfix-QuickFIXJConfigurationExtensions]] +QuickFIX/J Configuration Extensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When using QuickFIX/J directly, one typically writes code to create +instances of logging adapters, message stores and communication +connectors. The *quickfix* component will automatically create instances +of these classes based on information in the configuration file. It also +provides defaults for many of the common required settings and adds +additional capabilities (like the ability to activate JMX support). + +The following sections describe how the *quickfix* component processes +the QuickFIX/J configuration. For comprehensive information about +QuickFIX/J configuration, see the +http://www.quickfixj.org/quickfixj/usermanual/usage/configuration.html[QFJ +user manual]. + +[[Quickfix-CommunicationConnectors]] +Communication Connectors +++++++++++++++++++++++++ + +When the component detects an initiator or acceptor session setting in +the QuickFIX/J configuration file it will automatically create the +corresponding initiator and/or acceptor connector. These settings can be +in the default or in a specific session section of the configuration +file. + +[width="100%",cols="10%,90%",options="header",] +|========================================================= +|Session Setting |Component Action +|`ConnectionType=initiator` |Create an initiator connector +|`ConnectionType=acceptor` |Create an acceptor connector +|========================================================= + +The threading model for the QuickFIX/J session connectors can also be +specified. These settings affect all sessions in the configuration file +and must be placed in the settings default section. + +[width="100%",cols="10%,90%",options="header",] +|======================================================================= +|Default/Global Setting |Component Action +|`ThreadModel=ThreadPerConnector` |Use `SocketInitiator` or +`SocketAcceptor` (default) + +|`ThreadModel=ThreadPerSession` |Use `ThreadedSocketInitiator` or +`ThreadedSocketAcceptor` +|======================================================================= + +[[Quickfix-Logging]] +Logging ++++++++ + +The QuickFIX/J logger implementation can be specified by including the +following settings in the default section of the configuration file. The +`ScreenLog` is the default if none of the following settings are present +in the configuration. It's an error to include settings that imply more +than one log implementation. The log factory implementation can also be +set directly on the Quickfix component. This will override any related +values in the QuickFIX/J settings file. + +[width="100%",cols="10%,90%",options="header",] +|======================================================================= +|Default/Global Setting |Component Action +|`ScreenLogShowEvents` |Use a `ScreenLog` + +|`ScreenLogShowIncoming` |Use a `ScreenLog` + +|`ScreenLogShowOutgoing` |Use a `ScreenLog` + +|`SLF4J*` |**Camel 2.6+**. Use a `SLF4JLog`. Any of the SLF4J settings +will cause this log to be used. + +|`FileLogPath` |Use a `FileLog` + +|`JdbcDriver` |Use a `JdbcLog` +|======================================================================= + +[[Quickfix-MessageStore]] +Message Store ++++++++++++++ + +The QuickFIX/J message store implementation can be specified by +including the following settings in the default section of the +configuration file. The `MemoryStore` is the default if none of the +following settings are present in the configuration. It's an error to +include settings that imply more than one message store implementation. +The message store factory implementation can also be set directly on the +Quickfix component. This will override any related values in the +QuickFIX/J settings file. + +[width="100%",cols="10%,90%",options="header",] +|============================================= +|Default/Global Setting |Component Action +|`JdbcDriver` |Use a `JdbcStore` +|`FileStorePath` |Use a `FileStore` +|`SleepycatDatabaseDir` |Use a `SleepcatStore` +|============================================= + +[[Quickfix-MessageFactory]] +Message Factory ++++++++++++++++ + +A message factory is used to construct domain objects from raw FIX +messages. The default message factory is `DefaultMessageFactory`. +However, advanced applications may require a custom message factory. +This can be set on the QuickFIX/J component. + +[[Quickfix-JMX]] +JMX ++++ + +[width="100%",cols="10%,90%",options="header",] +|============================================ +|Default/Global Setting |Component Action +|`UseJmx` |if `Y`, then enable QuickFIX/J JMX +|============================================ + +[[Quickfix-OtherDefaults]] +Other Defaults +++++++++++++++ + +The component provides some default settings for what are normally +required settings in QuickFIX/J configuration files. `SessionStartTime` +and `SessionEndTime` default to "00:00:00", meaning the session will not +be automatically started and stopped. The `HeartBtInt` (heartbeat +interval) defaults to 30 seconds. + +[[Quickfix-MinimalInitiatorConfigurationExample]] +Minimal Initiator Configuration Example ++++++++++++++++++++++++++++++++++++++++ + +[source] +---- +[SESSION] +ConnectionType=initiator +BeginString=FIX.4.4 +SenderCompID=YOUR_SENDER +TargetCompID=YOUR_TARGET +---- + +[[Quickfix-UsingtheInOutMessageExchangePattern]] +Using the InOut Message Exchange Pattern +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +*Camel 2.8+* + +Although the FIX protocol is event-driven and asynchronous, there are +specific pairs of messages +that represent a request-reply message exchange. To use an InOut +exchange pattern, there should +be a single request message and single reply message to the request. +Examples include an +OrderStatusRequest message and UserRequest. + +[[Quickfix-ImplementingInOutExchangesforConsumers]] +Implementing InOut Exchanges for Consumers +++++++++++++++++++++++++++++++++++++++++++ + +Add "exchangePattern=InOut" to the QuickFIX/J enpoint URI. The +`MessageOrderStatusService` in +the example below is a bean with a synchronous service method. The +method returns the response +to the request (an ExecutionReport in this case) which is then sent back +to the requestor session. + +[source,java] +---- + from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER&exchangePattern=InOut") + .filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_STATUS_REQUEST)) + .bean(new MarketOrderStatusService()); +---- + +[[Quickfix-ImplementingInOutExchangesforProducers]] +Implementing InOut Exchanges for Producers +++++++++++++++++++++++++++++++++++++++++++ + +For producers, sending a message will block until a reply is received or +a timeout occurs. There +is no standard way to correlate reply messages in FIX. Therefore, a +correlation criteria must be +defined for each type of InOut exchange. The correlation criteria and +timeout can be specified +using `Exchange` properties. + +[width="100%",cols="60%,10%,20%,10%",options="header",] +|======================================================================= +|Description |Key String |Key Constant |Default +|Correlation Criteria |"CorrelationCriteria" +|QuickfixjProducer.CORRELATION_CRITERIA_KEY |None + +|Correlation Timeout in Milliseconds |"CorrelationTimeout" +|QuickfixjProducer.CORRELATION_TIMEOUT_KEY |1000 +|======================================================================= + +The correlation criteria is defined with a `MessagePredicate` object. +The following example will treat +a FIX ExecutionReport from the specified session where the transaction +type is STATUS and the Order ID +matches our request. The session ID should be for the __requestor__, the +sender and target CompID fields +will be reversed when looking for the reply. + +[source,java] +---- +exchange.setProperty(QuickfixjProducer.CORRELATION_CRITERIA_KEY, + new MessagePredicate(new SessionID(sessionID), MsgType.EXECUTION_REPORT) + .withField(ExecTransType.FIELD, Integer.toString(ExecTransType.STATUS)) + .withField(OrderID.FIELD, request.getString(OrderID.FIELD))); +---- + +[[Quickfix-Example]] +Example ++++++++ + +The source code contains an example called `RequestReplyExample` that +demonstrates the InOut exchanges +for a consumer and producer. This example creates a simple HTTP server +endpoint that accepts order +status requests. The HTTP request is converted to a FIX +OrderStatusRequestMessage, is augmented with a +correlation criteria, and is then routed to a quickfix endpoint. The +response is then converted to a +JSON-formatted string and sent back to the HTTP server endpoint to be +provided as the web response. + +The Spring configuration have changed from Camel 2.9 onwards. See +further below for example. + +[[Quickfix-SpringConfiguration]] +Spring Configuration +^^^^^^^^^^^^^^^^^^^^ + +*Camel 2.6 - 2.8.x* + +The QuickFIX/J component includes a Spring `FactoryBean` for configuring +the session settings within a Spring context. A type converter for +QuickFIX/J session ID strings is also included. The following example +shows a simple configuration of an acceptor and initiator session with +default settings for both sessions. + +[source,xml] +---- +<!-- camel route --> +<camelContext xmlns="http://camel.apache.org/schema/spring" id="quickfixjContext"> + <route> + <from uri="quickfix:example"/> + <filter> + <simple>${in.header.EventCategory} == 'AppMessageReceived'</simple> + <to uri="log:test"/> + </filter> + </route> +</camelContext> + <!-- quickfix component --> +<bean id="quickfix" class="org.apache.camel.component.quickfixj.QuickfixjComponent"> +<property name="engineSettings"> + <util:map> + <entry key="quickfix:example" value-ref="quickfixjSettings"/> + </util:map> +</property> +<property name="messageFactory"> + <bean class="org.apache.camel.component.quickfixj.QuickfixjSpringTest.CustomMessageFactory"/> +</property> +</bean> + <!-- quickfix settings --> +<bean id="quickfixjSettings" class="org.apache.camel.component.quickfixj.QuickfixjSettingsFactory"> +<property name="defaultSettings"> + <util:map> + <entry key="SocketConnectProtocol" value="VM_PIPE"/> + <entry key="SocketAcceptProtocol" value="VM_PIPE"/> + <entry key="UseDataDictionary" value="N"/> + </util:map> +</property> +<property name="sessionSettings"> + <util:map> + <entry key="FIX.4.2:INITIATOR->ACCEPTOR"> + <util:map> + <entry key="ConnectionType" value="initiator"/> + <entry key="SocketConnectHost" value="localhost"/> + <entry key="SocketConnectPort" value="5000"/> + </util:map> + </entry> + <entry key="FIX.4.2:ACCEPTOR->INITIATOR"> + <util:map> + <entry key="ConnectionType" value="acceptor"/> + <entry key="SocketAcceptPort" value="5000"/> + </util:map> + </entry> + </util:map> +</property> +</bean> +---- + +*Camel 2.9 onwards* + +The QuickFIX/J component includes a `QuickfixjConfiguration` class for +configuring the session settings. A type converter for QuickFIX/J +session ID strings is also included. The following example shows a +simple configuration of an acceptor and initiator session with default +settings for both sessions. + +[source,xml] +---- +include::../../test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml[tags=e1] +---- + +[[Quickfix-Exceptionhandling]] +Exception handling +^^^^^^^^^^^^^^^^^^ + +QuickFIX/J behavior can be modified if certain exceptions are thrown +during processing of a message. If a `RejectLogon` exception is thrown +while processing an incoming logon administrative message, then the +logon will be rejected. + +Normally, QuickFIX/J handles the logon process automatically. However, +sometimes an outgoing logon message must be modified to include +credentials required by a FIX counterparty. If the FIX logon message +body is modified when sending a logon message +(EventCategory=`AdminMessageSent` the modified message will be sent to +the counterparty. It is important that the outgoing logon message is +being processed __synchronously__. If it is processed asynchronously (on +another thread), the FIX engine will immediately send the unmodified +outgoing message when it's callback method returns. + +[[Quickfix-FIXSequenceNumberManagement]] +FIX Sequence Number Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If an application exception is thrown during _synchronous_ exchange +processing, this will cause QuickFIX/J to not increment incoming FIX +message sequence numbers and will cause a resend of the counterparty +message. This FIX protocol behavior is primarily intended to handle +_transport_ errors rather than application errors. There are risks +associated with using this mechanism to handle application errors. The +primary risk is that the message will repeatedly cause application +errors each time it's re-received. A better solution is to persist the +incoming message (database, JMS queue) immediately before processing it. +This also allows the application to process messages asynchronously +without losing messages when errors occur. + +Although it's possible to send messages to a FIX session before it's +logged on (the messages will be sent at logon time), it is usually a +better practice to wait until the session is logged on. This eliminates +the required sequence number resynchronization steps at logon. Waiting +for session logon can be done by setting up a route that processes the +`SessionLogon` event category and signals the application to start +sending messages. + +See the FIX protocol specifications and the QuickFIX/J documentation for +more details about FIX sequence number management. + +[[Quickfix-RouteExamples]] +Route Examples +^^^^^^^^^^^^^^ + +Several examples are included in the QuickFIX/J component source code +(test subdirectories). One of these examples implements a trival trade +excecution simulation. The example defines an application component that +uses the URI scheme "trade-executor". + +The following route receives messages for the trade executor session and +passes application messages to the trade executor component. + +[source,java] +---- +from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER"). + filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AppMessageReceived)). + to("trade-executor:market"); +---- + +The trade executor component generates messages that are routed back to +the trade session. The session ID must be set in the FIX message itself +since no session ID is specified in the endpoint URI. + +[source,java] +---- +from("trade-executor:market").to("quickfix:examples/inprocess.cfg"); +---- + +The trader session consumes execution report messages from the market +and processes them. + +[source,java] +---- +from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET"). + filter(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.EXECUTION_REPORT)). + bean(new MyTradeExecutionProcessor()); +---- + +[[Quickfix-QuickFIXJComponentPriortoCamel2.5]] +QuickFIX/J Component Prior to Camel 2.5 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The *quickfix* component is an implementation of the +http://www.quickfixj.org/[QuickFIX/J] engine for Java . This engine +allows to connect to a FIX server which is used to exchange financial +messages according to http://www.fixprotocol.org/[FIX protocol] +standard. + +*Note:* The component can be used to send/receives messages to a FIX +server. + +[[Quickfix-URIformat.1]] +URI format +^^^^^^^^^^ + +[source] +---- +quickfix-server:config file +quickfix-client:config file +---- + +Where *config file* is the location (in your classpath) of the quickfix +configuration file used to configure the engine at the startup. + +*Note:* Information about parameters available for quickfix can be found +on +http://www.quickfixj.org/quickfixj/usermanual/usage/configuration.html[QuickFIX/J] +web site. + +The quickfix-server endpoint must be used to receive from FIX server FIX +messages and quickfix-client endpoint in the case that you want to send +messages to a FIX gateway. + +[[Quickfix-Exchangedataformat]] +Exchange data format +^^^^^^^^^^^^^^^^^^^^ + +The QuickFIX/J engine is like CXF component a messaging bus using MINA +as protocol layer to create the socket connection with the FIX engine +gateway. + +When QuickFIX/J engine receives a message, then it create a +QuickFix.Message instance which is next received by the camel endpoint. +This object is a 'mapping object' created from a FIX message formatted +initially as a collection of key value pairs data. You can use this +object or you can use the method 'toString' to retrieve the original FIX +message. + +*Note:* Alternatively, you can use link:bindy.html[camel bindy +dataformat] to transform the FIX message into your own java POJO + +When a message must be send to QuickFix, then you must create a +QuickFix.Message instance. + +[[Quickfix-Lazycreatingengines]] +Lazy creating engines +^^^^^^^^^^^^^^^^^^^^^ + +From *Camel 2.12.3* onwards, you can configure the QuickFixComponent to +lazy create and start the engines, which then only start these +on-demand. For example you can use this when you have multiple Camel +applications in a cluster with master/slaves. And want the slaves to be +standby. + +[[Quickfix-Samples]] +Samples +^^^^^^^ + +Direction : to FIX gateway + +[source,xml] +---- +<route> + <from uri="activemq:queue:fix"/> + <bean ref="fixService" method="createFixMessage"/> // bean method in charge to transform message into a QuickFix.Message + <to uri="quickfix-client:META-INF/quickfix/client.cfg"/> // Quickfix engine who will send the FIX messages to the gateway +</route> +---- + +Direction : from FIX gateway + +[source,xml] +---- +<route> + <from uri="quickfix-server:META-INF/quickfix/server.cfg"/> // QuickFix engine who will receive the message from FIX gateway + <bean ref="fixService" method="parseFixMessage"/> // bean method parsing the QuickFix.Message + <to uri="uri="activemq:queue:fix"/>" +</route> +---- + +[[Quickfix-SeeAlso]] +See Also +^^^^^^^^ + +* link:configuring-camel.html[Configuring Camel] +* link:component.html[Component] +* link:endpoint.html[Endpoint] +* link:getting-started.html[Getting Started] http://git-wip-us.apache.org/repos/asf/camel/blob/ce42784b/components/camel-quickfix/src/test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml ---------------------------------------------------------------------- diff --git a/components/camel-quickfix/src/test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml b/components/camel-quickfix/src/test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml index 62710f5..4fce661 100644 --- a/components/camel-quickfix/src/test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml +++ b/components/camel-quickfix/src/test/resources/org/apache/camel/component/quickfixj/QuickfixjSpringTest-context.xml @@ -25,6 +25,7 @@ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <!-- START SNIPPET: e1 --> + <!-- tag::e1[] --> <!-- camel route --> <camelContext id="quickfixjContext" xmlns="http://camel.apache.org/schema/spring"> <route> @@ -92,6 +93,7 @@ </util:map> </property> </bean> + <!-- end::e1[] --> <!-- END SNIPPET: e1 --> <!-- lazy quickfix settings --> @@ -121,6 +123,5 @@ </util:map> </property> </bean> - <!-- END SNIPPET: e2 --> </beans> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/ce42784b/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 588aa08..cd69358 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -94,6 +94,7 @@ * [JMS](jms.adoc) * [Metrics](metrics.adoc) * [Properties](properties.adoc) + * [Quickfix](quickfix.adoc) * [SJMS](sjms.adoc) * [SJMS Batch](sjms-batch.adoc)
