activeMQ 试用

项目需求,需要使用activeMQ进行数据同步。

百度搜索一些资料。尝试写个DEMO

不适用任何框架。

先登录MQ地址添加消息队列。

队列名称 test.queuq

编辑mq.properties

mq.queue = test.queue
mq.url = tcp://xxx.xxx.xxx.xxx:61616

 消息发送者代码:

import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory;

 

public class TestSender {     private static final int SEND_NUMBER = 1;

    public static void main(String[] args) {         // ConnectionFactory :连接工厂,JMS 用它创建连接         ConnectionFactory connectionFactory;         // Connection :JMS 客户端到JMS Provider 的连接         Connection connection = null;         // Session: 一个发送或接收消息的线程         Session session;         // Destination :消息的目的地;消息发送给谁.         Destination destination;         // MessageProducer:消息发送者         MessageProducer producer;         // TextMessage message;         // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar         connectionFactory = new ActiveMQConnectionFactory(                 ActiveMQConnection.DEFAULT_USER,                 ActiveMQConnection.DEFAULT_PASSWORD,                 "tcp://172.16.40.80:61616");         try {             // 构造从工厂得到连接对象             connection = connectionFactory.createConnection();             // 启动             connection.start();             // 获取操作连接             session = connection.createSession(Boolean.TRUE,                     Session.AUTO_ACKNOWLEDGE);             // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置             destination = session.createQueue("test.queue");             // 得到消息生成者【发送者】             producer = session.createProducer(destination);             // 设置不持久化,此处学习,实际根据项目决定             producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);             // 构造消息,此处写死,项目就是参数,或者方法获取             sendMessage(session, producer);             session.commit();         } catch (Exception e) {             e.printStackTrace();         } finally {             try {                 if (null != connection)                     connection.close();             } catch (Throwable ignore) {             }         }     }

    public static void sendMessage(Session session, MessageProducer producer)             throws Exception {      String msg = "[{\"modelId\": \"00000001\",\"model\": \"熊猫\"},{\"modelId\":\"00000006\" ,\"model\":\"土豆\"}]";         for (int i = 1; i <= SEND_NUMBER; i++) {             TextMessage message = session                     .createTextMessage(msg);             // 发送消息到目的地方             System.out.println("[{\"modelId\": \"00000001\",\"model\": \"熊猫\"},{\"modelId\":\"00000006\" ,\"model\":\"土豆\"}]");             producer.send(message);         }     }

消息接收者,这里使用messageListener

 

import javax.jms.Connection; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import com.mig.encrypt.dao.impl.SyncInDB; import com.mig.encrypt.pojo.BaseEntity; import com.mig.encrypt.util.config.MqConfig;

 

public class MqUtil<T extends BaseEntity> implements MessageListener {

 

 static Logger logger = LoggerFactory.getLogger(MqUtil.class);

 

 private String user = ActiveMQConnection.DEFAULT_USER;

 private String password = ActiveMQConnection.DEFAULT_PASSWORD;

 private String url = MqConfig.getInstance().getConfigItem("mq.url");

 private String subject = MqConfig.getInstance().getConfigItem("mq.queue");

 private Destination destination = null;

 private Connection connection = null;

 private Session session = null;

 private MessageConsumer consumer = null;

 private Class<?> z;

//构造,传入POJO

 public MqUtil(Class<?> z) {   this.z = z;  }

 private void initialize() throws JMSException, Exception {

  logger.debug("MqUtil - [initialize]: initialize is begin");

  // 连接工厂是用户创建连接的对象,这里使用的是ActiveMQ的ActiveMQConnectionFactory根据url,username和password创建连接工厂。   ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(     user, password, url);   // 连接工厂创建一个jms connection   connection = connectionFactory.createConnection();   // 是生产和消费的一个单线程上下文。会话用于创建消息的生产者,消费者和消息。会话提供了一个事务性的上下文。   session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 不支持事务   // 目的地是客户用来指定他生产消息的目标还有他消费消息的来源的对象,两种消息传递方式:点对点和发布/订阅   destination = session.createQueue(subject);   // 会话创建消息的生产者将消息发送到目的地   consumer = session.createConsumer(destination);

  logger.debug("MqUtil - [initialize]: initialize is end");  }

 public void close() throws JMSException {   logger.debug("MqUtil - [close]: close is begin");   if (consumer != null) {    consumer.close();   }   if (session != null) {    session.close();   }   if (connection != null) {    connection.close();   }   logger.debug("MqUtil - [close]: close is end");  }

 // 消费消息  public void handleMessage() throws JMSException, Exception {   logger.debug("MqUtil - [handleMessage]: handleMessage is begin");   initialize();   connection.start();

  // 开始监听   consumer.setMessageListener(this);

  logger.debug("MqUtil - [handleMessage]: handleMessage is end");  }

 @Override  public void onMessage(Message message) {    logger.debug("MqUtil - [onMessage]: onMessage is begin");   try {    if (message instanceof TextMessage) {     TextMessage txtMsg = (TextMessage) message;     String msg = txtMsg.getText();     logger.debug("MqUtil - [onMessage]: message is " + msg);     new SyncInDB().syncContent(msg, z);    } else {    }   } catch (JMSException e) {    logger.error("MqUtil - [onMessage]: JMSException catched : "      + e.getMessage());   }    logger.debug("MqUtil - [onMessage]: onMessage is end");  }

}

 
服务器启动时,开始监听消息

<listener>   <listener-class>    com.test.listener.ServerListener   </listener-class>  </listener>

serverListener代码,启动时开始监听,服务结束时关闭连接。
 

import javax.jms.JMSException; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;

import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import com.mig.encrypt.pojo.MigModel; import com.mig.encrypt.util.MqUtil;

 

public class ServerListener implements ServletContextListener {

 

 Logger logger = LoggerFactory.getLogger(ServerListener.class);

 

 private MqUtil<MigModel> mqUtil = new MqUtil<MigModel>(MigModel.class);

 

 @Override  public void contextDestroyed(ServletContextEvent arg0) {   logger.debug("ServerListener - [contextDestroyed]: contextDestroyed is begin,server is down,listener is down");   try {    mqUtil.close();   } catch (JMSException e) {    logger.error("ServerListener - [contextDestroyed]: JMSException catched : "      + e.getMessage());   }   logger.debug("ServerListener - [contextDestroyed]: contextDestroyed is end");  }

 @Override  public void contextInitialized(ServletContextEvent arg0) {   logger.debug("ServerListener - [contextInitialized]: contextInitialized is begin,server is begin,listener is begin");   try {    mqUtil.consumeMessage();   } catch (JMSException e) {    logger.error("ServerListener - [contextInitialized]: JMSException catched : "      + e.getMessage());   } catch (Exception e) {    logger.error("ServerListener - [contextInitialized]: Exception catched : "      + e.getMessage());   }   logger.debug("ServerListener - [contextInitialized]: contextInitialized is end");  }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值