Tianlong Wu wrote:
Hi, Simon.
"In SCA, the default service name for a class with no @Service annotation
is the unqualified name of the class. In your example, the class is
named rocku.java.infoshare.services.__FeedImpl, so the service will be
named FeedImpl. "
I changed the service name to "FeedImpl" and I got a warning:
Service not found for component service: Component = FeedComponent
Service = FeedImpl
I remember that in the store example, the service names are always the
interface name.
So is that true the the default service name for a class with no
@Service annotation
is the unqualified name of the class?
In SCA 1.0 and Tuscany 1.x, if a class with no @Service annotation
implements an interface that has a @Remotable annotation, then the
service name will be the interface name instead of the class name.
This doesn't apply if the class implements an interface without a
@Remotable annotation.
In your code, does the Collection interface that is implemented by
the FeedImpl class have a @Remotable annotation? If so, this would
change the service name from FeedImpl to Collection.
In SCA 1.1 and Tuscany 2.0, this special treatment of interfaces with
a @Remotable annotation has been removed.
Simon
When it comes to my problem, I find it weird that the code runs OK
today. I paste the problematic
code in this post which didn't run correctly 4 days ago, and the feed
works fine! I can't figure out
why.
On Thu, Aug 18, 2011 at 4:19 PM, Simon Nash <[email protected]
<mailto:[email protected]>> wrote:
Tianlong Wu wrote:
I checked the example of blog-feed and fixed my problem.
Actually the code was right. It is the composite file that had sth.
wrong. In my composite file, I exposed service with the component:
<component name="FeedComponent">
<implementation.java
class="rocku.java.infoshare.__services.FeedImpl" />
<service name="Collection">
<t:binding.rss />
</service>
</component>
while in the blog-feed example, the RSS service was promoted:
<service name="BlogRSSAPIs" promote="BlogRSS">
<tuscany:binding.rss uri="http://localhost:8090/__BlogRSSAPIs
<http://localhost:8090/BlogRSSAPIs>"/>
</service>
<component name="BlogRSS">
<implementation.java
class="com.tuscanyscatours.__blog.feed.impl.__RSSBlogFeedImpl"/>
</component>
I changed my composite file adding a promoted service and
everything is OK.
So what's the difference between this two kind of service?
You don't need to use promotion. I modified the blog-feed sample to
expose a service without using promotion and confirmed that it works OK.
To make your non-promoted service work, you need to fix the service name
in your composite.
In SCA, the default service name for a class with no @Service annotation
is the unqualified name of the class. In your example, the class is
named rocku.java.infoshare.services.__FeedImpl, so the service will be
named FeedImpl. You need to use this name when configuring your
composite,
as follows:
<component name="FeedComponent">
<implementation.java
class="rocku.java.infoshare.__services.FeedImpl" />
<service name="FeedImpl">
<t:binding.rss />
</service>
</component>
The reason it works with promotion is that promotion allows you to
omit the service name if there is only one service in the component.
So when you write
promote="FeedComponent"
you are actually promoting the service named FeedComponent/FeedImpl
because this is the only service in FeedComponent.
It's not a good idea to use promotion in a top-level deployment
composite
as the blog-feed sample does. This is because SCA 1.1 and Tuscany 2.0
don't support this use of promotion to reconfigure a component deployed
into the domain. It works in Tuscany 1.x and is used by many of the
Tuscany 1.x samples, but this is for historical reasons. Promotion is
still used in SCA 1.1 and Tuscany 2.0 to reconfigure a service that's
part of an implementation composite.
Simon
On Tue, Aug 16, 2011 at 3:37 PM, Simon Nash <[email protected]
<mailto:[email protected]> <mailto:[email protected]
<mailto:[email protected]>>> wrote:
Tianlong Wu wrote:
hello,
I was trying to build a rss feed service using tuscany.
I implemented the interface
org.apache.tuscany.sca.____binding.rss.collection.____Collection
like this:
public class FeedImpl implements Collection {
public SyndEntry get(String id) throws NotFoundException {
// TODO Auto-generated method stub
SyndPerson author = new SyndPersonImpl( );
author.setEmail("editor@__exam__ple.org
<http://example.org>
<mailto:[email protected] <mailto:[email protected]>>
<mailto:[email protected] <mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>>")__;
author.setName("Example Person");
SyndEntry entry = new SyndEntryImpl( );
entry.setTitle("First Entry Title");
entry.setLink("http://www.__ex__ample.org/item1
<http://example.org/item1>
<http://www.example.org/item1>__");
SyndContent description = new SyndContentImpl( );
description.setValue("News about the Example
project");
description.setType("text");
entry.setDescription(____description);
entry.setAuthors(Collections.____singletonList(author));
return entry;
}
public SyndFeed getFeed() {
// TODO Auto-generated method stub
SyndPerson author = new SyndPersonImpl( );
author.setEmail("editor@__exam__ple.org
<http://example.org>
<mailto:[email protected] <mailto:[email protected]>>
<mailto:[email protected] <mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>>")__;
author.setName("Example Person");
SyndFeed feed = new SyndFeedImpl( );
feed.setTitle("Example Feed Output from ROME");
feed.setDescription("The Example Organization web
site");
feed.setAuthors(Collections.____singletonList(author));
feed.setLink("http://www.__exa__mple.org/
<http://example.org/>
<http://www.example.org/>");
feed.setPublishedDate(new Date( ));
List<SyndEntry> entries = new ArrayList<SyndEntry>();
try {
entries.add(this.get(""));
} catch (Exception e) {
// TODO: handle exception
}
feed.setEntries(entries);
return feed;
}
public SyndFeed query(String queryString) {
// TODO Auto-generated method stub
return getFeed();
}
}
and in my composite file there is:
<component name="FeedComponent">
<implementation.java
class="rocku.java.infoshare.____services.FeedImpl" />
<service name="Collection">
<t:binding.rss />
</service>
</component>
The application run successfully. But when I open the
URL(http://localhost:8080/____FeedComponent
<http://localhost:8080/__FeedComponent>
<http://localhost:8080/__FeedComponent
<http://localhost:8080/FeedComponent>>)
in my browser, it outputs the following error:
HTTP ERROR: 500
Invalid rss_2.0 feed, missing channel title
RequestURI=/FeedComponent
Caused by:
com.sun.syndication.io <http://com.sun.syndication.io>
<http://com.sun.syndication.io__>.__FeedException:
Invalid rss_2.0
feed, missing channel title
......
I found the JIRA page:
https://issues.apache.org/____jira/browse/TUSCANY-3111
<https://issues.apache.org/__jira/browse/TUSCANY-3111>
<https://issues.apache.org/__jira/browse/TUSCANY-3111
<https://issues.apache.org/jira/browse/TUSCANY-3111>>. It says that
adding a description to the feed would fix the problem. But I
explicitly set the title and
description in my code.
Thanks for your time.
The Tuscany travel sample contains an example of creating an
RSS feed.
See the contributions/blog-feed and launchers/blog-feed
directories
for details of how to do this successfully. The travel
sample isn't
part of the Tuscany binary distribution, so you'll need to
download it
separately from this page:
http://tuscany.apache.org/sca-____java-travel-sample-1x-____releases.html
<http://tuscany.apache.org/sca-__java-travel-sample-1x-__releases.html>
<http://tuscany.apache.org/__sca-java-travel-sample-1x-__releases.html
<http://tuscany.apache.org/sca-java-travel-sample-1x-releases.html>>
Simon
--
******************************____***********************
Tianlong Wu
Computer Science and Technology Dept.
Harbin Institute of Technology
NO.92 Xidazhi Street,150001
Harbin, Heilongjiang Province, P.R.China
--
******************************__***********************
Tianlong Wu
Computer Science and Technology Dept.
Harbin Institute of Technology
NO.92 Xidazhi Street,150001
Harbin, Heilongjiang Province, P.R.China
--
*****************************************************
Tianlong Wu
Computer Science and Technology Dept.
Harbin Institute of Technology
NO.92 Xidazhi Street,150001
Harbin, Heilongjiang Province, P.R.China