I would trace tomcat and recreate a servlet request .. see if I could hack it in that way (assuming that localhost traffic isn't fast enough). Normalizing on HTTP/TCP will be more maintainable, though?
Can somebody suggest a good place for a breakpoint? Any other suggestions? John On 5/6/19, Paul Carter-Brown <[email protected]> wrote: > 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> wrote: >> >> > >> >> >> Sockets are an implementation of TCP/UDP inherently. >> >> >> >> >> >> Perhaps a mountaintop signal fire? >> >> >> >> >> >> ;) >> >> >> >> >> >> John >> >> >> >> >> >> >> >> >> On 5/6/19, Paul Carter-Brown <[email protected]> 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 <[email protected]> >> 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 <[email protected]> >> >> >> >> 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 <[email protected]> >> >> 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 <[email protected]> >> >> 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: [email protected] >> >> >> >> For additional commands, e-mail: [email protected] >> >> >> >> >> >> >> >> >> >> >> > >> >> >> >> >> >> --------------------------------------------------------------------- >> >> >> To unsubscribe, e-mail: [email protected] >> >> >> For additional commands, e-mail: [email protected] >> >> >> >> >> >> >> >> > >> >> >> >> --------------------------------------------------------------------- >> >> To unsubscribe, e-mail: [email protected] >> >> For additional commands, e-mail: [email protected] >> >> >> >> >> > >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >> > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
