topics
and subs
are two private ArrayList
filled by remote Strings and ISubs
(interface)
private synchronized void notify(MyMessage msg){
for(int i=0; i<topics.size(); i++){
if(topics.get(i).equalsIgnoreCase(msg.getTopic())){
try {
subs.get(i).getListener().onMessage(msg);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
notify()
is called by publish(MyMessage msg)
method and it gets a remote MyMessage
object
public boolean publish(MyMessage msg) throws RemoteException {
if(!total.tryAcquire()){
System.out.println("Publish respinta");
return false;
}
try {
concurrent.acquire();
mutex.acquire();
FileWriter file = new FileWriter("messaggi.txt",true);
BufferedWriter bw = new BufferedWriter(file);
bw.write(msg.getTopic()+": "+msg.getContenuto());
bw.newLine();
bw.flush();
bw.close();
mutex.release();
notify(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
concurrent.release();
total.release();
}
return true;
}
Everytime publish()
is invoked I get the following exception:
java.lang.NullPointerException at server.MessageServer.notify(MessageServer.java:87) at server.MessageServer.publish(MessageServer.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Unknown Source) at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) at com.sun.proxy.$Proxy0.publish(Unknown Source) at publisher.PublisherThread.run(PublisherThread.java:22)
Obviously topics
and subs
are filled before publish()
is invoked.
EDIT: alright, I found the issue, please don't kill me, I forgot to initialize the MsgListener in the Subscriber constructor.