tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul Carter-Brown <paul.carter-br...@jini.guru>
Subject Re: Initiating httpservletrequest from inside Tomcat / TomEE
Date Mon, 06 May 2019 16:16:23 GMT
Hi John,

See original request. It's pretty much a Kafka/Servlet proxy/gateway:

I'm trying to design a Kafka consumer and producer that will run inside the
tomcat jvm and pick up messages off a Kafka topic and translate them into a
servlet request and pass it through tomcat and then when the response is
complete then translate it into a Kafka message and put it onto another
topic as a reply. This way I can reuse our existing jax-rs rest services
and expose them as an async api over Kafka. The idea is to make the Kafka
messages similar to http in that they would consist of headers and a body.
The body would be json.


On Mon, May 6, 2019 at 6:13 PM John Dale <jcdwrrc@gmail.com> wrote:

> You could try debugging the tomcat code and find out how, right after
> it parses the TCP request, it invokes the servlet.  You can then
> create your own harness for tomcat code after initializing the
> appropriate context for the request to tomcat.  I don't know off hand
> where in the tomcat code this cut point can be found.
>
> Is this a performance issue, or are you building a proxy?
>
> What is the problem you're trying to solve?
>
> On 5/6/19, Paul Carter-Brown <paul.carter-brown@jini.guru> wrote:
> > Yea, but the issue is that only works when calling in the context of a
> > current servlet call.
> >
> > Here is the kind of problem I want to solve:
> >
> > @WebServlet(name = "MyExample", urlPatterns = {"/example"},
> loadOnStartup =
> > 1)
> > public class Example extends HttpServlet {
> >
> >     @PersistenceContext
> >     private EntityManager em;
> >
> >     @Override
> >     public void init(ServletConfig config) {
> >         Thread t = new Thread(() -> {
> >             while (true) {
> >                 try {
> >                     // Do a GET to /example/ and get the response without
> > going out on localhost and back in....
> >                     // We cant just call doGet as we want the request to
> > flow through the servlet filters, do the entitymanager injection etc
> >                     Thread.sleep(10000);
> >                 } catch (Exception e) {
> >                 }
> >             }
> >         });
> >         t.start();
> >
> >     }
> >
> >     @Override
> >     protected void doGet(HttpServletRequest req, HttpServletResponse
> resp)
> > throws ServletException, IOException {
> >         // do stuff like use em
> >         resp.setStatus(200);
> >         resp.getWriter().write("Hello World");
> >     }
> >
> > }
> >
> >
> >
> >
> > On Mon, May 6, 2019 at 5:35 PM John Dale <jcdwrrc@gmail.com> wrote:
> >
> >> For reference, I did find this after searching "calling a servlet
> >> programmatically":
> >> https://docs.oracle.com/cd/E19146-01/819-2634/abxbn/index.html
> >>
> >> On 5/6/19, Paul Carter-Brown <paul.carter-brown@jini.guru> wrote:
> >> > I think we are completely missing each other. Forget sockets - that
> was
> >> > just an example. I have code running in a Tomcat App server which is
> >> > not
> >> > managed by Tomcat and is not initiated by anything within Tomcat. That
> >> code
> >> > now wants to call a servlet hosted in that very same JVM. Any way to
> do
> >> > that without going out and back in on TCP?
> >> >
> >> >
> >> > On Mon, May 6, 2019 at 5:14 PM John Dale <jcdwrrc@gmail.com> wrote:
> >> >
> >> >> Sockets are an implementation of TCP/UDP inherently.
> >> >>
> >> >> Perhaps a mountaintop signal fire?
> >> >>
> >> >> ;)
> >> >>
> >> >> John
> >> >>
> >> >>
> >> >> On 5/6/19, Paul Carter-Brown <paul.carter-brown@jini.guru> wrote:
> >> >> > lol on the Semaphore Telegraph,
> >> >> >
> >> >> > I can't use a request dispatcher as the request is being initiated
> >> from
> >> >> > code that has no context. I already have it working with HTTP
using
> >> >> > asynchttp library, but I want to avoid the overhead. E.g. lets
say
> I
> >> >> wrote
> >> >> > my own server socket listener on port 10000 running in the Tomcat
> >> >> > JVM
> >> >> > and
> >> >> > got some request in some propriatary protocol called X. Now I
want
> >> >> > to
> >> >> call
> >> >> > a Tomcat servlet in the current JVM with some info I got over
X
> >> without
> >> >> > going out on TCP and back in....
> >> >> >
> >> >> > On Mon, May 6, 2019 at 4:40 PM John Dale <jcdwrrc@gmail.com>
> wrote:
> >> >> >
> >> >> >> If you're wanting to forward control to another servlet deployed
> in
> >> >> >> the same context:
> >> >> >> https://www.javatpoint.com/requestdispatcher-in-servlet
> >> >> >>
> >> >> >> If you are okay going through TCP to facilitate some future
or
> >> current
> >> >> >> distribution of services, Use HTTPURLConnection (not sure
what
> >> >> >> you're
> >> >> >> wanting to do with the result of the request, if anything):
> >> >> >>
> >> >> >>
> >> >>
> >>
> https://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests
> >> >> >>
> >> >> >> If you need more sophisticated HTTP interactions, Apache maintains
> >> >> >> a
> >> >> >> very useful library for that:  http://hc.apache.org/
> >> >> >>
> >> >> >> If these don't work-out for you, rather than using .NET, PHP,
> >> >> >> Python,
> >> >> >> or some other Java facsimile at best, I recommend using the
> >> >> >> semaphore
> >> >> >> telegraph:
> >> >> >> https://en.wikipedia.org/wiki/Semaphore_telegraph
> >> >> >>
> >> >> >> Sincerely,
> >> >> >>
> >> >> >> John
> >> >> >> DB2DOM
> >> >> >>
> >> >> >> On 5/6/19, Paul Carter-Brown <paul.carter-brown@jini.guru>
wrote:
> >> >> >> > Hi John,
> >> >> >> >
> >> >> >> > Thanks for your feedback.
> >> >> >> >
> >> >> >> > The request I'm initiating should not or need not carry
any
> >> >> >> > context
> >> >> >> > from
> >> >> >> > the originating code. There is also no session to worry
about as
> >> its
> >> >> >> > just
> >> >> >> > for rest calls. So basically I have the headers, path
and body
> >> >> >> > and
> >> >> need
> >> >> >> to
> >> >> >> > generate a http servlet request and get an http servlet
response
> >> (or
> >> >> >> > similar) back. I have this working by calling into localhost
but
> >> >> >> > ideally
> >> >> >> > want to skip the trombone out and back in.
> >> >> >> >
> >> >> >> > Have you got any basic code examples?
> >> >> >> >
> >> >> >> > Paul
> >> >> >> >
> >> >> >> > On Tue, Apr 30, 2019 at 5:27 PM John Dale <jcdwrrc@gmail.com>
> >> wrote:
> >> >> >> >
> >> >> >> >> Another thought .. you can do some request dispatching,
but
> >> without
> >> >> >> >> knowing more about the tools you're using, I can't
say for sure
> >> >> >> >> if
> >> >> >> >> this is the direction you'll want to go.
> >> >> >> >>
> >> >> >> >> On 4/29/19, Paul Carter-Brown <paul.carter-brown@jini.guru>
> >> wrote:
> >> >> >> >> > Hi
> >> >> >> >> >
> >> >> >> >> > I'm trying to design a Kafka consumer and producer
that will
> >> >> >> >> > run
> >> >> >> inside
> >> >> >> >> the
> >> >> >> >> > tomcat jvm and pick up messages off a Kafka
topic and
> >> >> >> >> > translate
> >> >> them
> >> >> >> >> into a
> >> >> >> >> > servlet request and pass it through tomcat and
then when the
> >> >> >> >> > response
> >> >> >> >> > is
> >> >> >> >> > complete then translate it into a Kafka message
and put it
> >> >> >> >> > onto
> >> >> >> another
> >> >> >> >> > topic as a reply. This way I can reuse our existing
jax-rs
> >> >> >> >> > rest
> >> >> >> >> > services
> >> >> >> >> > and expose them as an async api over Kafka.
The idea is to
> >> >> >> >> > make
> >> >> >> >> > the
> >> >> >> >> > Kafka
> >> >> >> >> > messages similar to http in that they would
consist of
> headers
> >> >> >> >> > and
> >> >> a
> >> >> >> >> body.
> >> >> >> >> > The body would be json.
> >> >> >> >> >
> >> >> >> >> > Now I know this could be done by calling localhost
with an
> >> >> >> >> > http
> >> >> call
> >> >> >> to
> >> >> >> >> > trombone the requests back into tomcat but I'd
like to avoid
> >> >> >> >> > the
> >> >> >> >> associated
> >> >> >> >> > latency and overhead. Is it possible to call
tomcat directly
> >> >> >> >> > in-process.
> >> >> >> >> > This does not need to be portable to other containers
so can
> >> >> >> >> > be
> >> >> >> >> > proprietary.
> >> >> >> >> >
> >> >> >> >> > I'm using tomcat 8. In fact its tomee 8 but
guessed this is
> >> >> >> >> > more
> >> >> >> >> > a
> >> >> >> >> > tomcat
> >> >> >> >> > question than tomee but have sent to both groups
just in
> case.
> >> >> >> >> >
> >> >> >> >> > Thanks for any insights.
> >> >> >> >> >
> >> >> >> >> > Paul
> >> >> >> >> >
> >> >> >> >>
> >> >> >> >
> >> >> >>
> >> >> >>
> ---------------------------------------------------------------------
> >> >> >> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> >> >> >> For additional commands, e-mail: users-help@tomcat.apache.org
> >> >> >>
> >> >> >>
> >> >> >
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> >> >> For additional commands, e-mail: users-help@tomcat.apache.org
> >> >>
> >> >>
> >> >
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> >> For additional commands, e-mail: users-help@tomcat.apache.org
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message