3

メソッドを非同期で実行するために、次の FutureTask メソッドを作成しました。

public FutureTask<Object> SendAggregateEventAsync(final
        com.Company.Product.SDK.Device.AggregateEvent.ClassObject 
        request)
{
    FutureTask<Object> futureTask;

    futureTask = new FutureTask<Object>(new Runnable() {
        public void run()
        {
            try {
                SendAggregateEvent(request);
            } catch (ResponseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }, null);

    return futureTask;
}

public void SendAggregateEvent(
        com.Company.Product.SDK.Device.AggregateEvent.ClassObject 
        request) throws ResponseException
{
    try 
    {
        if(request == null) throw new IllegalArgumentException("request");

        String[] s_array = new String[0];
        s_array[0] = "EventTime";

        String namespace = "http://Product.Company.com/" +
                "v1.0/Device/AggregateEvent";

        IBindingFactory factory;

        factory = BindingDirectory.getFactory(
                com.Compant.Product.SDK.Device.AggregateEvent.
                ClassObject.class);

        String message = ChangeDatesToUTC(MessageHelper.
                SerializeObject(factory, request), s_array, namespace);

        SendMessage(message);

    } catch (JiBXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

コンパイルするには、FutureTask で ResponseException をキャッチする必要がありますが、この ResponseException が実装アプリケーションにスローされ、FutureTask によってキャッチされないことが重要です。この例外を FutureTask からスローできる方法はありますか?

4

1 に答える 1

5

Runnable を渡す代わりにCallableをコンストラクターに渡すと、例外をキャッチする必要がなくなります。

futureTask = new FutureTask<Object>(new Callable() {
    public Object call() throws ResponseException {
        SendAggregateEvent(request);
        return null;
    }
};

Void(しかし、FutureTask のジェネリック型はではなくすべきですObject)。

によって ResponseException がスローされた場合、FutureTaskcall()のメソッドは ExecutionException をスローし、この例外の原因は ResponseException になります。get()

とはいえ、単に Callable を ExecutorService に送信して、Future を作成させるべきではありませんか? また、Java の命名規則を尊重し、メソッドから throws 節を削除してください。これは例外をスローしないためです。ネーミングも悪いです: メソッドは何も送信しません。実行時にイベントを送信する FutureTask のみを作成します。

于 2013-06-03T20:31:50.020 に答える