ActiveMQ代码示例

ActiveMQ 注意用5.11版本,5.12与spring有冲突

ActiveMQTest:

测试类示例

package com.igeek.test.jedis;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import javax.jms.*;
import java.io.IOException;

public class ActiveMQTest {


    /**
     * PTP(点对点)
     */
    //生产者
    public void producer_queue() throws JMSException {
//        第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");//192.168.8.101:8161
//        第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
        Connection connection = connectionFactory.createConnection();
//        第三步:开启连接,调用 Connection 对象的 start 方法。
        connection.start();
//        第四步:使用 Connection 对象创建一个 Session 对象。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
//        第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
        Queue queue = session.createQueue("test_queue");//参数:给队列设置名称
//        第六步:使用 Session 对象创建一个 Producer 对象。
        MessageProducer producer = session.createProducer(queue);
//        第七步:创建一个 Message 对象,创建一个 TextMessage 对象。
        TextMessage message = new ActiveMQTextMessage();
        message.setText("hello queue...message03");
//        第八步:使用 Producer 对象发送消息。
        producer.send(message);
//        第九步:关闭资源。
        session.close();
        connection.close();

    }

    //消费者

    public void consumer_queue() throws JMSException, IOException {

//        第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
//        第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
        Connection connection = connectionFactory.createConnection();
//        第三步:开启连接,调用 Connection 对象的 start 方法。
        connection.start();
//        第四步:使用 Connection 对象创建一个 Session 对象。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
//        第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
        Queue queue = session.createQueue("test_queue");//参数:给队列设置名称
//        第六步:使用 Session 对象创建一个 Consumer 对象。
        MessageConsumer cosumer = session.createConsumer(queue);

//        第七步:使用 Consumer 对象消费消息。
        cosumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {

                TextMessage _message = (TextMessage) message;
                try {
                    System.out.println("消费者接收到消息..."+_message.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });


        System.in.read();

//        第八步:关闭资源。
        session.close();
        connection.close();

    }

    /**
     * Topic(发布/订阅)
     */
    //生产者

    public void producer_topic() throws JMSException {
//        第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
//        第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
        Connection connection = connectionFactory.createConnection();
//        第三步:开启连接,调用 Connection 对象的 start 方法。
        connection.start();
//        第四步:使用 Connection 对象创建一个 Session 对象。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
//        第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Topic对象。
        Topic topic = session.createTopic("test-topic");//参数:给队列设置名称
//        第六步:使用 Session 对象创建一个 Producer 对象。
        MessageProducer producer = session.createProducer(topic);
//        第七步:创建一个 Message 对象,创建一个 TextMessage 对象。
        TextMessage message = new ActiveMQTextMessage();
        message.setText("hello topic...message03");
//        第八步:使用 Producer 对象发送消息。
        producer.send(message);
//        第九步:关闭资源。
        session.close();
        connection.close();

    }

    //消费者

    public void consumer_topic() throws JMSException, IOException {

//        第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
//        第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
        Connection connection = connectionFactory.createConnection();
//        第三步:开启连接,调用 Connection 对象的 start 方法。
        connection.start();
//        第四步:使用 Connection 对象创建一个 Session 对象。
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
//        第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
        Topic topic = session.createTopic("test-topic");//参数:给队列设置名称
//        第六步:使用 Session 对象创建一个 Consumer 对象。
        MessageConsumer cosumer = session.createConsumer(topic);

//        第七步:使用 Consumer 对象消费消息。
        cosumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {

                TextMessage _message = (TextMessage) message;
                try {
                    System.out.println("消费者接收到消息..."+_message.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });


        System.in.read();

//        第八步:关闭资源。
        session.close();
        connection.close();

    }

    /**
     * Spring与ActiveMQ整合测试
     */
    //@Test
    public void test_spring_activeMq(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
        JmsTemplate jmsTemplate = ac.getBean(JmsTemplate.class);
        Destination destination = (Destination) ac.getBean("topicDestination");
        jmsTemplate.send(destination, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = new ActiveMQTextMessage();
                message.setText("hello...");
                return message;
            }
        });//参数:1.目的地 2.消息创建器
    }


}

与Spring整合的配置文件:

发送消息:

applicationContext-activemq.xml





	
	
		
	

	
	
		
		
	


	
	
		
		
	

	
	
		
	

	
	
		
			spring-queue
		
	
	
	
		
	






 

ItemServiceImpl 业务层应用

package com.igeek.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.igeek.mapper.TbItemMapper;
import com.igeek.pojo.TbItem;
import com.igeek.pojo.TbItemDesc;
import com.igeek.service.ItemDescService;
import com.igeek.service.ItemService;
import com.igeek.util.DataGridResult;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.jms.*;
import java.util.Date;
import java.util.List;
@Service
public class ItemServiceImpl implements ItemService {
    @Autowired
    private TbItemMapper tbItemMapper;

    @Autowired
    private ItemDescService itemDescService;

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    @Qualifier("addItemDestination")
    private Topic topic;
    @Override
    public List selectItems() {


        return tbItemMapper.selectAll();
    }

    @Override
    public DataGridResult selectItemsByPage(Long page, Long rows) {

        DataGridResult result = new DataGridResult();

        //设置页码 以及 每页条数
        PageHelper.startPage(page.intValue(),rows.intValue());

        //查询所有
        List tbItems = tbItemMapper.selectAll();

        //真正的查询操作
        /*
        查询对象:
        pageInfo.getList() 每页的数据
        pageInfo.getPages() 总页数
        ...
         */
        PageInfo pageInfo = new PageInfo<>(tbItems);

        //result.setRows(rows);
        result.setTotal(pageInfo.getTotal());
        result.setRows(pageInfo.getList());

        return result;
    }
    //事务传播行为
    @Override
    public int addItem(TbItem item,String desc) {//开启事务
        tbItemMapper.insert(item);
        //封装商品描述对象
        TbItemDesc itemDesc = new TbItemDesc();
        itemDesc.setItemId(item.getId());
        itemDesc.setItemDesc(desc);
        itemDesc.setCreated(new Date());
        itemDesc.setUpdated(itemDesc.getCreated());
        //int i = 10/0;
        //保存描述对象
        itemDescService.addItemDesc(itemDesc);

        //发送消息
        jmsTemplate.send(topic, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = new ActiveMQTextMessage();
                message.setText(item.getId()+"");//发送消息(消息内容:商品id)
                return message;
            }
        });
        return 1;
    }

    @Override
    public void updateItem(TbItem item, String desc) {
        //设置更新时间
        item.setUpdated(new Date());
        //设置不需要更新的字段值为null
        item.setCreated(null);
        item.setStatus(null);
        tbItemMapper.updateByPrimaryKeySelective(item);//status->0 create->null  Selective:选择性更新,如果为null不更新

        TbItemDesc itemDesc = new TbItemDesc();
        itemDesc.setItemId(item.getId());
        itemDesc.setItemDesc(desc);
        itemDescService.updateItemDesc(itemDesc);

    }

    @Override
    public TbItem selectItemById(Long id) {
        //加缓存  ITEM_CACHE->(id+"INFO"=内容)
        return tbItemMapper.selectByPrimaryKey(id);
    }
}

 

接收消息:

创建监听器:

package com.igeek.search.listener;

import com.igeek.search.service.SearchItemService;
import org.apache.solr.client.solrj.SolrServerException;
import org.springframework.beans.factory.annotation.Autowired;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.io.IOException;

/**
 * ActiveMQ消息监听器(商品添加)
 */
public class ItemAddMessageListener implements MessageListener {
    @Autowired
    private SearchItemService searchItemService;
    @Override
    public void onMessage(Message message) {
        TextMessage _message = (TextMessage)message;
        try {
            String text = _message.getText();//商品ID

            //根据商品ID获取商品信息 同步索引库
            Thread.sleep(200);//确保数据保存到数据库
            searchItemService.addItem(Long.parseLong(text));
        } catch (JMSException e) {
            e.printStackTrace();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

配置监听器:

applicationContext-activemq.xml

ActiveMQ代码示例_第1张图片





	
	
		
	

	
	
		
		
	


	
	
		
		
	

	
	
		
	

	
	
	
	
		
		
		
	











 

你可能感兴趣的:(java)