camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jjb <jj_burf...@yahoo.com>
Subject Re: bean binding with inheritance & 2.0-M3 camel-http
Date Thu, 06 Aug 2009 22:30:57 GMT

Hi, Claus.

I was hoping to get the latest SNAPSHOT with the HttpMessage.getResponse
method implemented.  I just updated from the SNAPSHOT repo and verified it's
not there yet:

stealth: wget --no-check-certificate
https://repository.apache.org/content/repositories/snapshots//org/apache/camel/camel-http/2.0-SNAPSHOT/camel-http-2.0-SNAPSHOT.jar
--2009-08-06 15:28:08-- 
https://repository.apache.org/content/repositories/snapshots//org/apache/camel/camel-http/2.0-SNAPSHOT/camel-http-2.0-SNAPSHOT.jar
Resolving repository.apache.org... 140.211.11.100
Connecting to repository.apache.org|140.211.11.100|:443... connected.
WARNING: cannot verify repository.apache.org's certificate, issued by
`/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com,
Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure
Certification Authority/serialNumber=07969287':
  Self-signed certificate encountered.
HTTP request sent, awaiting response... 200 OK
Length: 42721 (42K) [text/plain]
Saving to: `camel-http-2.0-SNAPSHOT.jar'

100%[=================================================================================================================================================>]
42,721      73.7K/s   in 0.6s    

2009-08-06 15:28:09 (73.7 KB/s) - `camel-http-2.0-SNAPSHOT.jar' saved
[42721/42721]

stealth: javap -classpath camel-http-2.0-SNAPSHOT.jar
org.apache.camel.component.http.HttpMessage
Compiled from "HttpMessage.java"
public class org.apache.camel.component.http.HttpMessage extends
org.apache.camel.impl.DefaultMessage{
    public
org.apache.camel.component.http.HttpMessage(org.apache.camel.Exchange,
javax.servlet.http.HttpServletRequest);
    public javax.servlet.http.HttpServletRequest getRequest();
    protected java.lang.Object createBody();
}

stealth: 


Do you know when it might make it into the repo?

Thanks!


Claus Ibsen-2 wrote:
> 
> Hi
> 
> Also the bean method name issue has been fixed in trunk.
> So if possible please test it at your side by building from source or
> try SNAPSHOT when a new build is published to apache maven repos.
> 
> On Wed, Aug 5, 2009 at 1:55 PM, Claus Ibsen<claus.ibsen@gmail.com> wrote:
>> Hi
>>
>> Okay I am committing a fix in short time.
>>
>> You can grab it using 2 ways
>> - from the body using the camel type converter, to avoid ugly java type
>> casts
>> - using java type cast to cast the message to HttpMessage
>>
>>            // we have access to the HttpServletRequest here and we
>> can grab it if we need it
>>            HttpServletRequest req =
>> exchange.getIn().getBody(HttpServletRequest.class);
>>            assertNotNull(req);
>>
>>            // we have access to the HttpServletResponse here and we
>> can grab it if we need it
>>            HttpServletResponse res =
>> exchange.getIn().getBody(HttpServletResponse.class);
>>            assertNotNull(res);
>>
>>            // and they should also be on HttpMessage
>>            HttpMessage msg = (HttpMessage) exchange.getIn();
>>            assertNotNull(msg.getRequest());
>>            assertNotNull(msg.getResponse());
>>
>> And use the output stream to write to the servlet response
>>
>>            // and we can use servlet response to write to output stream
>> also
>>            res.getOutputStream().print("Written by servlet response");
>>
>>
>> On Wed, Aug 5, 2009 at 10:55 AM, Claus Ibsen<claus.ibsen@gmail.com>
>> wrote:
>>> Hi
>>>
>>> Cool I have added a ticket to get it back
>>> https://issues.apache.org/activemq/browse/CAMEL-1879
>>>
>>>
>>> On Wed, Aug 5, 2009 at 10:52 AM, jjb<jj_burford@yahoo.com> wrote:
>>>>
>>>> Hi, Claus.
>>>>
>>>> I built a framework to receive status related messages from a topic as
>>>> the
>>>> route is traversed.  Consider the routes the define DerivedClass -> A
>>>> -> B
>>>> -> C.  As each segment in the route executes, it sends JAXB/XML
>>>> messages to
>>>> a topic that are then forwarded back to the client via a callback.  As
>>>> the
>>>> DerivedClass receives these messages, it sends them back over the HTTP
>>>> socket (via the HttpServletResponse) to the invoking web client.  This
>>>> gives
>>>> the web client a realtime flow of XML status updates while the
>>>> different
>>>> endpoints are traversed.  Since I do not want DerivedClass to know
>>>> about
>>>> Camel or JMS, there is a class which DerivedClass submits a request to
>>>> (manager instance below) that also listens on this topic for related
>>>> status
>>>> messages.  These I get via callback and write them to the web client
>>>> accordingly:
>>>>
>>>>
>>>> public interface Client
>>>> {
>>>>    public void notify(String status);
>>>> }
>>>>
>>>> public DerivedClass implements Client
>>>> {
>>>>    HttpServletResponse response;
>>>>
>>>>    public void process(Exchange exchange)
>>>>    {
>>>>        HttpServletResponse response = ....;   // need to know how to
>>>> get
>>>> this
>>>>        String request = "MY XML REQUEST";   // this is actually a JAXB
>>>> serialized object
>>>>
>>>>        // submit XML request to class which listens on topic and calls
>>>> notify with stuff for us
>>>>        manager.submit(request, this);
>>>>    }
>>>>
>>>>    // we get our stuff from the manager object which listens on a topic
>>>> and
>>>> correlates status
>>>>    // messages and calls this notify method
>>>>    public notify(String status)
>>>>    {
>>>>         response.getWriter().println(status);
>>>>    }
>>>> }
>>>>
>>>> I was hoping 2.0-M3 Camel would allow access to HttpServletRequest as
>>>> before
>>>> 2.0-M3 so I can make my own synchronous writes to the HTTP client from
>>>> DerivedClass with no dependence on Camel.
>>>>
>>>> Regards
>>>>
>>>> response.getWriter().println(statusStr)
>>>>
>>>> Claus Ibsen-2 wrote:
>>>>>
>>>>> Hi
>>>>>
>>>>> Ah the response may be missing on the HttpMessage.
>>>>>
>>>>> What do you need it for?
>>>>>
>>>>> On Wed, Aug 5, 2009 at 9:51 AM, jjb<jj_burford@yahoo.com> wrote:
>>>>>>
>>>>>> Hi, Claus.
>>>>>>
>>>>>> Thank you so much for looking into the issue.  My last request has
to
>>>>>> do
>>>>>> with how to obtain a reference to the HttpServletResponse in the
new
>>>>>> (>=
>>>>>> 2.0-M3) Camel API.  I can get the HttpServletRequest as you suggested
>>>>>> (using
>>>>>> HttpMessage), but how do I obtain a reference to the
>>>>>> HttpServletResponse
>>>>>> from a method with is the "to" endpoint of a camel-jetty "from" route
>>>>>> that
>>>>>> takes an Exchange parameter as so:
>>>>>>
>>>>>> public void process(Exchange exchange)
>>>>>> {
>>>>>>    HttpMessage in = (HttpMessag) exchange.getIn();
>>>>>>    HttpServletRequest = in.getRequest();
>>>>>>
>>>>>>    // how do I get to the HttpServletResponse which used to be
>>>>>> accessed <
>>>>>> 2.0-M3
>>>>>>    // like this: HttpServletResponse response =
>>>>>> ((HttpExchange)exchange).getResponse();
>>>>>> }
>>>>>>
>>>>>> Regards
>>>>>>
>>>>>>
>>>>>> Claus Ibsen-2 wrote:
>>>>>>>
>>>>>>> Hi
>>>>>>>
>>>>>>> Thanks for the sample. I can reproduce the issue.
>>>>>>>
>>>>>>> The issue is that your base class implements the
>>>>>>> javax.jms.MessageListener.
>>>>>>> I will dig into why Camel prefers to invoke this method over
the
>>>>>>> method name specified.
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Aug 4, 2009 at 8:02 PM, jjb<jj_burford@yahoo.com>
wrote:
>>>>>>>>
>>>>>>>> Hi.
>>>>>>>>
>>>>>>>> Attached is an example which recreates the bean issue.  My
goal is
>>>>>>>> to
>>>>>>>> create
>>>>>>>> a framework which localizes JMS/ActiveMQ and Camel stuff
to one
>>>>>>>> package.
>>>>>>>> Then none of our business logic depends on it (it just passes
POJOs
>>>>>>>> around
>>>>>>>> that are created from XSD using JAXB).  This is why I can't
put the
>>>>>>>> @Handler
>>>>>>>> annotation in the DerivedClass.
>>>>>>>> http://www.nabble.com/file/p24813432/camel_bug.tgz camel_bug.tgz
>>>>>>>>
>>>>>>>> About the 2.0-M3 Camel interface for HttpServletResponse
- how do I
>>>>>>>> get
>>>>>>>> it
>>>>>>>> from the Exchange?
>>>>>>>>
>>>>>>>> Thanks!
>>>>>>>>
>>>>>>>>
>>>>>>>> Claus Ibsen-2 wrote:
>>>>>>>>>
>>>>>>>>> On Tue, Aug 4, 2009 at 9:26 AM, jjb<jj_burford@yahoo.com>
wrote:
>>>>>>>>>>
>>>>>>>>>> Hi.
>>>>>>>>>>
>>>>>>>>>> Thanks for the quick response.  I switched to 2.0-M3
and still
>>>>>>>>>> had
>>>>>>>>>> the
>>>>>>>>>> problem - the BaseClass.onMessage still gets called.
 Is there a
>>>>>>>>>> newer
>>>>>>>>>> release or something I can check out that might have
this fix?
>>>>>>>>>>  Also,
>>>>>>>>>> when I
>>>>>>>>>> use 2.0-M3, how do I get the HttpServletResponse
(your suggestion
>>>>>>>>>> to
>>>>>>>>>> get
>>>>>>>>>> the
>>>>>>>>>> HttpServletRequest worked for me - thanks)?
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> About the bean problem. Could you create a ticket for
it and
>>>>>>>>> attach a
>>>>>>>>> small sample with the issue?
>>>>>>>>>
>>>>>>>>> You can use the @Handler annotation to mark the method
that Camel
>>>>>>>>> should use and then avoid using the ?method=xxxx.
>>>>>>>>> But I am interested in fixing why method=xxx does not
work for
>>>>>>>>> you.
>>>>>>>>>
>>>>>>>>> See more here
>>>>>>>>> http://camel.apache.org/bean-binding.html
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Claus Ibsen-2 wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi
>>>>>>>>>>>
>>>>>>>>>>> On Tue, Aug 4, 2009 at 7:52 AM, jjb<jj_burford@yahoo.com>
wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> I have a hierarchy of objects which looks
like this:
>>>>>>>>>>>>
>>>>>>>>>>>> public BaseClass implements javax.jms.MessageListener
>>>>>>>>>>>> {
>>>>>>>>>>>>    public void onMessage(javax.jms.Message
message)
>>>>>>>>>>>>    {
>>>>>>>>>>>>        // do something
>>>>>>>>>>>>    }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> public DerivedClass extends BaseClass
>>>>>>>>>>>> {
>>>>>>>>>>>>    public void process(String body)
>>>>>>>>>>>>    {
>>>>>>>>>>>>        // do something
>>>>>>>>>>>>    }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> I then have the following XML in my camel-context.xml:
>>>>>>>>>>>>
>>>>>>>>>>>> <bean id="processor" class="DerivedClass"/>
>>>>>>>>>>>>
>>>>>>>>>>>> <route>
>>>>>>>>>>>>      <from uri="activemq:request.queue"/>
>>>>>>>>>>>>      <to uri="bean:processor?method=process"/>
>>>>>>>>>>>> </route>
>>>>>>>>>>>>
>>>>>>>>>>>> When I run this code, all messages from request.queue
always go
>>>>>>>>>>>> to
>>>>>>>>>>>> BaseClass.onMessage, even though I explicitly
want them to go
>>>>>>>>>>>> to
>>>>>>>>>>>> DerivedClass.process.  Have I done something
wrong or is this a
>>>>>>>>>>>> bug
>>>>>>>>>>>> (I
>>>>>>>>>>>> read
>>>>>>>>>>>> through the bean binding and it said it would
first use methods
>>>>>>>>>>>> that
>>>>>>>>>>>> were
>>>>>>>>>>>> explicitly specified in the bean's method
parameter)?
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> We have fixed a bug in this relation in 2.0.x
(cant remember the
>>>>>>>>>>> version, might be the 2.0m3).
>>>>>>>>>>>
>>>>>>>>>>> In older versions you can work around this by
adding an @Body
>>>>>>>>>>> annotation to your base class
>>>>>>>>>>>     public void process(@Body String body)
>>>>>>>>>>> And Camel should prefer to use this method.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> I also notice that the new 2.0-M3 version
of camel-http no
>>>>>>>>>>>> longer
>>>>>>>>>>>> contains
>>>>>>>>>>>> the class org.apache.camel.component.http.HttpExchange.
>>>>>>>>>>>>  Therefore,
>>>>>>>>>>>> this
>>>>>>>>>>>> code no longer compiles:
>>>>>>>>>>>>
>>>>>>>>>>>>        public void process(Exchange exchange)
>>>>>>>>>>>>        {
>>>>>>>>>>>>                try
>>>>>>>>>>>>                {
>>>>>>>>>>>>                        HttpServletResponse
response =
>>>>>>>>>>>> ((HttpExchange)exchange).getResponse();
>>>>>>>>>>>>                        HttpServletRequest
request =
>>>>>>>>>>>> ((HttpExchange)exchange).getRequest();
>>>>>>>>>>>>                        HttpSession
session = null;
>>>>>>>>>>>>                        if (request
!= null)
>>>>>>>>>>>>                            
   session =
>>>>>>>>>>>> request.getSession(true);
>>>>>>>>>>>>                 }
>>>>>>>>>>>>                catch (Exception e)
>>>>>>>>>>>>                { e.printStackTrace();
}
>>>>>>>>>>>>         }
>>>>>>>>>>>>
>>>>>>>>>>>> Is there a new way to get the HttpServletResponse
and such from
>>>>>>>>>>>> the
>>>>>>>>>>>> Exchange
>>>>>>>>>>>> parameter?
>>>>>>>>>>>
>>>>>>>>>>> Its on the HttpMessage instead.
>>>>>>>>>>>
>>>>>>>>>>> HttpMessage in = (HttpMessag) exchange.getIn();
>>>>>>>>>>> HttpServletRequest = in.getRequest();
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Regards
>>>>>>>>>>>> --
>>>>>>>>>>>> View this message in context:
>>>>>>>>>>>> http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24802648.html
>>>>>>>>>>>> Sent from the Camel - Users mailing list
archive at Nabble.com.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Claus Ibsen
>>>>>>>>>>> Apache Camel Committer
>>>>>>>>>>>
>>>>>>>>>>> Open Source Integration: http://fusesource.com
>>>>>>>>>>> Blog: http://davsclaus.blogspot.com/
>>>>>>>>>>> Twitter: http://twitter.com/davsclaus
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> View this message in context:
>>>>>>>>>> http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24803535.html
>>>>>>>>>> Sent from the Camel - Users mailing list archive
at Nabble.com.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Claus Ibsen
>>>>>>>>> Apache Camel Committer
>>>>>>>>>
>>>>>>>>> Open Source Integration: http://fusesource.com
>>>>>>>>> Blog: http://davsclaus.blogspot.com/
>>>>>>>>> Twitter: http://twitter.com/davsclaus
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> View this message in context:
>>>>>>>> http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24813432.html
>>>>>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Claus Ibsen
>>>>>>> Apache Camel Committer
>>>>>>>
>>>>>>> Open Source Integration: http://fusesource.com
>>>>>>> Blog: http://davsclaus.blogspot.com/
>>>>>>> Twitter: http://twitter.com/davsclaus
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> View this message in context:
>>>>>> http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24822320.html
>>>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Claus Ibsen
>>>>> Apache Camel Committer
>>>>>
>>>>> Open Source Integration: http://fusesource.com
>>>>> Blog: http://davsclaus.blogspot.com/
>>>>> Twitter: http://twitter.com/davsclaus
>>>>>
>>>>>
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24823165.html
>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> Apache Camel Committer
>>>
>>> Open Source Integration: http://fusesource.com
>>> Blog: http://davsclaus.blogspot.com/
>>> Twitter: http://twitter.com/davsclaus
>>>
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
> 
> 
> 
> -- 
> Claus Ibsen
> Apache Camel Committer
> 
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
> 
> 

-- 
View this message in context: http://www.nabble.com/bean-binding-with-inheritance---2.0-M3-camel-http-tp24802648p24855730.html
Sent from the Camel - Users mailing list archive at Nabble.com.


Mime
View raw message