<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 16700 -->
<sect1 id="zend.queue.custom">
    <title>Zend_Queueのカスタマイズ</title>

    <sect2 id="zend.queue.custom.adapter">
        <title>独自のアダプタ作成</title>

        <para>
            <classname>Zend_Queue</classname>は、
            <classname>Zend_Queue_Adapter_AdapterAbstract</classname>を実装するどんなアダプタも扱います。
            既存のアダプタ、
            または抽象クラス<classname>Zend_Queue_Adapter_AdapterAbstract</classname>のうちの1つを拡張することにより、
            独自のアダプタを作成できます。
            このアダプタとして<classname>Zend_Queue_Adapter_Array</classname>を検討することが、
            最も簡単に概念化できると提案します。
        </para>

        <programlisting language="php"><![CDATA[
class Custom_DbForUpdate extends Zend_Queue_Adapter_Db
{
    /**
     * @see tests/Zend/Queue/Custom/DbForUpdate.php のコード
     *
     * Custom_DbForUpdate はその行を見つけるために、SELECT ... FOR UPDATE を使います。
     * 既存のコードよりも求められる列をもたらす可能性がよりあります。
     *
     * しかしながら、データベース全てに SELECT ... FOR UPDATE フィーチャがあるとは限りません。
     *
     * 注意: これは後でZend_Queue_Adapter_Dbのオプションに変換されました。
     *
     * このコードは良い例をまだ提供します。
     */
}

$options = array(
    'name'          => 'queue1',
    'driverOptions' => array(
        'host'      => '127.0.0.1',
        'port'      => '3306',
        'username'  => 'queue',
        'password'  => 'queue',
        'dbname'    => 'queue',
        'type'      => 'pdo_mysql'
    )
);

$adapter = new Custom_DbForUpdate($options);
$queue = Zend_Queue($adapter, $options);
]]></programlisting>

        <para>
            同様に即座にアダプタを変えることもできます。
        </para>

        <programlisting language="php"><![CDATA[
$adapter = new MyCustom_Adapter($options);
$queue   = Zend_Queue($options);
$queue->setAdapter($adapter);
echo "Adapter: ", get_class($queue->getAdapter()), "\n";
]]></programlisting>

        <para>or</para>

        <programlisting language="php"><![CDATA[
$options = array(
    'name'           => 'queue1',
    'namespace'      => 'Custom',
    'driverOptions'  => array(
        'host'       => '127.0.0.1',
        'port'       => '3306',
        'username'   => 'queue',
        'password'   => 'queue',
        'dbname'     => 'queue',
        'type'       => 'pdo_mysql'
    )
);
$queue = Zend_Queue('DbForUpdate', $config); // Custom_DbForUpdate をロード
]]></programlisting>
    </sect2>

    <sect2 id="zend.queue.custom.message">
        <title>独自のメッセージクラスを作成</title>

        <para>
            <classname>Zend_Queue</classname>は、独自のメッセージクラスも扱います。
            変数はアンダーラインで始めます。
            例えば:
        </para>

        <programlisting language="php"><![CDATA[
class Zend_Queue_Message
{
    protected $_data = array();
}
]]></programlisting>

        <para>
            既存のメッセージクラスを拡張できます。
            <filename>tests/Zend/Queue/Custom/Message.php</filename>でコード例をご覧下さい。
        </para>
    </sect2>

    <sect2 id="zend.queue.custom-iterator">
        <title>独自のメッセージ・イテレータクラスを作成</title>

        <para>
            <classname>Zend_Queue</classname>は、独自のメッセージ・イテレータ・クラスも扱います。
            メッセージ・イテレータ・クラスは、
            <methodname>Zend_Queue_Adapter_Abstract::recieve()</methodname>からメッセージを返すために使われます。
            たとえメッセージが１つだけだとしても、
            <methodname>Zend_Queue_Abstract::receive()</methodname>は、
            <classname>Zend_Queue_Message_Iterator</classname>のようなコンテナ・クラスを常に返さなければなりません。
        </para>

        <para>
            <filename>tests/Zend/Queue/Custom/Messages.php</filename>でファイル名の例をご覧ください。
        </para>
    </sect2>

    <sect2 id="zend.queue.custom.queue">
        <title>独自の待ち行列クラスを作成</title>

        <para>
            <classname>Zend_Queue</classname>は上書きすることも簡単にできます。
        </para>

        <para>
            <filename>tests/Zend/Queue/Custom/Queue.php</filename>でファイル名の例をご覧ください。
        </para>
    </sect2>
</sect1>
