I have a windows service application and a client which communicates with service using RMI. I need to do some concurrency testing with multiple clients but I need every client
You could use a shell script to spawn a new client with its own set of parameters in a loop.
But, in general. Running client code in several VMs just because there are some static variables being shared is definitely not a good solution. The fundamental problem is in your client code, as already suggested, you could use ThreadLocal
, ThreadPools
, or some synchronization logic to isolate a set of variables between various client threads.
Yes, you can do this using JDI - VirtualMachineManager (which you can get by calling Bootstrap.virtualMachineManager();
) provides (at least one) launching connector. You can then call launch();
on this connector which provides you with a VM mirror for the VM it creates. This mirror then lets you remotely execute methods on this VM.
You can set up as many remote VMs using this method as you choose, though obviously there's a relatively big performance penalty for doing things this way, and it's a fair bit of effort. Unless the effort would be astronomical, I'd personally advocate fixing the code to guarantee thread safety (using ThreadLocal
) and then you do away with the need to worry about JDI (or a similar setup.)