camel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bengt Rodehav (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CAMEL-1350) camel-quickfix component in apache camel distribution
Date Wed, 29 Sep 2010 07:33:43 GMT

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


Mime
View raw message