[
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.