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

  

  

posted on 2022-02-22 22:11  白马酒凉  阅读(99)  评论(0编辑  收藏  举报

导航