Re: ServiceMix Bean issues with send()

2007-10-17 Thread Andreas Schaefer (2)

Hi Geeks

I am moving this thread to the DEV mailing list because it not about  
using ServiceMix anymore. The problem is that when using the  
asynchronous message exchange that the response is not sent back to  
the calling SU but to the Provider Endpoint of the called SU.


I just keep on spinning here. I have a closer look at the  
MessageExchangeImpl and saw that the Mirror references the same  
packet and beside the ROLE and STATUS everything else is set or  
retrieved from the packet. This means that always the MIRROR is  
pointing to the same service, endpoint etc.


Creating a new ME it will be of role CONSUMER and the mirror is of  
role PROVIDER. The Delivery Channel (DC) will send the ME using the  
mirror and so the DC will send it to the target service PROVIDER  
endpoint. When the response is sent back the DC will use the MIRROR  
(of the MIRROR), which has not the role CONSUMER, but because of the  
same packet it will use the same Service / Endpoint / Interface Name  
meaning the message is sent back to the same service with the only  
exception that the ME is send to the CONSUMER endpoint instead.


But shouldn't it be that the ME references the CONSUMER endpoint of  
the caller (the service that created and sent the message originally)  
and the MIRROR references the PROVIDER endpoint of the called service  
(the service that received the original message) which most likely  
are not the same SU.


This would mean that the addressing parts (service name, endpoint,  
interface name) must be removed from the packet and kept separate  
from the ME and its MIRROR. We might also need to swap the ME and  
MIRROR so that the ME is pointing to the PROVIDER and the MIRROR  
pointing to the CONSUMER. This means that the DC will use the ME  
instead of the MIRROR to send the ME and NMR or the receiving DC must  
swap the ME / MIRROR so that the Provider Endpoint receives the  
MIRROR which is subsequently pointing back to the calling service.


Let me know what you think?

Thanks - Andy

On Oct 17, 2007, at 9:11 AM, Andreas Schaefer (2) wrote:


Hi Guillaume

I tried something new using the SCRIPT as the provider service  
rather than another BEAN. Now I think I see a little bit more what  
is going wrong. What is happening is that the response is handled  
by the BeanComponent (which is good) but because it is using the  
MIRROR member to which it sends the response to it fails because of  
an unknown request (it should work because I fix that issue locally).


From my understanding I think the message is properly sent back to  
the correct BC/SE, in this case the Bean Component, but because it  
uses the MIRROR as the address it sends it to the wrong SU, which  
in this case is the SCRIPT SU which is not even a BEAN. It seems to  
me that the MIRROR is pointing to the consumer endpoint of the  
provider SU rather than the consumer SU. That is my log output:


[Notes Andy]: Here I send the InOut Message to he Provider:

2007-10-17 08:51:53,515 [58-0:0-thread-1] INFO   
ScriptInOutControllerBean  - onMessageExchange() send new ME:  
InOut[

  id: ID:10.250.1.197-115aea91258-2:0
  status: Active
  role: consumer
  service: {urn:scout}script-receiver-service
  operation: IdontCare: 0
  in: ?xml version=1.0 encoding=UTF-8? 
receivertitleDontCareEvenMore/titleindex0/index/receiver

]
2007-10-17 08:51:53,515 [58-0:0-thread-1] DEBUG  
BeanComponent  - Created correlation id: ID: 
10.250.1.197-115aea91258-2:0
2007-10-17 08:51:53,515 [58-0:0-thread-1] DEBUG  
DeliveryChannelImpl- Send ID: 
10.250.1.197-115aea91258-2:0 in DeliveryChannel{ID: 
10.250.1.197-115aea91258-0:0}


[Notes Andy]: AS-LOG are log statements I added to Smx

2007-10-17 08:51:53,515 [58-0:0-thread-1] INFO   
DeliveryChannelImpl- AS-LOG, doSend(), ME: InOut[

  id: ID:10.250.1.197-115aea91258-2:0
  status: Active
  role: consumer
  service: {urn:scout}script-receiver-service
  operation: IdontCare: 0
  in: ?xml version=1.0 encoding=UTF-8? 
receivertitleDontCareEvenMore/titleindex0/index/receiver

]
2007-10-17 08:51:53,516 [58-0:0-thread-1] INFO   
DeliveryChannelImpl- AS-LOG, doSend(), send exchange to  
MIRROR: InOut[

  id: ID:10.250.1.197-115aea91258-2:0
  status: Active
  role: provider
  service: {urn:scout}script-receiver-service
  operation: IdontCare: 0
  in: ?xml version=1.0 encoding=UTF-8? 
receivertitleDontCareEvenMore/titleindex0/index/receiver

]
2007-10-17 08:51:53,516 [58-0:0-thread-1] DEBUG  
SedaFlow   - Called Flow send
2007-10-17 08:51:53,518 [58-0:1-thread-1] DEBUG  
SedaQueue  -  
[EMAIL PROTECTED] dequeued  
exchange: InOut[

  id: ID:10.250.1.197-115aea91258-2:0
  status: Active
  role: provider
  service: {urn:scout}script-receiver-service
  endpoint: in-out-receiver
  operation: IdontCare: 0
  in: ?xml version=1.0 encoding=UTF-8? 
receivertitleDontCareEvenMore/titleindex0/index/receiver

]
2007-10-17 08:51:53,518 

ServiceMix Bean issues with send()

2007-10-15 Thread Andreas Schaefer (2)

Hi

I try to figure out what is going wrong with the ServiceMix Bean  
component when used with an asynchronous message exchange (send()).  
There is a good chance to I do not understand how the message  
exchange should work. This is what I tried:


- Bean SU 1 sends an In-Out ME to another Bean SU 2 with send() on  
the Delivery Channel
- B SU 2 handles the message and puts in an Out normalized message  
and then sends the ME back with send() on its Delivery Channel


What I see is that the Delivery Channel is sending the Mirror ME  
which is nearly the same but just has the opposite role (here  
consumer). This means that the message is sent back to the Consumer  
Bean Endpoint because that is the address set in the Mirror ME.


Is my assumption right that when a message is read from the NMR that  
it goes through the Provider endpoint and when the message is sent  
back that it then goes first through the Consumer endpoint of the  
same service or should it go to the Consumer endpoint of the calling  
service?
If the consumer endpoint of he SAME service is called then who is  
responsible on sending the message back to the calling service (B SU  
1) and is there a way to do this automatically (meaning with having  
to code anything in the Bean SUs)?


Thank you

Andreas Schaefer
CEO of Madplanet.com Inc.
[EMAIL PROTECTED]




PGP.sig
Description: This is a digitally signed message part


Re: ServiceMix Bean issues with send()

2007-10-15 Thread Guillaume Nodet
On 10/16/07, Andreas Schaefer (2) [EMAIL PROTECTED] wrote:
 Hi

 I try to figure out what is going wrong with the ServiceMix Bean component
 when used with an asynchronous message exchange (send()). There is a good
 chance to I do not understand how the message exchange should work. This is
 what I tried:

 - Bean SU 1 sends an In-Out ME to another Bean SU 2 with send() on the
 Delivery Channel
 - B SU 2 handles the message and puts in an Out normalized message and then
 sends the ME back with send() on its Delivery Channel

 What I see is that the Delivery Channel is sending the Mirror ME which is
 nearly the same but just has the opposite role (here consumer). This means
 that the message is sent back to the Consumer Bean Endpoint because that is
 the address set in the Mirror ME.

Yeah.  The thing is that in JBI, an exchange is sent from a component
to an endpoint.  In an InOut mep, the provider will send the exchange
with the out message inside, the nmr will route it to the consumer
component, which will dispatch it to the consumer endpoint.  The
endpoint processes the response and need to send back the exchange
with a DONE status.  The mirror stuff is used internally.


 Is my assumption right that when a message is read from the NMR that it goes
 through the Provider endpoint and when the message is sent back that it then
 goes first through the Consumer endpoint of the same service or should it go
 to the Consumer endpoint of the calling service?

I don't understand what is the difference you make between Consumer
endpoint of the same service and  Consumer endpoint of the calling
service ? Do you mean the POJO instance ?

 If the consumer endpoint of he SAME service is called then who is
 responsible on sending the message back to the calling service (B SU 1) and
 is there a way to do this automatically (meaning with having to code
 anything in the Bean SUs)?


If you don't implement MessageExchangeListener and you want to use
InOut asynchronously, then you need to use the @Callback annotation
and the Destination.

Else, I think the problem is that the component does not track that a
given endpoint acts as a consumer and send an exchange, so that it can
not route it back to the endpoint.  This would require wrapping the
DeliveryChannel or simply overriding the sendConsumerExchange method
from the component.  All exchanges sent from endpoints could be
tracked, but we still don't have any way to call the bean, unless it
has a @Callback.

Can you post your beans, because servicemix-bean has different ways of
writing a bean, so...

 Thank you


 Andreas Schaefer
 CEO of Madplanet.com Inc.
 [EMAIL PROTECTED]





-- 
Cheers,
Guillaume Nodet

Blog: http://gnodet.blogspot.com/