private void asynInvokeWithWorkQueue()

in cxf/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduitOutputStream.java [148:191]


    private void asynInvokeWithWorkQueue(final org.apache.servicemix.nmr.api.Exchange exchange) throws Exception {
        Runnable runnable = new Runnable() {
            public void run() {
                try {
                    syncInvoke(exchange);
                } catch (Throwable e) {
                    ((PhaseInterceptorChain)message.getInterceptorChain()).abort();
                    message.setContent(Exception.class, e);
                    ((PhaseInterceptorChain)message.getInterceptorChain()).unwind(message);
                    MessageObserver mo = message.getInterceptorChain().getFaultObserver();
                    if (mo == null) {
                        mo = message.getExchange().get(MessageObserver.class);
                    }
                    mo.onMessage(message);
                }
            }
        };

        try {
            Executor ex = message.getExchange().get(Executor.class);
            if (ex != null) {
                message.getExchange().put(Executor.class.getName()
                                + ".USING_SPECIFIED", Boolean.TRUE);
                ex.execute(runnable);
            } else {
                WorkQueueManager mgr = message.getExchange().get(Bus.class)
                        .getExtension(WorkQueueManager.class);
                AutomaticWorkQueue qu = mgr.getNamedWorkQueue("nmr-conduit");
                if (qu == null) {
                    qu = mgr.getAutomaticWorkQueue();
                }
                // need to set the time out somewhere
                qu.execute(runnable);
            }
        } catch (RejectedExecutionException rex) {
            if (!hasLoggedAsyncWarning) {
                LOG.warning("Executor rejected background task to retrieve the response.  Suggest increasing the workqueue settings.");
                hasLoggedAsyncWarning = true;
            }
            LOG.info("Executor rejected background task to retrieve the response, running on current thread.");
            syncInvoke(exchange);
        }

    }