Hi Lars,

I've doubt that a customer that don't want to code java will manually coding drools file :-)

BTW i've this type of problems every day so i say how i've solved.

I give customer i high level process designer, and let him to generate service assembly. If he wants to chnage rules, he can simply change visually the process and regenerate code.

In our platform we've code generators where the user design routing rules visually and we get the drools file automatically generated, the only thing you need to provide are xpath rule.

Have you take a look at the spagic platform???

Andrea



Lars Heinemann ha scritto:
Andrea,

look at following situation:
You got a installation of your smx stuff at customers site. The customer wants to influence the routing mechanism. He is not aware of Java and also has no time and manpower to code a bean SU nor to code anything with smx. So how can this customer now solve this? Everytime calling a consulting company doing coding etc? The drools file is in the data folder of smx. He can easily go there and adapt the rules and targets without the need of recompiling/redeployment etc.

And btw. if a customer wants the router to be done with drools, you can't tell him to use servicemix-bean instead ;)

Regards
Lars



Am Mittwoch 06 August 2008 11:09:26 schrieb Andrea Zoppello:
Hi Lars,

What you're saing it's right nothing prevent to route an InOut Exchange,
but in my opinion in that case you have other better choices than drools
component.

I'm doing something similar processing, as you described and i've done
better for example with servicemix-bean than that drools.

In my opininion the original idea of the JbiHelper was to provide an
helper class, that could help user to route messages not to write
complex MEP exchange inside the route method, for this reason for me
make sense to have a class with two methods where:

1) route is used to route InOnly or RobustInOnly exchange

2) answer instead if you want to answer on the out message when an InOut
Exchage.


Andrea

Lars Heinemann ha scritto:
Andrea,

just some thoughts....

Am Mittwoch 06 August 2008 10:48:02 schrieb Andrea Zoppello:
Hi Gert,

The route method in my opinion is to handle inonly or robust inonly
exchange, if you want to answer you could use the answer method.
--> what prevents a user to not route InOut exchanges and why doesn't it
makes sense? If you use the drools as a simple router this makes imho
sense. You are right if all your processing logic is done in your drools
script, then you can just process it and send the answer.

Regards
Lars

In my opinion you must choose what you want to do when you write drools
file.

If you need to forward ( creating another exhange ) an InOnly exchange
use helper.route instead you need to use helper.answer.

This should cover all the case.

Andrea

Gert Vanthienen ha scritto:
Andrea,

Actually, I was just looking at applying that.  If the code in your
last comment goes into the routeTo method, isn't this a step back from
where we were?  It uses send() instead of sendSync(), but I no longer
see any possibility of handling an InOut or RobustInOnly with a Fault
message, or am I missing something there?

Regards,

Gert

Andrea Zoppello wrote:
Hi,

I had the same problem, take a look to mine last comment on
https://issues.apache.org/activemq/browse/SM-1248

Andrea

gigeril ha scritto:
Hi @ all.
I've following following setup of Servicemix:


TCP Client -----> TCP BC-->drools BC ------> TCP BC ---> TCP Server

                                                          |____>HTTP

BC -->
HTTP Server

If I connect (target Service) my own written TCP BC to the HTTP BC
or the
TCP BC it works fine (sync, async, Pattern: Inout, InOnly).
I get a problem if the drools engine get into the message chain.
Then I only
can send 23 Messages (always 23!!) until my tcp client reports me a
connection timeout and the connectors get stuck. I can only press
STRG+C in
the Servicemix Console Window to restart Servicemix and send 23
Messages.
This sending of this 23 Messages work fine. They take the way I
defined in
my .drl where it depends on the message content if it is send to the
tcp or
the http server. I also get the response back to the client.

This is the output when I press STRG+C. This whole stacktrace is
printed out
23 times.

INFO  - ServiceAssemblyLifeCycle       - Shutting down service
assembly:
droolsrouter-sa
INFO  - ServiceUnitLifeCycle           - Shutting down service unit:
droolsrouter-su
INFO  - ServiceUnitLifeCycle           - Shutting down service unit:
httpprovider-su
INFO  - ServiceUnitLifeCycle           - Shutting down service unit:
tcpconsumer-su
INFO  - ServiceUnitLifeCycle           - Shutting down service unit:
tcpprovider-su
INFO  - JBIContainer                   - ServiceMix JBI Container
(ServiceMix) stopped
[Fatal Error] :1:89: Content is not allowed in trailing section.
ERROR - DroolsComponent                - Error processing exchange
InOut[
  id: ID:10.22.20.113-11b93600c6f-4:0
  status: Active
  role: provider
  service: {http://knapp.com/tcphttp}myRouter
  endpoint: myRouter
  in: <?xml version="1.0" encoding="UTF-8"?><message
type="http"><text>hallo</text></message>
  out: Unable to display: org.xml.sax.SAXParseException: Content is
not allowed in trailing section.
]
org.drools.spi.ConsequenceException:
javax.jbi.messaging.MessagingException:
java.lang.InterruptedException
        at
org.drools.base.DefaultConsequenceExceptionHandler.handleException(De
fa ultConsequenceExceptionHandler.java:13

)
        at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:558
) at
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:518)
        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingM
em ory.java:475)

        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingM
em ory.java:439)

        at
org.apache.servicemix.drools.DroolsEndpoint.drools(DroolsEndpoint.jav
a: 183)

        at
org.apache.servicemix.drools.DroolsEndpoint.process(DroolsEndpoint.ja
va

:177)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLi
fe Cycle.java:597)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(Async
Ba seLifeCycle.java:548)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(Asy
nc BaseLifeCycle.java:502)

        at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(S
yn cLifeCycleWrapper.java:60)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBoun
d( DeliveryChannelImpl.java:610)

        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlo
w. java:172)

        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.j
av a:168)

        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.jav
a: 134)

        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
ut or.java:885)

        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.j ava:907)

        at java.lang.Thread.run(Thread.java:619)
Caused by: javax.jbi.messaging.MessagingException:
java.lang.InterruptedException
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:498)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:442)

        at
org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(Endpoin
tD eliveryChannel.java:102)

        at
org.apache.servicemix.drools.model.JbiHelper.routeTo(JbiHelper.java:1
51 )

        at
org.apache.servicemix.drools.model.JbiHelper.route(JbiHelper.java:109
) at
org.apache.servicemix.drools.Rule_tcphttp_http_0.consequence(Rule_tcp
ht tp_http_0.java:14)

        at
org.apache.servicemix.drools.Rule_tcphttp_http_0ConsequenceInvoker.ev
al uate(Rule_tcphttp_http_0ConsequenceInv

oker.java:20)
        at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:554
) ... 16 more
Caused by: java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.waitForExchan
ge (DeliveryChannelImpl.java:699)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:472)

        ... 23 more
ERROR - DroolsComponent                - Error setting exchange
status to
ERROR
java.lang.IllegalStateException: component is not owner when trying
to set
error: org.drools.spi.ConsequenceException: j
avax.jbi.messaging.MessagingException: java.lang.InterruptedException
        at
org.apache.servicemix.jbi.messaging.MessageExchangeImpl.setError(Mess
ag eExchangeImpl.java:264)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(Asy
nc BaseLifeCycle.java:516)

        at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(S
yn cLifeCycleWrapper.java:60)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBoun
d( DeliveryChannelImpl.java:610)

        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlo
w. java:172)

        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.j
av a:168)

        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.jav
a: 134)

        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
ut or.java:885)

        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.j ava:907)

        at java.lang.Thread.run(Thread.java:619)
Caused by: org.drools.spi.ConsequenceException:
javax.jbi.messaging.MessagingException:
java.lang.InterruptedException at
org.drools.base.DefaultConsequenceExceptionHandler.handleException(De
fa ultConsequenceExceptionHandler.java:13

)
        at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:558
) at
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:518)
        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingM
em ory.java:475)

        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingM
em ory.java:439)

        at
org.apache.servicemix.drools.DroolsEndpoint.drools(DroolsEndpoint.jav
a: 183)

        at
org.apache.servicemix.drools.DroolsEndpoint.process(DroolsEndpoint.ja
va

:177)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLi
fe Cycle.java:597)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(Async
Ba seLifeCycle.java:548)

        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(Asy
nc BaseLifeCycle.java:502)

        ... 8 more
Caused by: javax.jbi.messaging.MessagingException:
java.lang.InterruptedException
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:498)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:442)

        at
org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(Endpoin
tD eliveryChannel.java:102)

        at
org.apache.servicemix.drools.model.JbiHelper.routeTo(JbiHelper.java:1
51 )

        at
org.apache.servicemix.drools.model.JbiHelper.route(JbiHelper.java:109
) at
org.apache.servicemix.drools.Rule_tcphttp_http_0.consequence(Rule_tcp
ht tp_http_0.java:14)

        at
org.apache.servicemix.drools.Rule_tcphttp_http_0ConsequenceInvoker.ev
al uate(Rule_tcphttp_http_0ConsequenceInv

oker.java:20)
        at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:554
) ... 16 more
Caused by: java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.waitForExchan
ge (DeliveryChannelImpl.java:699)

        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(Deli
ve ryChannelImpl.java:472)

        ... 23 more



So my rule.drl looks like:

package org.apache.servicemix.drools

import org.apache.servicemix.drools.model.Exchange;

global org.apache.servicemix.drools.model.JbiHelper jbi;


rule "tcphttp:http"
    when
        me : Exchange( status == Exchange.ACTIVE, inmsg : in != null
); eval( inmsg.xpath("/message/@type = \"http\""))
    then

System.out.println("!!!!!!!!!!!!!!!!!!!!!http!!!!!!!!!!!!!!!!!!!!!!!
");
        jbi.route( "service:http://knapp.com/tcphttp/dhttp_provider";
); end

rule "tcphttp:tcp"
    when
        me : Exchange( status == Exchange.ACTIVE, inmsg : in != null
); eval( inmsg.xpath("/message/@type = \"tcp\""));
    then

System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!tcp!!!!!!!!!!!!!!!!!!
"); jbi.route( "service:http://knapp.com/tcphttp/dtcp_provider"; );
end




My xbean.xml for the drools su:

<beans xmlns:drools="http://servicemix.apache.org/drools/1.0";
       xmlns:tcphttp="http://knapp.com/tcphttp";
       xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance";
       xsi:schemaLocation="http://servicemix.apache.org/drools/1.0
http://servicemix.apache.org/schema/servicemix-drools-3.2.2.xsd
       http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>

  <drools:endpoint service="tcphttp:myRouter"
                   endpoint="myRouter"
                   ruleBaseResource="classpath:rule.drl"
                   namespaceContext="#nsContext" />


  <drools:namespace-context id="nsContext">
    <drools:namespaces>
      <drools:namespace
prefix="tcphttp">http://knapp.com/tcphttp</drools:namespace>
    </drools:namespaces>
  </drools:namespace-context>

</beans>



Reply via email to