[ 
https://issues.apache.org/activemq/browse/CAMEL-1350?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=62215#action_62215
 ] 

Bengt Rodehav commented on CAMEL-1350:
--------------------------------------

Steve,

I think the approach you suggest works really fine. Since you allow an 
arbitrary number of "listeners" it is possible to intercept all messages this 
way - login messages included. The login example is well suited to be included 
in the documentation.

One thing that warrants an explanation is "both scenarios require the Camel 
processor to be executing in the same thread as the QFJ engine". I think I know 
what you mean but I think it is really important that this is clear to all 
developers using this component.

I assume, as long as we don't start additional threads, that a specific message 
will be sent through all routes that are configured to "listen" to that message 
(by specifying the same configuration file and a combination of filters that 
cause them to match the message). Is that true? If yes, do we need to make the 
ordering explicit? Do we need to be able to determine what route the message 
shall first be sent through? I'm not sure what I think about this but I think 
that this is an area that will have to be documented in good way.

You also state that: "It's ok to pass messages to other threads but be sure the 
message is persisted locally first since you will not be able to rely on 
transport-level resends via FIX." Do you by this mean that the message is 
regarded as "processed" by QuickFixJ when it has passed through all routes, 
that reside in the same thread as the QFJ engine, that "match" the message? 
This is really important to know for a developer in order to prevent "lost 
messages".

Although very flexible, I'm a bit concerned that the concept of having multiple 
routes listening to the same message can be a bit confusing and lead to 
programming errors (that can cause lost messages). I'm all for flexibility but 
I think you should add an example to the documentation that uses more than one 
thread and clearly show how you persist the message in a route residing in the 
same thread as the QFJ engine. Maybe a best-practice could be developed for 
this pattern?

I'm not a Camel expert like many who have commented on this JIRA ticket. But, 
isn't it very unusual for a component to be "natively" multicast - meaning that 
the same message can be sent to multiple routes? That feature probably needs to 
be pointed out and explained clearly. Personally, I'm for that solution but I 
haven't adapted my brain to that way of thinking yet.



> camel-quickfix component in apache camel distribution
> -----------------------------------------------------
>
>                 Key: CAMEL-1350
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1350
>             Project: Apache Camel
>          Issue Type: New Feature
>         Environment:  <properties>
>               <camel-version>2.0-SNAPSHOT</camel-version>
>               <fuse-version>2.x-fuse-SNAPSHOT</fuse-version>
>               <activemq-version>5.2.0</activemq-version>
>               <quickfix-version>1.3.3</quickfix-version>
>               <mina-version>1.1.0</mina-version>
>               <slf4j-version>1.5.6</slf4j-version>
>       </properties>
>            Reporter: Charles Moulliard
>            Assignee: Hadrian Zbarcea
>             Fix For: 2.5.0
>
>         Attachments: camel-quickfix-2.zip, camel-quickfix.patch, 
> camel-quickfix.zip, camel-quickfix.zip, QuickFixDataFormat.java, 
> reportincident.quickfix.zip
>
>
> Hi,
> ATTENTION: Ignoring converter type: org.apache.camel.fix.FixConverter as a 
> dependent class could not be found: java.lang.NoClassDefFoundError: 
> biz/c24/io/api/data/DataType
> java.lang.NoClassDefFoundError: biz/c24/io/api/data/DataType
>       at java.lang.Class.getDeclaredMethods0(Native Method)
>       at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
>       at java.lang.Class.getDeclaredMethods(Class.java:1791)
>       at 
> org.apache.camel.impl.converter.AnnotationTypeConverterLoader.loadConverterMethods(AnnotationTypeConverterLoader.java:147)
>       at 
> org.apache.camel.impl.converter.AnnotationTypeConverterLoader.load(AnnotationTypeConverterLoader.java:78)
>       at 
> org.apache.camel.impl.converter.DefaultTypeConverter.checkLoaded(DefaultTypeConverter.java:260)
>       at 
> org.apache.camel.impl.converter.DefaultTypeConverter.convertTo(DefaultTypeConverter.java:95)
>       at 
> org.apache.camel.impl.converter.DefaultTypeConverter.convertTo(DefaultTypeConverter.java:71)
>       at 
> org.apache.camel.util.IntrospectionSupport.convert(IntrospectionSupport.java:263)
>       at 
> org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:221)
>       at 
> org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:188)
>       at 
> org.apache.camel.impl.DefaultComponent.setProperties(DefaultComponent.java:213)
>       at 
> org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:63)
>       at 
> org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:33)
>       at 
> org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:81)
>       at 
> org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:330)
>       at 
> org.apache.camel.util.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:54)
>       at org.apache.camel.model.RouteType.resolveEndpoint(RouteType.java:96)
>       at 
> org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:106)
>       at 
> org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:112)
>       at org.apache.camel.model.FromType.resolveEndpoint(FromType.java:72)
>       at 
> org.apache.camel.impl.DefaultRouteContext.getEndpoint(DefaultRouteContext.java:81)
>       at org.apache.camel.model.RouteType.addRoutes(RouteType.java:239)
>       at org.apache.camel.model.RouteType.addRoutes(RouteType.java:86)
>       at 
> org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:661)
>       at 
> org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:651)
>       at 
> org.apache.camel.spring.SpringCamelContext.maybeDoStart(SpringCamelContext.java:166)
>       at 
> org.apache.camel.spring.SpringCamelContext.doStart(SpringCamelContext.java:161)
>       at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:49)
>       at 
> org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:96)
>       at 
> org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:115)
>       at 
> org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicationEventMulticaster.java:78)
>       at 
> org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
>       at 
> org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:76)
>       at 
> org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:274)
>       at 
> org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:736)
>       at 
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:383)
>       at 
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
>       at 
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
>       at 
> org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:232)
>       at org.apache.camel.spring.Main.doStart(Main.java:186)
>       at org.apache.camel.impl.ServiceSupport.start(ServiceSupport.java:49)
>       at org.apache.camel.util.MainSupport.run(MainSupport.java:121)
>       at org.apache.camel.util.MainSupport.run(MainSupport.java:299)
>       at org.apache.camel.spring.Main.main(Main.java:98)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at org.apache.camel.maven.RunMojo$1.run(RunMojo.java:396)
>       at java.lang.Thread.run(Thread.java:619)
> The org.apache.camel.fix.FixConverter class uses proprietary classes : 
> import biz.c24.io.api.data.BooleanDataType;
> import biz.c24.io.api.data.CharDataType;
> import biz.c24.io.api.data.ComplexDataObject;
> import biz.c24.io.api.data.ComplexDataType;
> import biz.c24.io.api.data.DataType;
> import biz.c24.io.api.data.DateDataType;
> import biz.c24.io.api.data.Element;
> import biz.c24.io.api.data.IntDataType;
> import biz.c24.io.api.data.NumberDataType;
> import biz.c24.io.api.data.StringDataType;
> import biz.c24.io.api.presentation.TextualSource;
> import biz.c24.io.fix42.NewOrderSingleElement;
> Except if those classes are part of open source community but How can I use 
> this component without Artix Data Service ?
> ex config :
>               <route>
>                       <from uri="fixserver:banzai-to-camel.cfg" />
>                       <to uri="log:quickfix" />
>               </route>

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to