1

3 つのコンポーネントで構成されるシステムでパス コントロールをシミュレートする簡単なプログラムを書くことができました。しかし、ログが期待していたように見えないため、正しく行ったかどうかはわかりません。

間違いが見つかりませんでした。それは、aspectJ-part または RMI-part にありますか?

RMIサーバー

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()));
        }
}

こんにちは

public class Hello extends UnicastRemoteObject implements HelloIF {

    public Hello() throws RemoteException {
    }

    public String greeting(String c) throws RemoteException,
            InterruptedException {
        return "Good morning!";
    }
}

さよなら

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!";
    }

}

ログは次のようになります。

[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[])]

そのため、1 つのログが欠落しています -Bye.farewell()

メソッドがいつ終了するかをaspectJが認識できない理由がわかりません。

@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());
    }
}
4

1 に答える 1

1

理解できないバグを見つけた場合は、問題を軽減するようにしてください。あなたの場合、System.out.println()実際のコードで実際に何が起こるかを確認するために、いくつかの古き良きものはどうですか?

また、例外処理は見られません。Java のバージョンによっては、例外main()が飲み込まれる場合があります。

于 2012-08-02T12:14:29.773 に答える