use of com.swiftmq.jms.TopicImpl in project swiftmq-ce by iitsoftware.
the class Copier method copyWithSelector.
private String[] copyWithSelector(String[] cmd) throws Exception {
int max = getMaxLimit(cmd);
int decr = max == Integer.MAX_VALUE ? 0 : 2;
StringBuffer b = new StringBuffer();
for (int i = 5; i < cmd.length - decr; i++) {
if (i > 5)
b.append(' ');
b.append(cmd[i]);
}
MessageSelector selector = new MessageSelector(b.toString());
selector.compile();
QueueReceiver receiver = ctx.queueManager.createQueueReceiver(cmd[1], null, selector);
QueuePullTransaction pullTx = receiver.createTransaction(false);
QueueSender sender = null;
QueueImpl targetQueueAddr = null;
if (cmd[2].equals("-queue")) {
sender = ctx.queueManager.createQueueSender(cmd[3], null);
targetQueueAddr = new QueueImpl(cmd[3]);
} else {
String qft = ctx.topicManager.getQueueForTopic(cmd[3]);
sender = ctx.queueManager.createQueueSender(qft, null);
targetQueueAddr = new TopicImpl(cmd[3]);
}
QueuePushTransaction pushTx = sender.createTransaction();
int cnt = 0;
try {
MessageEntry entry = null;
while ((entry = pullTx.getMessage(0, selector)) != null && cnt < max) {
MessageImpl msg = copyMessage(entry.getMessage());
msg.setJMSDestination(targetQueueAddr);
msg.setSourceRouter(null);
msg.setDestRouter(null);
pushTx.putMessage(msg);
cnt++;
pushTx.commit();
if (remove) {
pullTx.commit();
pullTx = receiver.createTransaction(false);
}
pushTx = sender.createTransaction();
}
} finally {
try {
pullTx.rollback();
} catch (Exception e) {
}
try {
receiver.close();
} catch (Exception e) {
}
try {
pushTx.rollback();
} catch (Exception e) {
}
try {
sender.close();
} catch (Exception e) {
}
}
return new String[] { TreeCommands.INFO, cnt + " messages processed." };
}
use of com.swiftmq.jms.TopicImpl in project swiftmq-ce by iitsoftware.
the class Subscription method processMessage.
@Override
public void processMessage(MessageEntry messageEntry) {
try {
QueuePullTransaction tx = consumer.createTransaction();
tx.moveToTransaction(messageEntry.getMessageIndex(), readTx);
String jmsTopicName = ((TopicImpl) messageEntry.getMessage().getJMSDestination()).getTopicName();
MqttQoS mqos = MqttQoS.valueOf(qos.value());
if (messageEntry.getMessage().propertyExists(Producer.PROP_QOS)) {
int pqos = messageEntry.getMessage().getIntProperty(Producer.PROP_QOS);
int sqos = qos.value();
if (sqos > pqos)
mqos = MqttQoS.valueOf(pqos);
}
session.getMqttConnection().getConnectionQueue().enqueue(new POSendMessage(jmsTopicName, messageEntry.getMessage(), mqos, tx, this));
incMsgsReceived(1);
} catch (Exception e) {
e.printStackTrace();
}
}
use of com.swiftmq.jms.TopicImpl in project swiftmq-ce by iitsoftware.
the class TransactedTopicSession method visit.
public void visit(CommitRequest req) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/visitCommitRequest");
CommitReply reply = (CommitReply) req.createReply();
reply.setOk(true);
try {
// first: produce all messages
List ml = req.getMessages();
ctx.incMsgsSent(ml.size());
req.setMessages(null);
long fcDelay = 0;
RingBuffer tempProducers = null;
for (int i = 0; i < ml.size(); i++) {
DataByteArrayInputStream dis = new DataByteArrayInputStream((byte[]) ml.get(i));
int producerId = dis.readInt();
int type = dis.readInt();
MessageImpl msg = MessageImpl.createInstance(type);
msg.readContent(dis);
dis.close();
long ttl = msg.getJMSExpiration();
if (ttl > 0)
msg.setJMSExpiration(System.currentTimeMillis() + ttl);
Producer producer = null;
if (producerId == -1) {
TopicImpl topic = (TopicImpl) msg.getJMSDestination();
if (topic.getType() != DestinationFactory.TYPE_TEMPTOPIC)
ctx.authSwiftlet.verifyTopicSenderSubscription(topic.getTopicName(), ctx.activeLogin.getLoginId());
producer = new TopicProducer(ctx, topic);
if (tempProducers == null)
tempProducers = new RingBuffer(8);
tempProducers.add(producer);
transactionManager.addTransactionFactory(producer);
} else {
producer = (Producer) producerList.get(producerId);
}
QueuePushTransaction transaction = producer.getTransaction();
transaction.putMessage(msg);
fcDelay = Math.max(fcDelay, transaction.getFlowControlDelay());
if (producerId == -1)
producer.markForClose();
}
// Next: do the commit
transactionManager.commit();
if (tempProducers != null) {
int size = tempProducers.getSize();
for (int i = 0; i < size; i++) {
((Producer) tempProducers.remove()).close();
}
}
reply.setDelay(fcDelay);
purgeMarkedProducers();
purgeMarkedConsumers();
} catch (Exception e) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/commit produced messages failed: " + e.getMessage());
reply.setOk(false);
reply.setException(e);
}
reply.send();
}
use of com.swiftmq.jms.TopicImpl in project swiftmq-ce by iitsoftware.
the class TransactedTopicSession method visit.
public void visit(CreateSubscriberRequest req) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/visitCreateSubscriberRequest");
CreateSubscriberReply reply = (CreateSubscriberReply) req.createReply();
try {
ctx.activeLogin.getResourceLimitGroup().incConsumers();
} catch (ResourceLimitException e) {
reply.setOk(false);
reply.setException(new JMSException(e.toString()));
reply.send();
return;
}
TopicImpl topic = req.getTopic();
String messageSelector = req.getMessageSelector();
boolean noLocal = req.isNoLocal();
try {
Entity subEntity = null;
if (subscriberEntityList != null)
subEntity = subscriberEntityList.createEntity();
int consumerId = 0;
TopicConsumer consumer = null;
if (topic.getType() == DestinationFactory.TYPE_TOPIC) {
consumerId = ArrayListTool.setFirstFreeOrExpand(consumerList, null);
consumer = new TopicConsumer(ctx, topic, messageSelector, noLocal);
consumerList.set(consumerId, consumer);
if (subEntity != null) {
Property prop = subEntity.getProperty("topic");
prop.setReadOnly(false);
prop.setValue(topic.getTopicName());
prop.setReadOnly(true);
prop = subEntity.getProperty("boundto");
prop.setReadOnly(false);
prop.setValue(topic.getQueueName());
prop.setReadOnly(true);
subEntity.setDynamicObject(consumer);
}
if (subEntity != null)
subEntity.setName(topic.getTopicName() + "-" + consumerId);
} else {
consumerId = ArrayListTool.setFirstFreeOrExpand(consumerList, null);
consumer = new TopicConsumer(ctx, topic, messageSelector, noLocal);
consumerList.set(consumerId, consumer);
if (subEntity != null)
subEntity.setDynamicObject(consumer);
if (subEntity != null) {
subEntity.setName(topic.getQueueName() + "-" + consumerId);
Property prop = subEntity.getProperty("temptopic");
prop.setReadOnly(false);
prop.setValue(new Boolean(true));
prop.setReadOnly(true);
prop = subEntity.getProperty("boundto");
prop.setReadOnly(false);
prop.setValue(topic.getQueueName());
prop.setReadOnly(true);
}
}
reply.setOk(true);
reply.setTopicSubscriberId(consumerId);
if (subEntity != null) {
Property prop = subEntity.getProperty("nolocal");
prop.setReadOnly(false);
prop.setValue(new Boolean(noLocal));
prop.setReadOnly(true);
subEntity.createCommands();
prop = subEntity.getProperty("selector");
if (messageSelector != null) {
prop.setValue(messageSelector);
}
prop.setReadOnly(true);
subscriberEntityList.addEntity(subEntity);
}
consumer.createReadTransaction();
// enlist it at the transaction manager
transactionManager.addTransactionFactory(consumer);
} catch (InvalidSelectorException e) {
ctx.activeLogin.getResourceLimitGroup().decConsumers();
ctx.logSwiftlet.logWarning("sys$jms", ctx.tracePrefix + "/CreateSubscriber has invalid Selector: " + e);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/CreateSubscriber has invalid Selector: " + e);
reply.setOk(false);
reply.setException(e);
} catch (Exception e1) {
ctx.activeLogin.getResourceLimitGroup().decConsumers();
ctx.logSwiftlet.logWarning("sys$jms", ctx.tracePrefix + "/Exception during create subscriber: " + e1);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/Exception during create subscriber: " + e1);
reply.setOk(false);
reply.setException(e1);
}
reply.send();
}
use of com.swiftmq.jms.TopicImpl in project swiftmq-ce by iitsoftware.
the class TransactedTopicSession method visit.
public void visit(CreateSubscriberRequest req) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/visitCreateSubscriberRequest");
CreateSubscriberReply reply = (CreateSubscriberReply) req.createReply();
try {
ctx.activeLogin.getResourceLimitGroup().incConsumers();
} catch (ResourceLimitException e) {
reply.setOk(false);
reply.setException(new JMSException(e.toString()));
reply.send();
return;
}
TopicImpl topic = req.getTopic();
String messageSelector = req.getMessageSelector();
boolean noLocal = req.isNoLocal();
try {
Entity subEntity = null;
if (subscriberEntityList != null)
subEntity = subscriberEntityList.createEntity();
int consumerId = 0;
TopicConsumer consumer = null;
if (topic.getType() == DestinationFactory.TYPE_TOPIC) {
consumerId = ArrayListTool.setFirstFreeOrExpand(consumerList, null);
consumer = new TopicConsumer(ctx, topic, messageSelector, noLocal);
consumerList.set(consumerId, consumer);
if (subEntity != null) {
Property prop = subEntity.getProperty("topic");
prop.setReadOnly(false);
prop.setValue(topic.getTopicName());
prop.setReadOnly(true);
prop = subEntity.getProperty("boundto");
prop.setReadOnly(false);
prop.setValue(topic.getQueueName());
prop.setReadOnly(true);
subEntity.setDynamicObject(consumer);
}
if (subEntity != null)
subEntity.setName(topic.getTopicName() + "-" + consumerId);
} else {
consumerId = ArrayListTool.setFirstFreeOrExpand(consumerList, null);
consumer = new TopicConsumer(ctx, topic, messageSelector, noLocal);
consumerList.set(consumerId, consumer);
if (subEntity != null)
subEntity.setDynamicObject(consumer);
if (subEntity != null) {
subEntity.setName(topic.getQueueName() + "-" + consumerId);
Property prop = subEntity.getProperty("temptopic");
prop.setReadOnly(false);
prop.setValue(new Boolean(true));
prop.setReadOnly(true);
prop = subEntity.getProperty("boundto");
prop.setReadOnly(false);
prop.setValue(topic.getQueueName());
prop.setReadOnly(true);
}
}
reply.setOk(true);
reply.setTopicSubscriberId(consumerId);
if (subEntity != null) {
Property prop = subEntity.getProperty("nolocal");
prop.setReadOnly(false);
prop.setValue(new Boolean(noLocal));
prop.setReadOnly(true);
subEntity.createCommands();
prop = subEntity.getProperty("selector");
if (messageSelector != null) {
prop.setValue(messageSelector);
}
prop.setReadOnly(true);
subscriberEntityList.addEntity(subEntity);
}
consumer.createReadTransaction();
// enlist it at the transaction manager
transactionManager.addTransactionFactory(consumer);
} catch (InvalidSelectorException e) {
ctx.activeLogin.getResourceLimitGroup().decConsumers();
ctx.logSwiftlet.logWarning("sys$jms", ctx.tracePrefix + "/CreateSubscriber has invalid Selector: " + e);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/CreateSubscriber has invalid Selector: " + e);
reply.setOk(false);
reply.setException(e);
} catch (Exception e1) {
ctx.activeLogin.getResourceLimitGroup().decConsumers();
ctx.logSwiftlet.logWarning("sys$jms", ctx.tracePrefix + "/Exception during create subscriber: " + e1);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace("sys$jms", ctx.tracePrefix + "/Exception during create subscriber: " + e1);
reply.setOk(false);
reply.setException(e1);
}
reply.send();
}
Aggregations