protected void initAuthentication() { if (registration.getAuthenticationMechanism() != null) { if (registration.getAuthenticationMechanism().getType() instanceof BasicAuth) { BasicAuth basic = (BasicAuth) registration.getAuthenticationMechanism().getType(); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(basic.getUsername(), basic.getPassword()); AuthScope authScope = new AuthScope(AuthScope.ANY); ((DefaultHttpClient) client).getCredentialsProvider().setCredentials(authScope, creds); localContext = new BasicHttpContext(); // Generate BASIC scheme object and stick it to the local execution context BasicScheme basicAuth = new BasicScheme(); localContext.setAttribute("preemptive-auth", basicAuth); // Add as the first request interceptor ((DefaultHttpClient) client).addRequestInterceptor(new PreemptiveAuth(), 0); executor.setHttpContext(localContext); } } }
@Override public boolean push(ClientMessage message) { ActiveMQRestLogger.LOGGER.debug("Pushing " + message); String uri = createUri(message); for (int i = 0; i < registration.getMaxRetries(); i++) { long wait = registration.getRetryWaitMillis(); System.out.println("Creating request from " + uri); ClientRequest request = executor.createRequest(uri); request.followRedirects(false); ActiveMQRestLogger.LOGGER.debug("Created request " + request); for (XmlHttpHeader header : registration.getHeaders()) { ActiveMQRestLogger.LOGGER.debug( "Setting XmlHttpHeader: " + header.getName() + "=" + header.getValue()); request.header(header.getName(), header.getValue()); } HttpMessageHelper.buildMessage(message, request, contentType, jmsOptions); ClientResponse<?> res = null; try { ActiveMQRestLogger.LOGGER.debug(method + " " + uri); res = request.httpMethod(method); int status = res.getStatus(); ActiveMQRestLogger.LOGGER.debug("Status of push: " + status); if (status == 503) { String retryAfter = res.getStringHeaders().getFirst("Retry-After"); if (retryAfter != null) { wait = Long.parseLong(retryAfter) * 1000; } } else if (status == 307) { uri = res.getLocation().toString(); wait = 0; } else if ((status >= 200 && status < 299) || status == 303 || status == 304) { ActiveMQRestLogger.LOGGER.debug("Success"); return true; } else if (status >= 400) { switch (status) { case 400: // these usually mean the message you are trying to send is crap, let dead // letter logic take over case 411: case 412: case 413: case 414: case 415: case 416: throw new RuntimeException( "Something is wrong with the message, status returned: " + status + " for push registration of URI: " + uri); case 401: // might as well consider these critical failures and abort. Immediately // signal to disable push registration depending on config case 402: case 403: case 405: case 406: case 407: case 417: case 505: return false; case 404: // request timeout, gone, and not found treat as a retry case 408: case 409: case 410: break; default: // all 50x requests just retry (except 505) break; } } } catch (Exception e) { ActiveMQRestLogger.LOGGER.debug("failed to push message to " + uri, e); e.printStackTrace(); return false; } finally { if (res != null) res.releaseConnection(); } try { if (wait > 0) Thread.sleep(wait); } catch (InterruptedException e) { throw new RuntimeException("Interrupted"); } } return false; }