I have been trying to follow this discussion and I think I'm about 90%
up to speed (dangerous I know). Keeping the original binding information
around seems useful. Rebuilding the entire domain composite every time
there is a change seesm undesirable. Could we put the resolved/cloned
bindings in some other place in the model than the originals, so that
the originals are not overwritten?
Simon
Simon Laws wrote:
On Dec 12, 2007 12:10 AM, Raymond Feng <[EMAIL PROTECTED]> wrote:
Hi,
My understanding is that the bindings represent the configured endpoints:
reference bindings are for outbound while service bindings are for
inbound.
When a source reference is wired to a target service, we need to make sure
they are compatible in terms of interface contract and intent/policy.
+1
To me, there might be two types of wires. One type is to wire components
in
the same composite and the other is to wire components from different
composites in the same SCA domain. For the first type, it's fairly static
as
the composite is probably the basic unit for update. It makes sense to
match
I agree that you could consider wiring within a composite to be fairly
static. We have to be careful though as a reference could have wires to both
"local" composite based services and "remote" domain based services. So we
cannot consider a reference to be either local or remote just the wires that
it gives rise to.
the bindings upfront. But for the second type, composites join and leave
the
SCA domain dynamically, it's very hard to keep the matched binding in
sync.
Is it even wise to attempt to resolve the bindings? Should we consider a
SCA
domain level service as the match-maker whenever the reference is used to
make an outbound invocation?
Not sure I understand the last sentence. Let me say a little about how this
could operate...
The domain has full view of all of the composites that are currently active,
i.e. it knows what the domain level composite looks like. Importantly it
also knows about the two important events that affect the domain level
composite. AddToDomainLevelComposite and RemoveFromDomain LevelComposite. On
these two events it is able to look across all services and references in
the domain and perform the same matching process as happens within each
composite. Well it could if it knew the original set of bindings for each
reference. During this process it also knows which references are being
updated as a result of this process so it can pass any updates that result
off to the appropriate nodes if composites have been started. So I don't
think in this process the assembly model recognizes any material difference
between composite and domain level wires. The difference is the process
through at which they are created.
Let's consider the other approach we mentioned. Whenever the domain level
composite is changed the domain level composite is rebuilt along with all of
the composites it includes. I'm sure changes could be made to the current
code to make this work in terms of building the model of the world that the
domain knows about. It would remove a requirement to store the original
bindings for references as the process for resolving references and services
from the domain level down would resolve references in a single pass. The
downside of this approach is it's difficult to tell what has changed.
We could approach this in a number of ways. Keep the old model and compare
against the new to determine changes. Pass each composite off to the node
that is running it and have it determine what has changed (this is what
happens at the moment on a limited basis in that only the composites that
are known to have changed are sent out). The brute force approach could be
taken where a the node is restarted based on the changed composite but this
sounds a bit heavy handed to me in as much that services could become
unavailable in the event that small (or no) changes are made to the
composites that the node is running.
Regards
Simon
Thanks,
Raymond
----- Original Message -----
From: "Simon Laws" <[EMAIL PROTECTED]>
To: <tuscany-dev@ws.apache.org>
Sent: Tuesday, December 11, 2007 2:25 PM
Subject: Re: Binding target information
On Dec 11, 2007 5:46 PM, Raymond Feng <[EMAIL PROTECTED]> wrote:
Hi, Simon.
We went through a similar discussion before. The result is documented
at
http://cwiki.apache.org/confluence/display/TUSCANYWIKI/Multiple+bindings+and+reference+multiplicity
.
Can you check if it helps?
Thanks,
Raymond
----- Original Message -----
From: "Simon Laws" <[EMAIL PROTECTED]>
To: <tuscany-dev@ws.apache.org>
Sent: Tuesday, December 11, 2007 8:30 AM
Subject: Re: Binding target information
On Dec 11, 2007 3:11 PM, Mike Edwards
<[EMAIL PROTECTED]>
wrote:
Simon,
One of the questions here is whether the representation of the
targets
needs to mirror the alternate ways in which a target can be defined
by
the SCDL.
For example:
a) The target(s) can be defined by the @target attribute on the
reference. Each target can potentially use any one of the bindings
defined for the reference (which is used depends on the binding(s)
attached to each target service).
b) The target can be defined by the @uri attribute on the binding
(or
by
equivalent binding-specific data in other attributes or child
elements
of the binding). These targets are specific to the binding (and
typically there is only one per declared binding)
While it is reasonable to envision the first type of reference being
attached to the reference, I don't see that it is a good idea to
attach
the second type of reference to the reference - the second type are
clearly attached to a particular binding instance. (Consider the
case
where a reference has 2 binding.ws bindings attached, each with its
own
target defined in the @uri attributes, but where other aspects of
the
binding (eg policies) differ between the bindings.
While the target uri's may be technically interchangeable, in
reality
they have to be tied to the binding they are declared on - for
example,
one target may be within our business and require a low level of
security applid, while a second target may be outside our business
and
require a high level of security applied.
How do you think this plays out in the code?
Yours, Mike.
Simon Laws wrote:
When processing references at the domain level I need to know the
name
of
the target service which each reference binding is associated with
so
that I
can match the binding with the service name when the service
endpoint
is
made available or is moved or removed. As a work around I set the
binding
name to the target service name in the case that target services
cannot
be
resolved locally. Not ideal! .
I would like to propose that we add this information into the base
binding
model. For example,
public interface Binding extends Base {
Service getTargetService();
void setTargetService(Service service);
The other thing that this could help us sort out is the
OptimizableBinding.
This holds target service information. With the changes made to
take
the
majority of the domain logic out of the SCA binding I could get
away
with
just knowing the target service.
We do still have to be able to clone bindings (another feature of
OptimizableBinding) in the case where there is more than one
target.
If
I
understand it correctly the assembly model follows what you see in
composite
XML, For example,
<component name="SomeComponent">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref" target="TargetService1
TargetService2">
<binding.ws/>
<binding.jsonrpc/>
</reference>
</component>
Leads to a model that looks something like
Component
Reference
Targets
TargetService1
TargetService2
Bindings
binding.ws
binding.jsonrpc
With the obvious fun involved in working out which binding is
associated
with which target. If they both want to use the same binding it
has
to
be
cloned. Have I got this right? If so should we make bindings
generally
cloneable?
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Two points then some examples...
1) There are other cases also as the target could be specified using
autowire or wireByImpl.
2) The runtime code is interesting at the moment in as much as the
service
resolution process gives rise to the reference binding list from the
input
composite being replaced by a list of bindings that represent
resolved
connections to target services.
A)
<component name="SomeComponent">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref" target="TargetService1 TargetService2">
<binding.ws/>
<binding.jsonrpc/>
</reference>
</component>
may give rise to
reference
targets
TargetService1
TargetService2
bindings
binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
binding.ws
uri="http://localhost:8080/TargetService2"<http://binding.ws/>
This is where the effect is slightly odd. The result is right but we
loose
the original list of bindings from the reference.
B)
<component name="SomeComponent">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref">
<binding.ws uri="TargetService1"/ <http://binding.ws/>>
<binding.jsonrpc uri="TargetService2"/>
</reference>
</component>
may give rise to
reference
targets
? not sure if targets should be here
bindings
binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
binding.jsonrpc
uri="http://localhost:8080/TargetService2"<http://binding.ws/>
But I can't see that the code does this at the moment although I
haven't
actually tried it to prove that it doesn't work.
C)
<component name="SomeComponent">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref" >
<binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
/ <http://binding.ws/>>
</reference>
</component>
may give rise to
reference
targets
bindings
binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
D)
<component name="SomeComponent">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref" target="TargetService1 TargetService2">
<binding.ws uri="TargetService3"/ <http://binding.ws/>>
<binding.jsonrpc uri="TargetService4"/>
</reference>
</component>
This may give rise to the runtime model
reference
targets
TargetService1
TargetService2
bindings
binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
binding.ws
uri="http://localhost:8080/TargetService2"<http://binding.ws/>
E)
<component name="SomeComponent" autowire="true">
<implementation.java class="my.ComponentImpl"/>
<reference name="ref" >
<binding.ws/>
<binding.jsonrpc/>
</reference>
</component>
may give rise to
reference
targets
? would be handy to know the autowired target names
bindings
binding.ws
uri="http://localhost:8080/TargetService1"<http://binding.ws/>
binding.ws
uri="http://localhost:8080/TargetService2"<http://binding.ws/>
I don't know what happens with wire by impl but again it would seem
useful
if the target list included the names of services from the sca domain
that
have been wired.
So not sure if this answers your question.
Regards
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Hi Raymond.
Thanks for pointing me back to that. I think maybe I'm only coming to
appreciate the significance of this by working through this again from
the
domain point of view. I have to admit that I had forgotten the detail in
your matrix. When I looked at the wiki a while ago I didn't cotton on to
the
fact that the "Normalized/Component Reference" column is actually all
that
is stored in the assembly model and that the original component
reference
binding information is not available after each composite has initially
been
built.
From the domain point of view that's a little inconvenient as it means
we
would have to rebuild the domain completely each time something changes
so
that you are starting with a clean slate, i.e. you have access to the
original bindings for matching purposes. If I drop a new wire into the
domain I can't simply go and match potential references to services as
the
bindings may no longer be a complete set. Actually it would work the
first
time but not if I dropped in another wire for the same reference. The
wires
must be present before the reference is built so the complete set of
required bindings can be determined.
So this is teasing out two points
1. Lack of original binding list once composites are built. We wouldn't
need
this if we were to rebuild the whole domain on each change but we would
have
to change the assembly builders to allow the domainLeveComposite to be
built
in one go as the original binding list is gone once a composite is
built.
The code currently doesn't treat includes correctly so it won't work as
is.
2. My original point. No generic way to find the target name for a
binding.
It's difficult to quickly identify the binding that satisfies a
particular
target so any operations to update bindings in a reference after it's
been
built are problematic.We could maybe ignore for now the scenario where
someone rewires a reference in a domain. However I am currently updating
reference bindings to complete endpoint information as I don't know the
endpoint information until a composite has been started in a node.
Regards
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]