I want to implement such logic: Client sends request to a server that has single controller. That server parses url and according to endpoints chooses another server to process the request. And the second server sends response back the same way.
I want to use Spring Controllers (MVC). I also can have several tomcat servers.
So: Client -> Main Controller that can determine the necessary server with micro services included -> the end server that process request, goes Database etc. -> Main Controller -> Client.
How to make tomcat knows about another tomcat?
How to make tomcat knows about another tomcat?
If that url(url containing another server details) coming from client, then you need to extract it from request and create another httpRequest and send it to another server(it will be server to server server1>server2) or initiate the redirect request(it will be server1>client>server2) depending upon the requirement.
See example here to send server to server http request
I also can have several tomcat servers.
You can also consider having multiple webapp with in same tomcat but that depend upon your requirements. Difference will be in this case there will be single jvm process . with multiple tomcat there will be as many number of jvm process.
Related
I am working on a project where I have two servers (tomcat), Server A gives initial snapshot of information from DB(MySQL) to the frontend. Server B to serve updates to server A, both servers need to communicate. How do I connect them? Thank you very much for your help.
There are many ways two Tomcat instances running on the same host could be set up to communicate with each other. It's quite common to implement a REST service in the "server" Tomcat instance and have the "client" Tomcat instance send the REST request to the other instance. It's common to use either the Jersey or CXF framework to implement a JAX-RS REST service, or you could use the Spring framework to implement a more general web request handler.
Tomcat typically accepts HTTP/S requests. So you could program your own servlets in Tomcat A (and publish them as URIs) to accept data which shall be updated to the DB. Then, Server B must act as a client to server A, initiating communication whenever it wants, and sending the data to Server A as HTTP requests.
Taking security into account, I'd also suggest that Server A should forbid any requests to the updating URIs which do not come from Server B. For instance, securizing the updating URIs through standard JEE security.
i have inherited a java app that integrates with desktop QB. There's something in the structure of this whole setup i'm not understanding. This is my first go with the QB api as a developer.
the QB Web Connector 2.2.0.71 is installed and functional. I see the .qwc file and understand it, and it is loaded into the web connector. There is an Application class that publishes an endpoint to the same URL as in the .qwc file and then starts a class named QBWebService. this web service class implements com.intuit.developer.TroubleshootWebServiceFSSoap and has methods authenticate, sendRequestXML, etc. Method sendRequestXML has the code i am testing and attempting to modify. but, before i can do that i need to understand the XML going back and forth.
since i don't know what i don't know, if i'm asking the wrong questions, by all means, please say so.
is it correct, then, that the web connector (on schedule) launches the application class and calls the sendRequestXML method?
i was expecting to find a URL that i could send XML to with something like SOAPui in order to test the XML and examine the response, but that doesn't seem to be how this web service works. is it possible to set it up this way?
perhaps i don't understand what the QB web connector application is doing. what is the purpose of opening up the URL on localhost if it can't accept XML via POST?
thanks in advance for the help
--matt
is it correct, then, that the web connector (on schedule) launches the application class and calls the sendRequestXML method?
Yes, that's correct.
i was expecting to find a URL that i could send XML to with something like SOAPui in order to test the XML and examine the response
You can send requests to your SOAP service (e.g. you can call the sendRequestXML method for example).
You'll get back an XML response that (if you were the Web Connector) you would then relay to QuickBooks. QuickBooks would process the response, and then call the receiveResponseXML method to send the XML response back up to your web service.
perhaps i don't understand what the QB web connector application is doing.
It sounds like you're expecting QuickBooks to provide a SOAP endpoint, which you can then directly send XML requests to to query data directly from QuickBooks.
This is not really how the Web Connector works. The Web Connector sort of works "backwards".
Instead of connecting directly to QuickBooks, the Web Connector connects to you (your SOAP endpoint) and asks you "Hey, give me something to do!" (i.e. send me the request XML you want to run against QuickBooks). You then give it an XML request, which it runs against QuickBooks, gets the response, and then connects to you again and says "here's what QuickBooks responded to your request with" (i.e. here you go, receive this response XML from QuickBooks).
So the Web Connector essentially polls a SOAP endpoint you provide, asking you to give it XML requests to pass through to QuickBooks.
Longer explanation here:
http://www.consolibyte.com/docs/index.php/QuickBooks_Web_Connector_Overview#About_the_QuickBooks_Web_Connector
I have multiple Java web applications deployed on the same server (Wildfly).
They all should use a single WebSocket implementation to send messages (object, not plain text) to the user.
Edit: WebApp1-3 are the applications with the business logic. The only purpose of WebApp4 is to update a Primefaces panel in the browser based on the messages generated by the other WebApps. Sorry for the missleading illustration.
WebApp1
WebApp2 --> ??? --> WebApp4 (WebSocket-Server) --> JS/Browser
WebApp3
Which is the best way/pattern/implementation to make WebApp4 available to the other applications? (RMI, JMS, WebSocket, WebService, ....?)
My advice, for a general way of exposing services, is to expose REST services since they are simpler than SOAP web service and easily allow interoperability (if in the future a PHP or a RUBY webapp needs to consume your services it's much easier with a REST interface than with one base on RMI or JMS). The content of the REST service may vary, I suggest you to look at XML or JSON as a way of transmitting information over http REST services.
If all webapps are in the same server, you should forward requests from one to another. From the point of view of webapps 1-3, they would not need to be aware of whether their incoming requests were coming from webapp 4 or from outside (to which it appears that they are not connected). Of course, you are free to alter requests before forwarding them - or to drop them altogether, for example if authentication fails.
To do this in tomcat: https://stackoverflow.com/a/8951090/15472
When forwarding requests, the external client is completely unaware of the existence of webapps 1-3 -- as far as the client is concerned, it has sent a request to webapp 4, and it will think it is receiving a response from that same server.
You may need to configure your web server to allow these kinds of calls, but I am unfamiliar with WildFly.
Can someone please let me know if we can use Restful web services or something similar to that to service HTTP requests without using a web server
All the Http requests are processed or identified by the servlet or ejb component in java.
1.We must deploy restful services server side code in webserver otherwise we cannot expose our functionality over the network
2.To access the rest resource we can use normal java program or any servlet or other.
3.Without using webserver you cannot expose your rest resource over the network at serverside.
I have two web application which are deployed in the same J2EE Application server. I need to redirect from one web application to another. Also I need to set some information in the Header from web application 1 so that it is available in web application 2.
When I try to access the information which set in the header of Web App1 in Web App2, I'm getting "null". I'm using response.sendRedirect("http://localhost/webapp2") in Web Application 1 to redirect. Please help me to solve this.
Thanks,
Apps.
A redirect is processed by the client (the browser). So only the client gets the headers you sent. The headers will not be passed to the webapp redirected to.
You can do one of the following things to pass information from one webapp to another:
pass data as request parameter
send data as cookie without path restriction
use cross context dispatching
A cookie received by the client will be send back to the server. The client does not know it is a different webapp. You just need to set the cookie path to /.
Cross context dispacthing is done by an internal forward in the container (use a RequestDispatcher from the ServletContext). The client will never know, the request is handled by another webapp. You than can set a request attribute to pass data. Cross context dispatching has to be enabled by the container for security reasons.
You could send the information as URL parameters.
Redirect to http://localhost/webapp2?param1=value1¶m2=value2 ....
One of the options would be to simple pass information as GET attributes in the URL you used in sendRedirect call.