I managed to write simple program which should simulate passing control in system consisting of three components. But I am not sure if I’ve done it correctly, because logs don’t look like I was expecting.
I couldn’t find mistake. Is it in aspectJ-part or in RMI-part?
RMIServer
public class RMIServer {
public static void main(String[] args) throws RemoteException,
MalformedURLException {
LocateRegistry.createRegistry(1099);
HelloIF hello = new Hello();
Naming.rebind("server.Hello", hello);
System.out.println("Server is ready.");
}
}
RMIServer2
public class RMIServer2 {
public static void main(String[] args) throws RemoteException,
MalformedURLException, NotBoundException, InterruptedException {
//LocateRegistry.createRegistry(1098);
LocateRegistry.getRegistry(1099);
ByeIF bye = new Bye();
Naming.rebind("server.Bye", bye);
System.out.println("Server-Client is ready.");
}
RMIClient
public class RMIClient {
public static void main(String[] args) throws RemoteException,
MalformedURLException, NotBoundException, InterruptedException {
Registry registry = LocateRegistry.getRegistry("localhost");
ByeIF bye = (ByeIF) registry.lookup("server.Bye");
System.out.println(bye.farewell(Thread.currentThread().getName()));
}
}
Hello
public class Hello extends UnicastRemoteObject implements HelloIF {
public Hello() throws RemoteException {
}
public String greeting(String c) throws RemoteException,
InterruptedException {
return "Good morning!";
}
}
Bye
public class Bye extends UnicastRemoteObject implements ByeIF {
public Bye() throws RemoteException {
}
public String farewell(String c) throws RemoteException,
InterruptedException, NotBoundException {
Registry registry = LocateRegistry.getRegistry("localhost");
HelloIF hello = (HelloIF) registry.lookup("server.Hello");
System.out.println(hello.greeting(Thread.currentThread().getName()));
return "Bye bye!";
}
}
And logs look:
[2012-08-03 11:06:18,582] [request1343984778582] [public static void hello.RMIClient.main(java.lang.String[])]
[2012-08-03 11:06:18,738] [request1343984778582] [public java.lang.String hello.Bye.farewell(java.lang.String)]
[2012-08-03 11:06:18,785] [request1343984778582] [public java.lang.String hello.Hello.greeting(java.lang.String)]
[2012-08-03 11:06:18,785] [request1343984778582] [public java.lang.String hello.Hello.greeting(java.lang.String)]
[2012-08-03 11:06:18,847] [request1343984778582] [public static void hello.RMIClient.main(java.lang.String[])]
So one log is missing – Bye.farewell()
I don’t know why aspectJ cannot see when the method ends.
@Aspect
public class ReportingAspect {
// --------------------------------------LOGGER
static final Logger logger = Logger.getLogger(ReportingAspect.class);
// --------------------------------------POINTCUTS
@Pointcut("execution(public static void hello.RMIClient.main(String[]))")
public void requestStart() {
}
@Pointcut("(execution(String greeting(..)) && args(context)) || "
+ "(execution(String farewell(..)) && args(context))")
public void RMImethodStart(String context) {
}
@Pointcut("execution(String greeting(..)) || "
+ "execution(String farewall(..)) || "
+ "execution(public static void hello.RMIClient.main(String[]))")
public void general() {
}
@Pointcut("execution(public static void hello.RMIServer.main(String[])) || "
+ "execution(public static void hello.RMIServer2.main(String[]))")
public void setLoggingFile() {
}
// --------------------------------------ADVICES
@Before("requestStart()")
public void setLoggerAndThreadName(JoinPoint joinPoint) {
PropertyConfigurator.configure("log4j.properties");
Thread.currentThread().setName("request" + System.currentTimeMillis());
report(joinPoint);
}
@Before("RMImethodStart(context)")
public void setThreadName(JoinPoint joinPoint, String context) {
Thread.currentThread().setName(context);
report(joinPoint);
}
@Before("setLoggingFile()")
public void setProperties() {
PropertyConfigurator.configure("log4j.properties");
}
@After("general()")
public void generateReport(JoinPoint joinPoint) {
report(joinPoint);
}
/*//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@After("execution(public String hello.Bye.farewell(String))")
public void test(JoinPoint joinPoint)
{
report(joinPoint);
}*/
// ---------------------------------------REPORT
void report(JoinPoint jp) {
logger.error(jp.getSignature().toLongString());
}
}
If you find a bug that you don’t understand, try to reduce the problem. In your case, how about a few good old
System.out.println()in the actual code to see what really happens?Also, I don’t see any exception handling. Depending on your version of Java, exceptions in
main()might be swallowed.