Jms 多次收到同一消息

Jms 多次收到同一消息,jms,synchronous,Jms,Synchronous,我有一个应用程序,它可以连续读取传入文件夹中的文件。 一旦有任何可用文件,应用程序将读取并发布到JMS队列。应用程序2正在侦听同一JMS队列。 在这里,消息是同步发布的。因此,当发布者发布消息并等待接收到来自接收者的响应时 我面临的问题是接收者多次接收同一消息 下面是发布和接收部件的代码段。请你强调一下我错在哪里好吗 出版商: =============================================================================== 消费者:

我有一个应用程序,它可以连续读取传入文件夹中的文件。
一旦有任何可用文件,应用程序将读取并发布到JMS队列。应用程序2正在侦听同一JMS队列。 在这里,消息是同步发布的。因此,当发布者发布消息并等待接收到来自接收者的响应时

我面临的问题是接收者多次接收同一消息

下面是发布和接收部件的代码段。请你强调一下我错在哪里好吗

出版商: ===============================================================================

消费者: ==================================================================

日志: 第1行:2017-05-04 12:14:31590信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File3_crc_5_1493; 900070455.csv] 第68行:2017-05-04 12:14:32917信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File2_crc_2_1493; 900070423.csv] 第117行:2017-05-04 12:14:33665信息[ExecuteThread:'3'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File2_crc_4.csv]的消息 第140行:2017-05-04 12:14:33725信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File2_crc_2_1493; 900070423.csv] 第183行:2017-05-04 12:14:33793信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File3_crc_5_1493; 900070455.csv] 第205行:2017-05-04 12:14:33814信息[ExecuteThread:'3'表示队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File1_crc_1_1493; 900070380.csv] 第229行:2017-05-04 12:14:33846信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File2_crc_5_1493; 900070433.csv] 第328行:2017-05-04 12:14:34108信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File2_crc_5_1493; 900070433.csv] 第363行:2017-05-04 12:14:34143信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File4_crc_2_1493; 900070465.csv] 第399行:2017-05-04 12:14:34192信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_4.csv]的消息 第489行:2017-05-04 12:14:34435信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File3_crc_1.csv]的消息 第493行:2017-05-04 12:14:34436信息[ExecuteThread:'3'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File4_crc_1.csv]的消息 第523行:2017-05-04 12:14:34454信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_5.csv]的消息 第575行:2017-05-04 12:14:34499信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_2.csv]的消息 第643行:2017-05-04 12:14:34812信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_4.csv]的消息 第685行:2017-05-04 12:14:34866信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File2_crc_3_1493; 900070427.csv] 第729行:2017-05-04 12:14:34900信息[ExecuteThread:'3'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_5.csv]的消息 第753行:2017-05-04 12:14:34917信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File4_crc_3_1493; 900070468.csv]的消息 第798行:2017-05-04 12:14:34953信息[ExecuteThread:'3'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File4_crc_1.csv]的消息 第871行:2017-05-04 12:14:35016信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File3_crc_2_1493; 900070440.csv] 第911行:2017-05-04 12:14:35051信息[ExecuteThread:'0'表示队列:'default']-JmsMessageConsumer:收到批处理文件[File1_crc_3_1493; 900070408.csv]的消息 第987行:2017-05-04 12:14:35268信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件的消息[File3_crc_4_1493; 900070446.csv] 第1014行:2017-05-04 12:14:35823信息[ExecuteThread:'2'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File4\u crc\u 5.csv]的消息 第1015行:2017-05-04 12:14:35823信息[ExecuteThread:'0'用于队列:'default']-JmsMessageConsumer:收到批处理文件[File4\u crc\u 4.csv]的消息

public class JMSPublisher {

    private static final Logger LOGGER = LoggerFactory.getLogger(JMSPublisher.class);
    private static final String MYNAME = JMSPublisher.class.getSimpleName();
    private BytesMessage bytesMessage = null;
    private static final Configuration configuration = Configuration.getInstance();

    public synchronized void publishMessage(String destinationName, Manufacturer manufacturer, String fileName, InputStream is, FileDetails fd) throws JMSException {
        String queueName = null;

        InitialContext initialContext = null;

        Object[] params = new Object[]{};
        try {
            queueName = configuration.getQueueName();
            initialContext = getInitialContext(configuration.getProviderUrl());
            QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup(configuration.getConnectionFactory());
            QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue queue = (Queue) initialContext.lookup(configuration.getQueueName());

            queueConnection.start();

            QueueRequestor queueRequestor = new QueueRequestor(queueSession, queue);

            bytesMessage = queueSession.createBytesMessage();

//            boolean writeSuccess = false;
            TextMessage responseMessage = null;
            try {

                bytesMessage.writeBytes(IOUtils.toByteArray(is));
                responseMessage = (TextMessage) queueRequestor.request(bytesMessage);
                params = new Object[]{MYNAME, fileName, queueName, bytesMessage.getJMSMessageID()};
                LOGGER.info("{}: Published  Batch File [{}] to queue [{}] with MessagdID [{}]", params);
                params = new Object[]{MYNAME, bytesMessage.getJMSMessageID(), responseMessage.getJMSCorrelationID(), responseMessage.getJMSDestination(), responseMessage.getJMSTimestamp()};
                LOGGER.info("{}: Response for Message: MessageID [{}]: JMSCorrelationID [{}] JMSDestination [{}] JMSTimestamp [{}] ", params);

            } catch (Exception ex) {
                LOGGER.error("{}: Exception occurred while publishing the Batch File [{}] to JMS Queue. Error: [{}]", MYNAME, fileName, ex);

            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException ex) {
                        LOGGER.error(": Error in closing the InputStream for file [{}] with error [{}]", fileName, ex);
                    }
                }
            }
            queueConnection.close();

        } catch (NamingException ex) {
            exceptionOccurred = true;
            LOGGER.error("{}: Naming exception occured [{}]", MYNAME, ex);
        } finally {
            if (initialContext != null) {
                try {
                    initialContext.close();
                } catch (NamingException ex) {
                    LOGGER.error("{}: Naming exception occured while closing initialContext [{}]", MYNAME, ex);
                }
            }
        }

    }

    private InitialContext getInitialContext(String url) throws NamingException {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, configuration.getInitialFactory());
        env.put(Context.PROVIDER_URL, url);
        return new InitialContext(env);
    }

}
public class JmsMessageConsumer implements MessageListener, ExceptionListener {


    private QueueConnection queueConnection = null;
    private QueueSession queueSession = null;
    private InitialContext initialContext = null;
    private Configuration cfg = null;    
    private AbstractApplicationContext ctx = null;
    private Configuration config = Configuration.getInstance();
    private String majorReturnCode = MajorReturnCode.INTERNAL_ERROR;
    private String minorReturnCode = MinorReturnCode.INTERNAL_ERROR;
    private QueueConnectionFactory queueConnectionFactory = null;
    private Queue queue = null;
    private QueueReceiver queueReceiver = null;

    public void init() throws NamingException, ConfigException {
        cfg = Configuration.getInstance();
        initialContext = getInitialContext(cfg.getProviderUrl());
        queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup(cfg.getConnectionFactory());
        queue = (Queue) initialContext.lookup(cfg.getSimBatchQueue());
        getConnection();
    }

    public void onException(JMSException jmse) {
        LOGGER.error("{}.init().onException(): Connection to JMS Queue lost. Error [{}]", MYNAME, jmse.getMessage());
        getConnection();
    }

    public void getConnection() {

        try {
            queueConnection = queueConnectionFactory.createQueueConnection();
            queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            queueReceiver = queueSession.createReceiver(queue);
            queueReceiver.setMessageListener(this);
            queueConnection.setExceptionListener(this);
            queueConnection.start();
            LOGGER.info("{}.getConnection(): Connected to JMS Queue", MYNAME);

        } catch (Exception ex) {
            LOGGER.error("{}.getConnection(): Exception occured. Error {{}]", MYNAME, ex);
            getConnection();
        }
    }

    @Override
    public void onMessage(Message message) {

        TextMessage replyMessage = null;
        QueueSender replyToSender = null;

        try {

            BufferedReader br = null;
String simBatchFileName = message.getStringProperty("simBatchFileName");
            LOGGER.info("{}: Message received for Batch File [{}]", MYNAME,simBatchFileName );
            InputStream jmsMessageConsumer = new BytesMessageInputStream((BytesMessage) message);

                byte[] inputBytes = IOUtils.toByteArray(jmsMessageConsumer);              
                BytesMessage bytesMessage = (BytesMessage) message;
                Queue replyTo = (Queue) bytesMessage.getJMSReplyTo();
                replyToSender = queueSession.createSender(replyTo);
                replyMessage = queueSession.createTextMessage();

                setReplyMessage(replyMessage, isSimBatchFileValid, isTimOrderValid, isValidCustomer, timOrderNumber, customerName, validateTimOrder, errorMsg);


        } catch (JMSException e) {
            LOGGER.error("{}.onMessage(): JMSException occured with error: [{}]", MYNAME, e);
            errorMsg = "JMSException occured with error: " + e.getMessage();

            try {
                if (replyToSender != null) {
                    replyToSender.send(replyMessage);
                }

            } catch (JMSException ex) {
                LOGGER.error("{}.onMessage(): JMSException occured in re-sending the reply: [{}]", MYNAME, ex);
                errorMsg = "JMSException occured with error: " + ex.getMessage();

            }

        } catch (IOException ex) {
            LOGGER.error("{}: Error in reading the message - [{}]", MYNAME, ex);

        }
    }


    private InitialContext getInitialContext(String url) throws NamingException {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, cfg.getInitialFactory());
        env.put(Context.PROVIDER_URL, url);
        System.setProperty("weblogic.MaxMessageSize", config.getMaxJmsMsgSize());
        return new InitialContext(env);
    }

    private void setReplyMessage(TextMessage replyMessage, boolean isSimBatchFileValid, boolean isTimOrderValid, boolean isValidCustomer, String timOrderNumber, String customerName, boolean validateTimOrder, String errorMsg) throws JMSException {
        replyMessage.setBooleanProperty("isSimBatchFileValid", isSimBatchFileValid);
        replyMessage.setBooleanProperty("isTimOrderValid", isTimOrderValid);
        replyMessage.setBooleanProperty("isValidCustomer", isValidCustomer);
        replyMessage.setStringProperty("timOrderNumber", timOrderNumber);
        replyMessage.setStringProperty("customerCode", customerName);
        replyMessage.setBooleanProperty("validateTimOrder", validateTimOrder);
        replyMessage.setStringProperty("simBatchHeaderId", (batchHeaderId != null) ? batchHeaderId.toString() : null);
        replyMessage.setStringProperty("majorReturnCode", this.getMajorReturnCode());
        replyMessage.setStringProperty("minorReturnCode", this.getMinorReturnCode());
        replyMessage.setStringProperty("errorMsg", errorMsg);
    }
}