your messageListener
is a singleton, so all threads will uses the same instance, like this you can synchronize a call to a method to append messages to a new line as a field on that instance.
UPDATE 1
use org.springframework.jms.core.JmsTemplate.receive()
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.apache.activemq.command.ActiveMQTextMessage;
public class DefaultMessageListener implements MessageListener {
private volatile String line = "";
private volatile int messageCount;
private int batchSize;
private volatile long startTime = 0;
private long maximumBatchWaitTime;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
if (messageCount > 0 && (startTime > (System.currentTimeMillis() - maximumBatchWaitTime))) {
createExecFile();
}
}
}
});
{
thread.start();
}
@Override
public synchronized void onMessage(Message message) {
if (messageCount == 0) {
startTime = System.currentTimeMillis();
}
try {
messageCount++;
line += ((TextMessage) message).getText();
System.out.println(line);
// (startTime > (System.currentTimeMillis() - maximumBatchWaitTime))
// why to do this ?? not needed i think
if (messageCount == batchSize) {
createExecFile();
}
} catch (final Exception e) {
e.printStackTrace();
}
}
private void createExecFile() {
try {
execService.createExecFile(line);
} catch (final Exception e) {
e.printStackTrace();
}
messageCount = 0;
line = "";
}
}
UPDATE 2
import javax.jms.Message;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.command.ActiveMQMessage;
import org.springframework.jms.core.JmsTemplate;
public class DefaultMessageListener {
private volatile String line = "";
private volatile int messageCount;
private long maximumBatchWaitTime;
JmsTemplate jmsTemplate;
public void getMessages() {
try {
// configure bean jmsTemplate like this on definition
jmsTemplate.setSessionAcknowledgeMode(ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
jmsTemplate.setReceiveTimeout(maximumBatchWaitTime);
//
Message message = jmsTemplate.receive();
if (message != null) {
messageCount++;
line += ((TextMessage) message).getText();
}
System.out.println(line);
if (messageCount > 0) {
createExecFile();
}
message.acknowledge();
} catch (final Exception e) {
e.printStackTrace();
}
}
private void createExecFile() {
try {
execService.createExecFile(line);
} catch (final Exception e) {
e.printStackTrace();
}
messageCount = 0;
line = "";
}
}
INDIVIDUAL_ACKNOWLEDGE : unacknowledged messages are being re-delivered when the consumer connects again.
examples http://alvinalexander.com/java/jwarehouse/activemq/activemq-core/src/test/java/org/apache/activemq/JMSIndividualAckTest.java.shtml
UPDATE 3
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQSession;
import org.springframework.jms.core.JmsTemplate;
public class DefaultMessageListener {
private volatile String line = "";
private volatile int messageCount;
private long maximumBatchWaitTime;
JmsTemplate jmsTemplate;
private ActiveMQSession session;
public void getMessages() throws JMSException {
try {
// configure bean jmsTemplate like this on definition
jmsTemplate.setSessionAcknowledgeMode(ActiveMQSession.CLIENT_ACKNOWLEDGE);
jmsTemplate.setReceiveTimeout(maximumBatchWaitTime);
//
Message message = jmsTemplate.receive();
if (message != null) {
messageCount++;
line += ((TextMessage) message).getText();
}
System.out.println(line);
if (messageCount > 0) {
createExecFile();
}
} catch (final Exception e) {
e.printStackTrace();
session.recover();
messageCount = 0;
line = "";
}
}
private void createExecFile() {
execService.createExecFile(line);
session.acknowledge();
messageCount = 0;
line = "";
}
}