Category tech.

面倒なので塗装なし


カットはホームセンターでやってもらったので特に苦労なし。

自転車のトレーラーで運んだ。910mm ぐらいなら内側におさめて詰めるけど、これより長いとむずかしそう。うーん。


ダボ継ぎをしてみようと思いこの四角はダボでやってみた。まぁ普通にできたはできたって感じか……

クランプが大量に欲しい

備考

スターエム 先三角ショートビット NO.5B 8MM -

5.0 / 5.0

大西工業 木工用スケールビットロング 8.0mm -

5.0 / 5.0

ショートタイプのφ8mmビットを買ったけど、これがちょっと短かすぎた。ロングタイプを買ったほうが良い。というのもドリルストッパーやドリルガイドを使うと長さが必要になるからだ。

スターエム ドリルストッパー 8MM -

5.0 / 5.0

SK11 ドリルガイドキット 4~12mm SGK-6 -

4.0 / 5.0

ダボは φ8mm 30mm がデファクトスタンダードでよさそうな雰囲気なのでこれにした。アマゾンが SKのダボマーカーに最小購入個数を課していてクソなのでセットのものにした。問題ない。

Z-Liant ダボ用マーキングポンチ6mm 5個 木ダボ 8☓30mm 約100個 木釘 木工ダボ 木 ダボ 家具 DIY つなぎ ジョイント -

5.0 / 5.0

薄板継ぎだとポケットホールというのが手軽で流行っているっぽいので、そのうち試してみたい。3Dプリンタで治具をつくれるっぽい。

  1. トップ
  2. tech
  3. キッチンの棚 DIY

@Async と @RequestScope を同時につかうとどうなるか

@RequestScope、これは @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) と同じ意味。この Bean はスレッドローカルにひもづけられているHttpServletRequestに保持されている。

@Async は別スレッドで処理を実行するため、間接的にでも @RequestScope な Bean を使っていると以下のような実行時エラーとなる。処理中のスレッドには該当する Bean が保持されていないという旨。

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

ScopedProxyMode.TARGET_CLASS なのでスタックトレースがややこしい。cglib を使ってクラスのプロキシを作って、プロキシクラス内で Bean をどこかからとってきて呼ぶという動きになっている。おかげでスコープに関わらずコード上は Singleton のように扱えているが、黒魔術はひっかかったとき大変です。

解決方法

https://stackoverflow.com/questions/23732089/how-to-enable-request-scope-in-async-task-executor に良い解決方法が書いてあって、これを使えばよい。やってることは単純で @Async で別スレッドで実行しようとする際に、呼び出し元スレッドのBeanを渡してあげるという感じ。

ただし、どうもコピペでは動かなくて、以下のようにかえてうまくいった。結局 Executor インターフェイスのメソッドだけオーバーライドしたら良い。

@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {
    // Default task executor for @Async annotation
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        val executor = new ContextAwarePoolExecutor();
        executor.setCorePoolSize(25);
        executor.setQueueCapacity(25);
        executor.setMaxPoolSize(25);
        executor.setThreadNamePrefix("AsyncTask-");
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }

    @SuppressWarnings("serial")
    public static class ContextAwarePoolExecutor extends ThreadPoolTaskExecutor {
        /**
         * Override Executor interface
         */
        @Override
        public void execute(Runnable task) {
            super.execute(new ContextAwareRunnable(task, RequestContextHolder.currentRequestAttributes()));
        }
    }

    public static class ContextAwareRunnable implements Runnable {
        private final Runnable task;
        private final RequestAttributes context;

        public ContextAwareRunnable(Runnable task, RequestAttributes context) {
            this.task = task;
            this.context = context;
        }

        @Override
        public void run() {
            if (context != null) {
                RequestContextHolder.setRequestAttributes(context);
            }

            try {
                task.run();
            } finally {
                RequestContextHolder.resetRequestAttributes();
            }
        }
    }
}
  1. トップ
  2. tech
  3. Spring MVC で @Async と @RequestScope を共存させるには?

await x は await Promise.resolve(x) という意味なので、どのような値がきても問題ない。同期関数を await しても問題は起こらない。呼び出し先の関数が Promise をかえすかどうかを悩む必要はない。

Promise.all も同様で、(別に意味はないけど) 即値を渡しても問題ない。

  1. トップ
  2. tech
  3. async 関数内では全ての関数呼び出しに await を書けば良い