You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Harald Wellmann <ha...@gmx.de> on 2011/04/01 18:41:07 UTC

Re: Asynchronous Remoting with Futures

Cool, thanks :-) I'll check this out and give you some feedback.

Best regards,
Harald

Am 31.03.2011 11:57, schrieb davsclaus:
> This has been implemented in Camel 2.8. You can now use Future in your client
> interfaces, and the invocation will now be asynchronous.
>
> And there is a little example here
> https://cwiki.apache.org/confluence/display/CAMEL/Using+CamelProxy
>
> -----
> Claus Ibsen

Re: Asynchronous Remoting with Futures

Posted by ebergner <em...@gmail.com>.
Actually it turns out that it is not working. So the original question is
still valid. I've stepped through the code a little and I notice that when
it gets here (in JmsBinding):

protected JmsMessageType getJMSMessageTypeForBody(Exchange exchange, Object
body, Map<String, Object> headers, Session session, CamelContext context) {
    JmsMessageType type = null;
    // let body determine the type
    if (body instanceof Node || body instanceof String) {
        type = Text;
    } else if (body instanceof byte[] || body instanceof GenericFile || body
instanceof File || body instanceof Reader
            || body instanceof InputStream || body instanceof ByteBuffer ||
body instanceof StreamCache) {
        type = Bytes;
    } else if (body instanceof Map) {
        type = Map;
    } else if (body instanceof Serializable) {
        type = Object;            
    } else if
(exchange.getContext().getTypeConverter().convertTo(File.class, body) !=
null 
            ||
exchange.getContext().getTypeConverter().convertTo(InputStream.class, body)
!= null) {
        type = Bytes;
    }
    return type;
}

because Future is not Serializable, it will try to convert it to either a
File or an InputStream. Then it discovers that it is actually a future
object and gets the result. It is still trying to convert to either File or
Inputstream though, so this is what I tries to convert the Future result to
as well. Since my Response class does not have a TypeConverter to neither
File nor InputStream, the conversion results in Void.

Right now I have solved this by implementing a fallback TypeConverter on the
server that converts from a Serializable object to InputStream and byte[].
And a fallback TypeConverter on the client that converts from byte[] to a
Serializable object.

Should that be necessary or am I missing something? Any help would be very
much appreciated.

Thanks,
Emil



--
View this message in context: http://camel.465427.n5.nabble.com/Asynchronous-Remoting-with-Futures-tp3606370p4925187.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Asynchronous Remoting with Futures

Posted by ebergner <em...@gmail.com>.
Oh this is embarrassing. My Response object wasn't Serializable. Everything
works now. I'm surprised no exceptions were thrown though.

Sorry about that,
Emil

--
View this message in context: http://camel.465427.n5.nabble.com/Asynchronous-Remoting-with-Futures-tp3606370p4922915.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Asynchronous Remoting with Futures

Posted by ebergner <em...@gmail.com>.
Hi,

I'm trying to do something like this:

public interface Responder {
     Future<Response> respond(Request request); 
}

But the result I get from the received Future in the client is always null.
If I change the type to Future<String> everything works fine though. Do I
need to do anything extra to be able to return Futures containing my own
POJOs as results (the only example that I've seen uses Integer)?

Thanks,
Emil


--
View this message in context: http://camel.465427.n5.nabble.com/Asynchronous-Remoting-with-Futures-tp3606370p4922755.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Asynchronous Remoting with Futures

Posted by Claus Ibsen <cl...@gmail.com>.
On Sat, Apr 9, 2011 at 1:56 PM, Harald Wellmann <ha...@gmx.de> wrote:
> I've tested this with a small example using Camel 2.8-SNAPSHOT and Future<T>
> over JMS, which works fine.
>

Thats great.

> The only problem I'm having is not related to the new features, but rather
> to thread pool configuration, e.g. to increase the reply timeout.
>
> From http://camel.apache.org/threading-model.html I can see I somehow need
> to configure a ThreadPoolProfile and/or an ExecutorServiceStrategy, but I
> can't figure out how to do this in Java - all the examples use Spring XML
> with Camel extensions, but I'm trying to use Java Config wherever possible
> and I'm hoping to get rid of XML contexts with Spring 3.1...
>

You can always find examples in the unit test.

I assume you have read
http://camel.apache.org/threading-model.html

Camel in Action book chapter 10 shows you how to use that in both XML and Java.

Check out ExecutorServiceStrategy from CamelContext. Which has Java
API for the threading model.

And you can enlist custom thread pools in the Registry (for example
using SimpleRegistry) if you dont use Spring.




> Best regards,
> Harald
>
>> Am 31.03.2011 11:57, schrieb davsclaus:
>>>
>>> This has been implemented in Camel 2.8. You can now use Future in your
>>> client
>>> interfaces, and the invocation will now be asynchronous.
>>>
>>> And there is a little example here
>>> https://cwiki.apache.org/confluence/display/CAMEL/Using+CamelProxy
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
CamelOne 2011: http://fusesource.com/camelone2011/
Twitter: davsclaus
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Re: Asynchronous Remoting with Futures

Posted by Harald Wellmann <ha...@gmx.de>.
I've tested this with a small example using Camel 2.8-SNAPSHOT and 
Future<T> over JMS, which works fine.

The only problem I'm having is not related to the new features, but 
rather to thread pool configuration, e.g. to increase the reply timeout.

 From http://camel.apache.org/threading-model.html I can see I somehow 
need to configure a ThreadPoolProfile and/or an ExecutorServiceStrategy, 
but I can't figure out how to do this in Java - all the examples use 
Spring XML with Camel extensions, but I'm trying to use Java Config 
wherever possible and I'm hoping to get rid of XML contexts with Spring 
3.1...

Best regards,
Harald

> Am 31.03.2011 11:57, schrieb davsclaus:
>> This has been implemented in Camel 2.8. You can now use Future in your
>> client
>> interfaces, and the invocation will now be asynchronous.
>>
>> And there is a little example here
>> https://cwiki.apache.org/confluence/display/CAMEL/Using+CamelProxy