Hello. As a learning exercise, I've put together a very contrived example of a "reverse" service (like an echo service, except that each returned line comes back reversed). Mostly, I'm using it as a learning example of how to build a small TCP/IP client/server in OSGi.
There are five bundles:
reverser-api - Specifies the API of the reverse service
reverser-simple - A mindlessly simple implementation of the API
tcp-server - A server that exports nothing and implements
no services, but simply passes on the input
from clients to a local reverser-api implementation.
tcp-client - A client that implements the reverser-api service
and relays calls to a remote server, using prototype
scope so that each component gets its own client.
client-example - A simple bundle that makes calls to a reverser-api
service. Mostly used to play with tcp-client.
What I have works, for a given value of works, but has a problem in
that it has a race condition when restarting the server service:
https://github.com/io7m/osgi-example-reverser/blob/master/tcp-server/src/main/java/com/io7m/reverser/tcp_server/TCPServerService.java
In activate(), the service creates a new TCPServer on a new thread
and starts it. In deactivate(), the service tells the existing
TCPServer to stop. The stop call happens asynchronously, because all it
does is set a flag on the TCPServer that will cause it to eventually
shut down (typically within one second). The problem will probably be
obvious to many people here: When the service is restarted, the old
server may not have finished shutting down, and therefore when the new
instance tries to bind a socket, it receives a java.net.BindException
because the address is still in use. Worse, because the new server
fails to start and the old one is in the process of shutting down, the
end result is no server running at all.
Is there a correct way to do this? I inferred from what I've read in
various places online that I should not be blocking in the activate()
or deactivate() methods as this can disrupt the SCR.
M
pgpc3pWXOOwQd.pgp
Description: OpenPGP digital signature
_______________________________________________ OSGi Developer Mail List [email protected] https://mail.osgi.org/mailman/listinfo/osgi-dev
