how tibco ems and kafka replay queue messages
1.Tibco EMS queue messages 可以通过GEMS操作copy,但最多只能读取1000条,可以用下列代码进行大量message压测
需要 tibjms.jar & tibjmsadmin.jar
App.java
import javax.jms.JMSException;
import com.tibco.tibjms.admin.TibjmsAdminException;
public class App {
public static void main(String[] args) throws TibjmsAdminException, JMSException {
EmsHelper emsHelper = new EmsHelper("tcp://localhost:7222",null,null);
String m_dest = "destqueue";
String m_from = "fromqueue";
int m_maxMsgs = 10000;
emsHelper.ShowConsumerInfos("testqueue");
emsHelper.CopyQueueMsgs(m_from,m_dest,m_maxMsgs);
emsHelper.Dispose();
}
}
EMSHelper.java
package com.example.tibco;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.stream.Collectors;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.QueueConnection;
import javax.jms.Session;
import javax.jms.TopicSubscriber;
import com.tibco.gems.GemsQueueBrowser;
import com.tibco.tibjms.Tibjms;
import com.tibco.tibjms.TibjmsQueueConnectionFactory;
import com.tibco.tibjms.admin.BridgeInfo;
import com.tibco.tibjms.admin.BridgeTarget;
import com.tibco.tibjms.admin.ConnectionFactoryInfo;
import com.tibco.tibjms.admin.ConnectionInfo;
import com.tibco.tibjms.admin.ConsumerInfo;
import com.tibco.tibjms.admin.QueueInfo;
import com.tibco.tibjms.admin.TibjmsAdmin;
import com.tibco.tibjms.admin.TibjmsAdminException;
import com.tibco.tibjms.admin.TibjmsAdminInvalidNameException;
// tibjms.jar & tibjmsadmin.jar
public class EmsHelper {
protected String m_url = "tcp://localhost:7222";
protected String m_user = "admin";
protected String m_password;
protected String m_dest = "testqueue";
protected String m_from = "testqueue";
protected String m_topic = "testqueue";
protected String m_logDir = "./log";
protected QueueConnection m_connection = null;
protected Session m_session = null;
protected MessageProducer m_msgProducer = null;
protected Destination m_jmsdest = null;
protected TopicSubscriber m_subscriber = null;
protected boolean m_noLocal = false;
protected QueueBrowser m_browser = null;
protected String m_selector = "";
protected Enumeration m_msgsEnum = null;
protected int m_maxMsgs = 10000;
protected TibjmsAdmin admin = null;
Map<Long, ConnectionInfo> connectionInfoMap = null;
//protected Map m_sslParams = new Hashtable();
public EmsHelper(String url , String user , String password) throws JMSException, TibjmsAdminException {
if(url!= null) this.m_url = url;
if(user!= null) this.m_user = user;
if(password!= null) this.m_password = password;
admin = new TibjmsAdmin(this.m_url,this.m_user, this.m_password);
/*
ConnectionFactoryInfo[] connectionFactories = admin.getConnectionFactories();
for(ConnectionFactoryInfo connInfo : connectionFactories) {
System.out.println("ConnectionFactoryInfo : "+connInfo.toString());
}
ConnectionInfo[] connectionInfos = admin.getSystemConnections();
for(ConnectionInfo connInfo : connectionInfos) {
System.out.println("ConnectionInfo : "+connInfo.toString());
}
*/
ConnectionInfo[] connectionInfos = admin.getConnections();
/*
for(ConnectionInfo connInfo : connectionInfos2) {
System.out.println("ConnectionInfo : "+connInfo.toString());
}
*/
java.util.List<ConnectionInfo> conns = Arrays.asList(connectionInfos);
connectionInfoMap = conns.stream().collect(Collectors.toMap(ConnectionInfo::getID, o->o));
}
private void ShowOutput(String msg) {
System.out.println(msg);
}
public void CopyQueueMsgs(String from,String dest,int size) throws JMSException {
if(from!= null) this.m_from = from;
if(dest!= null) this.m_dest = dest;
if(size>= 0) this.m_maxMsgs = size;
ShowOutput("Connecting to: " + this.m_url + "\n");
TibjmsQueueConnectionFactory tibjmsQueueConnectionFactory = new TibjmsQueueConnectionFactory(this.m_url, null, null);
this.m_connection = tibjmsQueueConnectionFactory.createQueueConnection(this.m_user, this.m_password);
this.m_connection.start();
this.m_session = this.m_connection.createSession(Session.AUTO_ACKNOWLEDGE);
this.m_msgProducer = this.m_session.createProducer(null);
this.m_msgProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
Queue queue = this.m_session.createQueue(this.m_from);
this.m_jmsdest = this.m_session.createQueue(this.m_dest);
m_selector = "";
//this.m_browser = this.m_session.createBrowser(queue, m_selector);
this.m_browser = this.m_session.createBrowser(queue);
this.m_msgsEnum = this.m_browser.getEnumeration();
ShowOutput("["+size+"]" + from +" -> "+ dest+ "\n" );
if (this.m_msgsEnum.hasMoreElements()) {
for (byte b = 0; b < this.m_maxMsgs; b++) {
Message message1 = (Message)this.m_msgsEnum.nextElement();
ShowOutput("Copying message: " + message1.getJMSMessageID() + "\n");
Message message2 = Tibjms.createFromBytes(Tibjms.getAsBytes(message1));
if (message1 != null) {
try {
this.m_msgProducer.send(this.m_jmsdest, message2, message1.getJMSDeliveryMode(), message1.getJMSPriority(), message1.getJMSExpiration());
ShowOutput("Message sent as: " + message2.getJMSMessageID() + "\n");
} catch (JMSException jMSException) {
System.err.println("Exception: " + jMSException.getMessage());
return;
}
}
}
}
}
public void ShowConsumerInfos(String queueName) throws TibjmsAdminException {
QueueInfo qi= new QueueInfo(queueName);
// ShowOutput(qi.toString());
//Queue queue = this.m_session.createQueue(queueName);
System.out.println("Queue : "+ queueName);
ConsumerInfo[] consumerInfos = this.admin.getConsumers(null,null,qi,false,0);
for (ConsumerInfo info : consumerInfos) {
System.out.println("getConnectionID : "+info.getConnectionID());
ConnectionInfo connInfo = connectionInfoMap.get(info.getConnectionID());
System.out.println("ConnectionInfo : "+connInfo.toString());
System.out.println("getDetails : "+info.getDetails().toString());
System.out.println("getPendingMessageCount : "+info.getPendingMessageCount());
}
}
public void ShowBridgeInfos() throws TibjmsAdminException {
TibjmsAdmin admin = new TibjmsAdmin(this.m_url,this.m_user, this.m_password);
BridgeInfo[] BridgeInfos = admin.getBridges();
for (BridgeInfo bridgeInfo : BridgeInfos) {
System.out.println(bridgeInfo.getName());
for (BridgeTarget bridgeTarget : bridgeInfo.getTargets()) {
System.out.println(bridgeTarget.getName());
}
}
}
public void clearMessages(String queueName) throws TibjmsAdminException, TibjmsAdminInvalidNameException{
TibjmsAdmin jmsAdmin = new TibjmsAdmin(this.m_url,this.m_user, this.m_password);
jmsAdmin.purgeQueue(queueName);
// alternatively purge all queues:
// jmsAdmin.purgeQueues(">");
}
public void Dispose() {
try {
if (this.m_session != null) {
this.m_session.close();
this.m_session = null;
}
if (this.m_connection != null) {
this.m_connection.close();
this.m_connection = null;
}
} catch (JMSException jMSException) {
System.err.println("Exception: " + jMSException.getMessage());
}
}
}
2.kafka 则可以用另一个group id重新消费,还可以指定offset
CustomConsumerSeek
package com.atguigu.kafka.consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.StringDeserializer;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Set;
public class CustomConsumerSeek {
public static void main(String[] args) {
// 0 配置信息
Properties properties = new Properties();
// 连接
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"kafka1:9092,kafka2:9093,kafka3:9094");
// 反序列化
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
// 组id
properties.put(ConsumerConfig.GROUP_ID_CONFIG,"test2");
// 1 创建消费者
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
// 2 订阅主题
ArrayList<String> topics = new ArrayList<>();
topics.add("par-topic");
kafkaConsumer.subscribe(topics);
// 指定位置进行消费
Set<TopicPartition> assignment = kafkaConsumer.assignment();
// 保证分区分配方案已经制定完毕
while (assignment.size() == 0){
kafkaConsumer.poll(Duration.ofSeconds(1));
assignment = kafkaConsumer.assignment();
}
// 指定消费的offset
for (TopicPartition topicPartition : assignment) {
kafkaConsumer.seek(topicPartition,5);
}
// 3 消费数据
while (true){
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1));
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
System.out.println(consumerRecord);
}
}
}
}
浙公网安备 33010602011771号