@@ -4,138 +4,15 @@ This project aims to create two kinds of multi-threaded web servers (with thread
There are three tasks implemented and the user can add more (see details below).
The web servers receive the command and the parameter(s) for running a task through terminal command `curl`.
_P.S. There is another project where I used *ServerSocker* in GitHub: [localhost-chat-socket](https://github.com/wagnerjfr/localhost-chat-socket)_
## Full article
### [Unveiling Two Dynamic Multi-Threaded Web Servers for Task Execution](https://levelup.gitconnected.com/unveiling-two-dynamic-multi-threaded-web-servers-for-task-execution-62644e78a04a)
_Different Type of Web Serves Using HttpServer and ServerSocket_
## WebServers
***WebServerHttp** is developed using *HttpServer*[[javadoc](https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html)].
***WebServerSocket** is developed using *ServerSocket*[[javadoc](https://docs.oracle.com/javase/8/docs/api/java/net/ServerSocket.html)].
Both web servers use *ExecutorService*[[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html)] that executes each submitted task in the pooled thread, more specifically, `Executors.newCachedThreadPool()` which is an unbounded thread pool with automatic thread reclamation [[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool--)].
P.S. There is another project where I used *ServerSocker* in GitHub: [localhost-chat-socket](https://github.com/wagnerjfr/localhost-chat-socket)
## Tasks
The idea for the tasks comes from another GitHub project [TaskScheduler](https://github.com/wagnerjfr/Java-TaskScheduler).
The tasks currently implement are:
***TaskBubbleSort**: sorts a list of numbers [[wikipedia](https://en.wikipedia.org/wiki/Bubble_sort)]
***TaskFiboRecursive**: calculates the fibonacci of a number recursively [[wikipedia](https://en.wikipedia.org/wiki/Fibonacci_number)]
***TaskBitcoin**: grabs the last price(s) of the bitcoin from [BitStamp](https://www.bitstamp.net/).
## How to add tasks
The steps to create a new task are:
* Create a new class inside the package `task`, for example, `TaskHello.java`;
* Make sure your class extends the abstract class `TaskImpl.java`;
* Create a constructor and override the required method `execute()`;
* Add your logic and attribute a `String` response to the `response` instance variable.
Example:
```java
packagetask;
importtask.TaskImpl;
publicclassTaskHelloextendsTaskImpl{
@Override
publicvoidexecute(){
result="Hello "+input;
}
}
```
* When the project is compiled, up and running, the task can be called like:
`curl -d TaskHello -d World http://localhost:8000/`
Something like this should be expected as output:
```console
wfranchi@computer:~$ curl -d TaskHello -d World http://localhost:8000
Result: Hello World; Executed in: 0,00s
```
Just two parameters are allowed: `-d <task name> -d <parameter values>`.
If you want to pass more parameter values, one suggestion is to use key delimiter like comma `,`.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f3564b1e3bd taskwebserver:1.0 "/bin/sh -c 'java $W…" 3 seconds ago Up 2 seconds 0.0.0.0:8001->8000/tcp webserverhttp
83a07b12b36c taskwebserver:1.0 "/bin/sh -c 'java $W…" 18 seconds ago Up 17 seconds 0.0.0.0:8000->8000/tcp webserversocket
```
## Running tasks separately
You can replace the port from `:8000/` to `:8001/` to run the same task but in a different web server if you have launched two containers as described before.