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);
}
}