All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mq5.0-source.main.mq-jmsra.jmsra-ra.src.main.java.com.sun.messaging.jms.ra.DirectProducer Maven / Gradle / Ivy

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2000-2013 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.messaging.jms.ra;

import javax.jms.*;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Logger;

import com.sun.messaging.jmq.io.JMSPacket;
import com.sun.messaging.jmq.jmsservice.JMSService;
import com.sun.messaging.jmq.jmsservice.JMSServiceReply;
import com.sun.messaging.jmq.jmsservice.JMSServiceException;
import com.sun.messaging.jmq.jmsservice.JMSService.MessageDeliveryMode;
import com.sun.messaging.jmq.jmsservice.JMSService.MessagePriority;

/**
 *  DirectProducer encapsulates JMS MessageProducer behavior for MQ DIRECT mode
 *  operation
 */
public class DirectProducer
        implements MessageProducer, QueueSender, TopicPublisher
    {
    
    /**
     *  The JMSService for this DirectProducer
     */
    private JMSService jmsservice;

    /**
     *  The parent DirectSession that created this DirectProducer
     */
    private DirectSession ds;

    /**
     *  The connectionId of the parent DirectConnectio
     */
    private long connectionId;

    /**
     *  The sessionId of the parent DirectSession
     */
    private long sessionId;

    /**
     *  The producerId for this DirectProducer when the Destination is specified
     *  at Producer creation time.
     */
    private long producerId = 0L;

    /**
     *  The default deliveyMode for this DirectProducer
     */
    private MessageDeliveryMode deliveryMode;
    private int jmsDeliveryMode = javax.jms.Message.DEFAULT_DELIVERY_MODE;

    /**
     *  The default message priority for this DirectProducer
     */
    private MessagePriority priority;
    private int jmsPriority = javax.jms.Message.DEFAULT_PRIORITY;

    /**
     *  The default timeToLive for messages produced by this DirectProducer
     */
    private long jmsTimeToLive = javax.jms.Message.DEFAULT_TIME_TO_LIVE;

    /**
     *  The default deliveryDelay for messages produced by this DirectProducer
     */
    private long jmsDeliveryDelay = javax.jms.Message.DEFAULT_DELIVERY_DELAY;

    /**
     *  The JMS Destination that is associated with this DirectProducer when the
     *  Destination is specified at Producer creation time.
     */
    private Destination destination = null;

    /**
     *  The JMSService Destination that is associated with this DirectProducer
     */
    private com.sun.messaging.jmq.jmsservice.Destination jmsservice_destination;

    /**
     *  Holds whether MessageID is disabled or not
     */
    private boolean disableMessageID = false;

    /**
     *  Holds whether MessageTimestamp is disabled or not
     */
    private boolean disableMessageTimestamp = false;

    /**
     *  Holds the closed state of this DirectProducer
     */
    private boolean isClosed;
    private boolean isClosing;

    /**
     *  Holds the map of producerId entries for a DirectProducer that is created
     *  with an unspecified Destination
     */
    private HashMap producerIds;
    
    /** For optimized logging while messaging */
    protected int _logLevel;
    protected boolean _logFINE = false;

    /**
     *  Logging
     */
    private static transient final String _className =
            "com.sun.messaging.jms.ra.DirectProducer";
    private static transient final String _lgrNameOutboundConnection =
            "javax.resourceadapter.mqjmsra.outbound.connection";
    private static transient final String _lgrNameJMSProducer =
            "javax.jms.MessageProducer.mqjmsra";
    private static transient final Logger _loggerOC =
            Logger.getLogger(_lgrNameOutboundConnection);
    private static transient final Logger _loggerJMP =
            Logger.getLogger(_lgrNameJMSProducer);
    private static transient final String _lgrMIDPrefix = "MQJMSRA_DMP";
    private static transient final String _lgrMID_EET = _lgrMIDPrefix + "1001: ";
    private static transient final String _lgrMID_INF = _lgrMIDPrefix + "1101: ";
    private static transient final String _lgrMID_WRN = _lgrMIDPrefix + "2001: ";
    private static transient final String _lgrMID_ERR = _lgrMIDPrefix + "3001: ";
    private static transient final String _lgrMID_EXC = _lgrMIDPrefix + "4001: ";

    /** Creates a new instance of DirectProducer with unspecified destination */
    public DirectProducer(DirectSession ds, JMSService jmsservice) {
        Object params[] = new Object[2];
        params[0] = ds;
        params[1] = jmsservice;
        _loggerOC.entering(_className, "constructor()", params);        
        this.ds = ds;
        this.jmsservice = jmsservice;
        this.connectionId = ds.getConnectionId();
        this.sessionId = ds.getSessionId();
        producerIds = new HashMap();
    }

    /** Creates a new instance of DirectProducer with a specified destination */
    public DirectProducer(DirectSession ds, JMSService jmsservice,
            long producerId, Destination destination,
            com.sun.messaging.jmq.jmsservice.Destination jmsservice_dest) {
        Object params[] = new Object[5];
        params[0] = ds;
        params[1] = jmsservice;
        params[2] = producerId;
        params[3] = destination;
        params[4] = jmsservice_dest;
        _loggerOC.entering(_className, "constructor()", params);        
        this.ds = ds;
        this.jmsservice = jmsservice;
        this.producerId = producerId;
        this.destination = destination;
        if (this.destination == null) {
            //Initialize producerIds table if DirectProducer created for
            //unspecified Destination (i.e. null)
            producerIds = new HashMap();
        }
        this.jmsservice_destination = jmsservice_dest;
        this.connectionId = ds.getConnectionId();
        this.sessionId = ds.getSessionId();
        java.util.logging.Level _level = _loggerJMP.getLevel();
        if (_level != null) {
            this._logLevel = _level.intValue();
            if (this._logLevel <= java.util.logging.Level.FINE.intValue()){
                this._logFINE = true;
            }
        }
    }

    /////////////////////////////////////////////////////////////////////////
    //  methods that implement javax.jms.MessageProducer
    /////////////////////////////////////////////////////////////////////////
    /**
     *  Close this MessageProducer
     */
    public synchronized void close()
    throws JMSException {
        _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+"close():");
        //harmless if already closed
        if (isClosed){
            return;
        } else {
            ds.removeProducer(this);
            this._close();
        }
    }

    /**
     *  Return the default JMS Message DeliveryMode for this MessageProducer
     *
     *  @return The deliveryMode
     *
     *  @throws javax.jms.JMSException If the MessageProducer has been closed.
     *
     *  @see javax.jms.DeliveryMode javax.jms.DeliveryMode
     */
    public int getDeliveryMode()
    throws JMSException{
        _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+
                "getDeliveryMode():"+this.deliveryMode);
        this._checkIfClosed("getDeliveryMode()");
        return this.jmsDeliveryMode;
        /*
        switch(this.deliveryMode) {
            case NON_PERSISTENT:
                return javax.jms.DeliveryMode.NON_PERSISTENT;
            case PERSISTENT:
            default:
                return javax.jms.DeliveryMode.PERSISTENT;
        }
        */
    }

    /**
     *  Return the Destination associated with this MessageProducer
     *
     *  @return The Destination
     *
     *  @throws javax.jms.JMSException If the MessageProducer has been closed.
     */
    public Destination getDestination()
    throws JMSException {
        String methodName = "getDestination()";
        _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+
                methodName +
                ((this.jmsservice_destination == null) 
                ? null : this.jmsservice_destination.toString()));
        this._checkIfClosed("getDestination()");
        return this.destination;
    }

    /**
     *  Return whether MessageIDs are disabled by this MessageProducer.

* * @return {@code true} If MessageIDs are diabled;
{@code false} * If MessageIDs are not diabled. * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public boolean getDisableMessageID() throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "getDisableMessageID():"+this.disableMessageID); this._checkIfClosed("getDisableMessageID()"); return this.disableMessageID; } /** * Return whether MessageIDs are disabled by this MessageProducer.

* * @return {@code true} If MessageIDs are diabled;
{@code false} * If MessageIDs are not diabled. * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public boolean getDisableMessageTimestamp() throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "getDisableMessageTimestamp():"+this.disableMessageTimestamp); this._checkIfClosed("getDisableMessageTimestamp()"); return this.disableMessageTimestamp; } /** * Return the default JMS Message Priority for this MessageProducer * * @return The priority * * @throws javax.jms.JMSException If the MessageProducer has been closed. * * @see javax.jms.Message#DEFAULT_PRIORITY javax.jms.Message.DEFAULT_PRIORITY * @see com.sun.messaging.jmq.jmsservice.JMSService.MessagePriority */ public int getPriority() throws JMSException{ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "getPriority():"+this.priority); this._checkIfClosed("getPriority()"); return this.jmsPriority; /* switch(this.priority) { case PRIORITY_0: return 0; case PRIORITY_1: return 1; case PRIORITY_2: return 2; case PRIORITY_3: return 3; case PRIORITY_4: return 4; case PRIORITY_5: return 5; case PRIORITY_6: return 6; case PRIORITY_7: return 7; case PRIORITY_8: return 8; case PRIORITY_9: return 9; default: return javax.jms.Message.DEFAULT_PRIORITY; } */ } /** * Return the timeToLive associated with this MessageProducer * * @return The timeToLive * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public long getTimeToLive() throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "getTimeToLive():"+this.jmsTimeToLive); this._checkIfClosed("getTimeToLive()"); return this.jmsTimeToLive; } /** * Send a Message to the specified Destination using this MessageProducer * * @param message The JMS Message to send * @param destination The JMS Destination to use when sending the * message. * * @throws javax.jms.JMSException If the MessageProducer has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Destination * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a MessageProducer hat specified a Destination at creation * time. */ public void send(Destination destination, Message message) throws JMSException { String methodName = "send(Destination, Message)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, destination); this._createAndAddProducerId(destination); this._send(destination, message, this.jmsDeliveryMode, this.jmsPriority, this.jmsTimeToLive); } /** * Send a Message to the specified Destination using this MessageProducer * * @param message The JMS Message to send * @param destination The JMS Destination to use when sending the * message. * @param deliveryMode The JMS DeliveryMode to use when sending the * message. * @param priority The JMS Priority to use when sending the message. * @param timeToLive The JMS Expiration to use when sending the message * in milliseconds. * * @throws javax.jms.JMSException If the MessageProducer has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Destination * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a MessageProducer hat specified a Destination at creation * time. */ public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException { String methodName = "send(Destination, Message, deliveryMode, priority, timeToLive)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, destination); this._createAndAddProducerId(destination); this._send(destination, message, deliveryMode, priority, timeToLive); } /** * Send a Message to the Destination specified by this MessageProducer * using the values of deliveryMode, priority, timeToLive that are * configured in this MessageProducer. * * @param message The JMS Message to send * * @throws javax.jms.JMSException If the MessageProducer has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If the Destination is * invalid at the time of the send. * @throws javax.jms.UnsupportedOperationException If this method is used * with a MessageProducer that did not specify a Destination at * creation time. */ public void send(Message message) throws JMSException { String methodName = "send(Message)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkForUnsupportedOperation(methodName, null, true); this._send(this.destination, message, this.jmsDeliveryMode, this.jmsPriority, this.jmsTimeToLive); } /** * Send a Message to the Destination specified by this MessageProducer * using the specified deliveryMode, priority, and timeToLive. * * @param message The JMS Message to send * @param deliveryMode The JMS DeliveryMode to use when sending the * message. * @param priority The JMS Priority to use when sending the message. * @param timeToLive The JMS Expiration to use when sending the message * in milliseconds. * * @throws javax.jms.JMSException If the MessageProducer has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If the Destination is * invalid at the time of the send. * @throws javax.jms.UnsupportedOperationException If this method is used * with a MessageProducer that did not specify a Destination at * creation time. */ public void send(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException { String methodName = "send(Message, deliveryMode, priority, timeToLive)"; _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); this._checkIfClosed(methodName); this._checkForUnsupportedOperation(methodName, null, true); this._send(this.destination, message, deliveryMode, priority, timeToLive); } /** * Set the default JMS Message DeliveryMode for this MessageProducer * * @param deliveryMode The deliveryMode to set for this MessageProducer * * @throws javax.jms.JMSException If the MessageProducer has been closed. * * @see javax.jms.DeliveryMode javax.jms.DeliveryMode */ public void setDeliveryMode(int deliveryMode) throws JMSException{ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setDeliveryMode():"+deliveryMode); this._checkIfClosed("getDeliveryMode()"); switch(deliveryMode) { case javax.jms.DeliveryMode.PERSISTENT: this.deliveryMode = JMSService.MessageDeliveryMode.PERSISTENT; this.jmsDeliveryMode = javax.jms.DeliveryMode.PERSISTENT; break; case javax.jms.DeliveryMode.NON_PERSISTENT: this.deliveryMode = JMSService.MessageDeliveryMode.NON_PERSISTENT; this.jmsDeliveryMode = javax.jms.DeliveryMode.NON_PERSISTENT; break; default: String excMsg = _lgrMID_EXC + "setDeliveryMode():" + "Invalid deliveryMode=" + deliveryMode; _loggerJMP.warning(excMsg); throw new JMSException(excMsg); } } /** * Set whether MessageID is disabled by this MessageProducer.

* * @param disableMessageID {@code true} if MessageIDs are to be disabled
* {@code false} if MessageIDs are to be enabled * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public void setDisableMessageID(boolean disableMessageID) throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setDisableMessageID():"+disableMessageID); this._checkIfClosed("setDisableMessageID()"); this.disableMessageID = disableMessageID; } /** * Set whether MessageTimestamp is disabled by this MessageProducer.

* * @param disableMessageTimestamp {@code true} If MessageTimestamp is * diabled
* {@code false} If MessageTimestamp is not diabled. * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public void setDisableMessageTimestamp(boolean disableMessageTimestamp) throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setDisableMessageTimestamp():"+disableMessageTimestamp); this._checkIfClosed("setDisableMessageTimestamp()"); this.disableMessageTimestamp = disableMessageTimestamp; } /** * Set the JMS Message Priority for this MessageProducer * * @param priority The priority to set for this MessageProducer * * @throws javax.jms.JMSException If the MessageProducer has been closed. * * @see javax.jms.Message#DEFAULT_PRIORITY javax.jms.Message.DEFAULT_PRIORITY * @see com.sun.messaging.jmq.jmsservice.JMSService.MessagePriority */ public void setPriority(int priority) throws JMSException{ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setPriority():"+priority); this._checkIfClosed("setPriority()"); switch(priority) { case 0: this.priority = JMSService.MessagePriority.PRIORITY_0; break; case 1: this.priority = JMSService.MessagePriority.PRIORITY_1; break; case 2: this.priority = JMSService.MessagePriority.PRIORITY_2; break; case 3: this.priority = JMSService.MessagePriority.PRIORITY_3; break; case 4: this.priority = JMSService.MessagePriority.PRIORITY_4; break; case 5: this.priority = JMSService.MessagePriority.PRIORITY_5; break; case 6: this.priority = JMSService.MessagePriority.PRIORITY_6; break; case 7: this.priority = JMSService.MessagePriority.PRIORITY_7; break; case 8: this.priority = JMSService.MessagePriority.PRIORITY_8; break; case 9: this.priority = JMSService.MessagePriority.PRIORITY_9; break; default: String excMsg = _lgrMID_EXC + "setPriority():" + "Invalid to set priority outside (0-9):value=" + priority; _loggerJMP.warning(excMsg); throw new JMSException(excMsg); } this.jmsPriority = priority; } /** * Set the default timeToLive associated with this MessageProducer * * @param timeToLive The default message expiration time in milliseconds * * @throws javax.jms.JMSException If the MessageProducer has been closed. */ public void setTimeToLive(long timeToLive) throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setTimeToLive():"+timeToLive); this._checkIfClosed("setTimeToLive()"+timeToLive); if (timeToLive < 0){ String excMsg = _lgrMID_EXC + "setTimeToLive():" + "Invalid to set timeToLive as negative:value=" + timeToLive; _loggerJMP.warning(excMsg); throw new JMSException(excMsg); } else { this.jmsTimeToLive = timeToLive; } } /** Sets the default minimum length of time in milliseconds from its dispatch time * before a produced message becomes visible on the target destination and available * for delivery to consumers. * *

deliveryDelay is set to zero by default. * * @param deliveryDelay the delivery delay in milliseconds. * * @exception JMSRuntimeException if the JMS provider fails to set the delivery * delay due to some internal error. * * @see javax.jms.MessagingContext#getDeliveryDelay * @see javax.jms.Message#DEFAULT_DELIVERY_DELAY */ public void setDeliveryDelay(long deliveryDelay) throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "setDeliveryDelay():"+deliveryDelay); this._checkIfClosed("setDeliveryDelay()"+deliveryDelay); if (deliveryDelay < 0L){ String excMsg = _lgrMID_EXC + "setDeliveryDelay():" + "Invalid to set deliveryDelay as negative:value=" + deliveryDelay; _loggerJMP.warning(excMsg); throw new JMSException(excMsg); } else { this.jmsDeliveryDelay = deliveryDelay; } } /** Gets the default minimum length of time in milliseconds from its dispatch time * before a produced message becomes visible on the target destination and available * for delivery to consumers. * * @return the delivery delay in milliseconds. * * @exception JMSRuntimeException if the JMS provider fails to get the delivery * delay due to some internal error. * * @see javax.jms.MessagingContext#setDeliveryDelay */ public long getDeliveryDelay() throws JMSException { _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ "getDeliveryDelay():"+this.jmsDeliveryDelay); this._checkIfClosed("getDeliveryDelay()"); return this.jmsDeliveryDelay; } ///////////////////////////////////////////////////////////////////////// // end javax.jms.MessageProducer ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // methods that implement javax.jms.QueueSender ///////////////////////////////////////////////////////////////////////// /** * Return the Queue associated with this QueueSender * * @return The Queue * * @throws javax.jms.JMSException If the QueueSender has been closed. */ public Queue getQueue() throws JMSException { String methodName = "getQueue()"; _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":" + methodName); this._checkIfClosed(methodName); if (this.destination == null) { return (Queue)null; } else { if (this.destination instanceof Queue) { return (Queue)this.destination; } } _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName + " called on Destination:"+this.destination); return (Queue)null; } /** * Send a Message to the specified Queue using this QueueSender * * @param message The JMS Message to send * @param queue The JMS Queue to use when sending the message. * * @throws javax.jms.JMSException If the QueueSender has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Destination * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a QueueSender hat specified a Destination at creation * time. */ public void send(Queue queue, Message message) throws JMSException { String methodName = "send(Queue, Message)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, queue); this._createAndAddProducerId(queue); this._send(queue, message, this.jmsDeliveryMode, this.jmsPriority, this.jmsTimeToLive); } /** * Send a Message to the specified Queue using this QueueSender * * @param message The JMS Message to send * @param queue The JMS Queue to use when sending the * message. * @param deliveryMode The JMS DeliveryMode to use when sending the * message. * @param priority The JMS Priority to use when sending the message. * @param timeToLive The JMS Expiration to use when sending the message * in milliseconds. * * @throws javax.jms.JMSException If the QueueSender has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Queue * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a QueueSender that specified a Queue at creation * time. */ public void send(Queue queue, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException { String methodName = "send(Queue, Message, deliveryMode, priority, timeToLive)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, queue); this._createAndAddProducerId(queue); this._send(queue, message, deliveryMode, priority, timeToLive); } ///////////////////////////////////////////////////////////////////////// // end javax.jms.QueueSender ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // methods that implement javax.jms.TopicPublisher ///////////////////////////////////////////////////////////////////////// /** * Return the Topic associated with this TopicPublisher * * @return The Topic * * @throws javax.jms.JMSException If the TopicPublisher has been closed. */ public Topic getTopic() throws JMSException { String methodName = "getTopic()"; _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+methodName); this._checkIfClosed(methodName); if (this.destination == null){ return (Topic)null; } else { if (this.destination instanceof Topic) { return (Topic)this.destination; } } _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName+" called on Destination:"+this.destination); return (Topic)null; } /** * Publish a Message to the Topic specified by this TopicPublisher * using the values of deliveryMode, priority, timeToLive that are * configured in this TopicPublisher. * * @param message The JMS Message to send * * @throws javax.jms.JMSException If the TopicPublisher has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If the Topic is * invalid at the time of the send. * @throws javax.jms.UnsupportedOperationException If this method is used * with a TopicPublisher that did not specify a Topic at * creation time. */ public void publish(Message message) throws JMSException { String methodName = "publish(Message)"; _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); this._checkIfClosed(methodName); this._checkForUnsupportedOperation(methodName, null, true); this._send(this.destination, message, this.jmsDeliveryMode, this.jmsPriority, this.jmsTimeToLive); } /** * Send a Message to the Topic specified by this TopicPublisher * using the specified deliveryMode, priority, and timeToLive. * * @param message The JMS Message to send * @param deliveryMode The JMS DeliveryMode to use when sending the * message. * @param priority The JMS Priority to use when sending the message. * @param timeToLive The JMS Expiration to use when sending the message * in milliseconds. * * @throws javax.jms.JMSException If the TopicPublisher has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If the Topic is * invalid at the time of the send. * @throws javax.jms.UnsupportedOperationException If this method is used * with a TopicPublisher that did not specify a Destination at * creation time. */ public void publish(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException { String methodName = "publish(Message, deliveryMode, priority, timeToLive)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkForUnsupportedOperation(methodName, null, true); this._send(this.destination, message, deliveryMode, priority, timeToLive); } /** * Publish a Message to the specified Topic using this TopicPublisher * * @param message The JMS Message to send * @param topic The JMS Topic to use when sending the message. * * @throws javax.jms.JMSException If the TopicPublisher has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Destination * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a TopicPublisher that specified a Topic at creation * time. */ public void publish(Topic topic, Message message) throws JMSException { String methodName = "publish(Topic, Message)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, topic); this._createAndAddProducerId(topic); this._send(topic, message, this.jmsDeliveryMode, this.jmsPriority, this.jmsTimeToLive); } /** * Publish a Message to the specified Topic using this TopicPublisher * * @param message The JMS Message to send * @param topic The JMS Topic to use when sending the * message. * @param deliveryMode The JMS DeliveryMode to use when sending the * message. * @param priority The JMS Priority to use when sending the message. * @param timeToLive The JMS Expiration to use when sending the message * in milliseconds. * * @throws javax.jms.JMSException If the TopicPublisher has been closed or * it fails to send the message due to an internal error in the * provider. * @throws javax.jms.MessageFormatException If an invalid Message is used * @throws javax.jms.InvalidDestinationException If an invalid Topic * is used. * @throws javax.jms.UnsupportedOperationException If this method is used * with a TopicPublisher that specified a Topic at creation * time. */ public void publish(Topic topic, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException { String methodName = "publish(Topic, Message, deliveryMode, priority, timeToLive)"; if (this._logFINE){ _loggerJMP.fine(_lgrMID_INF+"producerId="+producerId+":"+ methodName); } this._checkIfClosed(methodName); this._checkDestinationParam(methodName, topic); this._createAndAddProducerId(topic); this._send(topic, message, deliveryMode, priority, timeToLive); } ///////////////////////////////////////////////////////////////////////// // end javax.jms.TopicPublisher ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // MQ methods ///////////////////////////////////////////////////////////////////////// /** * Return the connectionId for this DirectProducer * * @return The connectionId */ public long getConnectionId() { return this.connectionId; } /** * Return the sessionId for this DirectProducer * * @return The sessionId */ public long getSessionId() { return this.sessionId; } /** * Return the producerId for this DirectProducer * * @return The producerId */ public long getProducerId() { return this.producerId; } /** * Return the closed state of this DirectProducer * * @return {@code true} if this producer has been closed; * {@code false} otherwise */ public synchronized boolean isClosed() { return this.isClosed; } /** * Check if the DirectProducer is closed prior to performing an * operation and throw a JMSException if it is closed. * * @param methodname The name of the method from which this is called * * @throws JMSException if it is closed */ private void _checkIfClosed(String methodname) throws JMSException { if (isClosed()) { String closedmsg = _lgrMID_EXC + methodname + "MessageProducer is closed:Id=" + producerId; _loggerJMP.warning(closedmsg); throw new javax.jms.IllegalStateException(closedmsg); } } /** * Create and add a producerId to this DirectProducer */ private void _createAndAddProducerId(Destination destination) throws JMSException { //Spcified destination case String _name = null, dName = null; com.sun.messaging.jmq.jmsservice.Destination.Type _type = com.sun.messaging.jmq.jmsservice.Destination.Type.QUEUE; com.sun.messaging.jmq.jmsservice.Destination.Life _life = com.sun.messaging.jmq.jmsservice.Destination.Life.STANDARD; if (destination instanceof javax.jms.Queue){ _name = ((Queue)destination).getQueueName(); _type = com.sun.messaging.jmq.jmsservice.Destination.Type.QUEUE; if (destination instanceof javax.jms.TemporaryQueue){ _life = com.sun.messaging.jmq.jmsservice.Destination.Life.TEMPORARY; dName = _name; } else { dName = _type + _name; } } if (destination instanceof javax.jms.Topic){ _name = ((Topic)destination).getTopicName(); _type = com.sun.messaging.jmq.jmsservice.Destination.Type.TOPIC; if (destination instanceof javax.jms.TemporaryTopic){ _life = com.sun.messaging.jmq.jmsservice.Destination.Life.TEMPORARY; dName = _name; } else { dName = _type + ":" + _name; } } com.sun.messaging.jmq.jmsservice.Destination _destination = new com.sun.messaging.jmq.jmsservice.Destination(_name, _type, _life); //XXX:tharakan:Need to Verify Destination first ??? //dc._verifyDestination(_destination); //Destination may have been removed even if it was created before this.ds.getConnection()._createDestination(_destination); //Check producerIds for existing producerId for this destination (dName) if (!this.producerIds.containsKey(dName)) { long producerId = this.ds._createProducerId(_destination); this.producerIds.put(dName, producerId); } } /** * Check if a null Destination was used when a non-null Destination is * required. * * @param methodname The name of the method from which this is called * @param dest The Destination parameter used to the calling * method * * @throws InvalidDestinationException If a null Destination is used * @throws UnsupportedOperationException If a non-null Destination * parameter method is used to produce a message when the * MessageProducer has been created with a specified Destination */ private void _checkDestinationParam(String methodname, Destination dest) throws JMSException { if (dest == null){ String nullDestMsg = _lgrMID_EXC + methodname + ":Null Destination used:"; _loggerJMP.warning(nullDestMsg); throw new InvalidDestinationException(nullDestMsg,_lgrMID_EXC); } else { this._checkForUnsupportedOperation(methodname, dest, false); } } /** * Check for UnsupportedOperation * * @param methodname The name of the method from which this is called * @param dest The Destination parameter used to the calling * method * @param mpDest_Required Indicates whether the MessageProducer * destination is required to be non-null or not.
* {@code true} if it is required to be non-null.
* {@code false} if it is required to be null */ private void _checkForUnsupportedOperation(String methodname, Destination dest, boolean mpDest_Required) { if (mpDest_Required == false){ //the MessageProducer destination is required to be null //If found throw UnsupportedOperationException if (this.destination != null){ String nonNullDestMsg = null; String dest_name = null; try { dest_name = ((dest instanceof javax.jms.Queue) ? ((Queue) dest).getQueueName() : ((Topic) dest).getTopicName()); } catch (JMSException ex) { dest_name = "null"; } nonNullDestMsg = _lgrMID_EXC + methodname + ":Unsupported Operation:" + "Producing to destination:" + dest_name + ":in MessageProducer with specified Destination"; if (this.jmsservice_destination != null) { nonNullDestMsg = nonNullDestMsg + "=" + this.jmsservice_destination.getType() + ":" + this.jmsservice_destination.getName(); } _loggerJMP.warning(nonNullDestMsg); throw new UnsupportedOperationException(nonNullDestMsg); } } else { //the MessageProducer destination is required to be non-null //If not found throw UnsupportedOperationException if (this.destination == null){ String nullDestMsg = _lgrMID_EXC + methodname + ":Unsupported Operation:"+ "Producing destination not specified (null) " + "in MessageProducer with unspecified Destination"; _loggerJMP.warning(nullDestMsg); throw new UnsupportedOperationException(nullDestMsg); } } } /** * Send a Message */ private void _send(Destination destination, Message msg, int deliveryMode, int priority, long timeToLive) throws JMSException{ JMSPacket msgPkt = null; DirectPacket dPkt = null; boolean foreignMessageConverted = false; //System.out.println("_send:Message is instanceof-"+msg.getClass().getName()); if (msg instanceof DirectPacket) { dPkt = (DirectPacket)msg; } else { dPkt = DirectPacket.constructFromForeignMessage(this.jmsservice, this.ds, msg); foreignMessageConverted = true; } assert dPkt != null; dPkt.setJMSDestination(destination); dPkt.setJMSDeliveryMode(deliveryMode); dPkt.setJMSPriority((priority)); dPkt.setJMSExpiration(timeToLive); dPkt.setJMSDeliveryTime(jmsDeliveryDelay); dPkt.preparePacketForSend(); msgPkt = (JMSPacket)dPkt; this.ds._sendMessage(msgPkt); if (foreignMessageConverted){ DirectPacket.updateForeignMessageAfterSend(dPkt, msg); } } /** * Close Producer for use when Session.close is used */ protected synchronized void _close() throws JMSException{ //harmless if already closed if (isClosed){ return; } else { isClosing = true; //Anything? } try { if (destination !=null) { //System.out.println("DP:Destroying prducerId="+producerId+":connectionId="+connectionId); jmsservice.deleteProducer(connectionId, sessionId, producerId); } else { //must cycle through producerIds and delete them one by one long t_producerId; String dName = null; Iterator k = producerIds.keySet().iterator(); while (k.hasNext()) { dName = k.next(); t_producerId = producerIds.get(dName); try { //System.out.println("DP:Destroying t_producerId="+t_producerId); jmsservice.deleteProducer(connectionId, sessionId, t_producerId); } catch (JMSServiceException jmssel){ _loggerJMP.warning(_lgrMID_WRN+ "producerId="+t_producerId+":"+"close():"+ "JMSService.deleteProducer():"+ "Destination=:" + dName + ":JMSServiceException="+ jmssel.getMessage()); } k.remove(); } producerIds.clear(); } } catch (JMSServiceException jmsse){ _loggerJMP.warning(_lgrMID_WRN+ "producerId="+producerId+":"+"close():"+ "JMSService.deleteProducer():"+ "Destination=:" + destination + ":JMSServiceException="+ jmsse.getMessage()); } this.isClosed = true; this.isClosing = false; } @Override public void send(Message message, CompletionListener completionListener) throws JMSException { throw new JMSException(_lgrMID_EXC+"Method send(Message, CompletionListener) is not allowed"); } @Override public void send(Message message, int deliveryMode, int priority, long timeToLive, CompletionListener completionListener) throws JMSException { throw new JMSException(_lgrMID_EXC+"Method send(Message, int, int, long, CompletionListener) is not allowed"); } @Override public void send(Destination destination, Message message, CompletionListener completionListener) throws JMSException { throw new JMSException(_lgrMID_EXC+"Method send(Destination, Message, CompletionListener) is not allowed"); } @Override public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive, CompletionListener completionListener) throws JMSException { throw new JMSException(_lgrMID_EXC+"Method send(Destination, Message, int, int, long, CompletionListener) is not allowed"); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy