Greetings

A friend recommended that a new Producer and Session should be created for every message put on the queue. See below Is this correct?

-------------------- put message on queue ------------

        try {
            new ProducerTask<Void>() {

                @Override
                public Destination getDestination() { return destination; }

                @Override
protected Void use(MessageProducer mc, Session s) throws Exception {
                    try {
TextMessage message = s.createTextMessage(fileQueueItem.getValue());
                        mc.send(message);
                    } catch (JMSException e) {
throw new FileQueueException("failed to send message:"+e.getMessage(),e,logger);
                    }
                    return null;
                }

                @Override
                public Connection getConnection() {
                    return connection;
                }

            }.call();
        } catch (Exception e) {
            logger.error("failed to handle message:"+e.getMessage(),e);
        }

-------------------- session task ------------

    private abstract class SessionTask<V> implements Callable<V> {

        @Override public final V call() throws Exception {
final Session s = getConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE);
            try {
                return use(s);
            } finally {
                s.close();
            }
        }

        protected abstract V use(Session s) throws Exception;

        public abstract Connection getConnection();
    }


--------------------  producer task ------------

 private abstract class ProducerTask<V> implements Callable<V> {

            public abstract Destination getDestination();

            @Override public V call() throws Exception {
                return new SessionTask<V>() {
@Override public V use(final Session s) throws Exception { final MessageProducer mp = s.createProducer(getDestination());
                        mp.setDeliveryMode(DeliveryMode.PERSISTENT);
                        try {
                            return ProducerTask.this.use(mp, s);
                        } finally {
                            mp.close();
                        }
                    }

                    public Connection getConnection() {
                        return ProducerTask.this.getConnection();
                    }

                }.call();


            }

            public abstract Connection getConnection();

protected abstract V use(MessageProducer mp, Session s) throws Exception;
        }




Reply via email to