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"/>
</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]>> 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@__example.org
<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.__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@__example.org
<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.__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>)
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>.__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>. 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>
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