/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.beanstalk; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; import com.surftools.BeanstalkClient.Client; import com.surftools.BeanstalkClientImpl.ClientImpl; /** * Represents the connection to Beanstalk. * <p/> * Along with the list of tubes it may watch. */ public class ConnectionSettings { final String host; final int port; final String[] tubes; public ConnectionSettings(final String tube) { this(Client.DEFAULT_HOST, Client.DEFAULT_PORT, tube); } public ConnectionSettings(final String host, final String tube) { this(host, Client.DEFAULT_PORT, tube); } public ConnectionSettings(final String host, final int port, final String tube) { this.host = host; this.port = port; final Scanner scanner = new Scanner(tube); scanner.useDelimiter("\\+"); final ArrayList<String> buffer = new ArrayList<String>(); while (scanner.hasNext()) { final String tubeRaw = scanner.next(); try { buffer.add(URLDecoder.decode(tubeRaw, "UTF-8")); } catch (UnsupportedEncodingException e) { buffer.add(tubeRaw); } } this.tubes = buffer.toArray(new String[buffer.size()]); scanner.close(); } /** * Returns the {@link Client} instance ready for writing * operations, e.g. "put". * <p/> * <code>use(tube)</code> is applied during this call. * * @return {@link Client} instance * @throws IllegalArgumentException the exception is raised when this ConnectionSettings * has more than one tube. */ public Client newWritingClient() throws IllegalArgumentException { if (tubes.length > 1) { throw new IllegalArgumentException("There must be only one tube specified for Beanstalk producer"); } final String tube = tubes.length > 0 ? tubes[0] : BeanstalkComponent.DEFAULT_TUBE; final ClientImpl client = new ClientImpl(host, port); /* FIXME: There is a problem in JavaBeanstalkClient 1.4.4 (at least in 1.4.4), when using uniqueConnectionPerThread=false. The symptom is that ProtocolHandler breaks the protocol, reading incomplete messages. To be investigated. */ //client.setUniqueConnectionPerThread(false); client.useTube(tube); return client; } /** * Returns the {@link Client} instance for reading operations with all * the tubes aleady watched * <p/> * <code>watch(tube)</code> is applied for every tube during this call. * * @param useBlockIO configuration param to {@link Client} * @return {@link Client} instance */ public Client newReadingClient(boolean useBlockIO) { final ClientImpl client = new ClientImpl(host, port, useBlockIO); /* FIXME: There is a problem in JavaBeanstalkClient 1.4.4 (at least in 1.4.4), when using uniqueConnectionPerThread=false. The symptom is that ProtocolHandler breaks the protocol, reading incomplete messages. To be investigated. */ //client.setUniqueConnectionPerThread(false); for (String tube : tubes) { client.watch(tube); } return client; } @Override public boolean equals(final Object obj) { if (obj instanceof ConnectionSettings) { final ConnectionSettings other = (ConnectionSettings) obj; return other.host.equals(host) && other.port == port && Arrays.equals(other.tubes, tubes); } return false; } @Override public int hashCode() { return 41 * (41 * (41 + host.hashCode()) + port) + Arrays.hashCode(tubes); } @Override public String toString() { return "beanstalk://" + host + ":" + port + "/" + Arrays.toString(tubes); } }