public
final
class
QueueFactory
{
private
static
final
boolean
useUnsafe
=
DetectionUtil
.
hasUnsafe
();
private
static
final
InternalLogger
LOGGER
=
InternalLoggerFactory
.
getInstance
(
QueueFactory
.
class
);
private
QueueFactory
()
{
// only use static methods!
}
/**
* Create a new unbound {@link BlockingQueue}
*
* @param itemClass the {@link Class} type which will be used as {@link BlockingQueue} items
* @return queue the {@link BlockingQueue} implementation
*/
public
static
<
T
>
BlockingQueue
<
T
>
createQueue
(
Class
<
T
>
itemClass
)
{
// if we run in java >=7 its the best to just use the LinkedTransferQueue which
// comes with java bundled. See #273
if
(
DetectionUtil
.
javaVersion
()
>=
7
)
{
return
new
java
.
util
.
concurrent
.
LinkedTransferQueue
<
T
>();
}
try
{
if
(
useUnsafe
)
{
return
new
LinkedTransferQueue
<
T
>();
}
}
catch
(
Throwable
t
)
{
// For whatever reason an exception was thrown while loading the LinkedTransferQueue
//
// This mostly happens because of a custom classloader or security policy that did not allow us to access the
// com.sun.Unmisc class. So just log it and fallback to the old LegacyLinkedTransferQueue that works in all cases
if
(
LOGGER
.
isDebugEnabled
())
{
LOGGER
.
debug
(
"Unable to instance LinkedTransferQueue, fallback to LegacyLinkedTransferQueue"
,
t
);
}
}
return
new
LegacyLinkedTransferQueue
<
T
>();
}
/**
* Create a new unbound {@link BlockingQueue}
*
* @param collection the collection which should get copied to the newly created {@link BlockingQueue}
* @param itemClass the {@link Class} type which will be used as {@link BlockingQueue} items
* @return queue the {@link BlockingQueue} implementation
*/
public
static
<
T
>
BlockingQueue
<
T
>
createQueue
(
Collection
<?
extends
T
>
collection
,
Class
<
T
>
itemClass
)
{
// if we run in java >=7 its the best to just use the LinkedTransferQueue which
// comes with java bundled. See #273
if
(
DetectionUtil
.
javaVersion
()
>=
7
)
{
return
new
java
.
util
.
concurrent
.
LinkedTransferQueue
<
T
>();
}
try
{
if
(
useUnsafe
)
{
return
new
LinkedTransferQueue
<
T
>(
collection
);
}
}
catch
(
Throwable
t
)
{
// For whatever reason an exception was thrown while loading the LinkedTransferQueue
//
// This mostly happens because of a custom classloader or security policy that did not allow us to access the
// com.sun.Unmisc class. So just log it and fallback to the old LegacyLinkedTransferQueue that works in all cases
if
(
LOGGER
.
isDebugEnabled
())
{
LOGGER
.
debug
(
"Unable to instance LinkedTransferQueue, fallback to LegacyLinkedTransferQueue"
,
t
);
}
}
return
new
LegacyLinkedTransferQueue
<
T
>(
collection
);
}
}