vaniglia 源码学习(五)

本文介绍了一个名为vanigliamessagequene的消息队列系统实现,它支持多种存储方式如内存、文件系统和数据库,并详细展示了如何通过Java代码创建消息队列、配置消息存储类型、启动队列及发布消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vaniglia message quene特性主要实现一个消息队列,功能如下:

public class Main {

    private static final Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws MessageQueueException {
        MessageQueue queue = MessageQueue.getQueue("MyQueue", MessageStorageType.MemoryType,
                MessageStorageParameters.createMemoryStorageParameters("MyStorage", 1000));

        queue.start();

        queue.subscribe(new MyQueueListener());

        MyQueuePublisher myQueuePublisher = new MyQueuePublisher(queue);
        Thread publishingThread = new Thread(myQueuePublisher);
        publishingThread.setDaemon(true);
        logger.info("Starting the publisher.");
        publishingThread.start();

        queue.stop();
    }
}

MessageQueue 通过getQueue产生一个消息队列,参数MessageStorageType设定消息的存储类型(内存、文件、数据库等),MessageStorageParameters存储存储类型的参数。

其中MyQueueListner为消息监听器(用户继承接口实现),有消息在队列中时触发处理。myQueuePublisher是消息写入线程,通过调用MessageQueue的push接口向队列中填入消息。主要的类图有两部分:

一部分是MessageStorageType:

 

二.消息队列的业务

在MesssageQueue中启动Timer线程,调用MessageQueueProcessingTask,如下:

 

    public void start(long interval) throws MessageQueueException {
        if (timerThread == null) {
            logger.info("Starting queue "+name+" with processing interval = "+interval+"ms");
            timerThread = new Timer(true);
            processingTask = new MessageQueueProcessingTask(this);
            timerThread.scheduleAtFixedRate(processingTask, interval, interval);
        }
        else {
            throw new MessageQueueException("Queue "+name+" already running.");
        }
    }

 

 

 

比较值得学习的代码有:

public abstract class MessageStorageParameters {

    public static class MemoryStorageParameters extends MessageStorageParameters {
        private long size;
        public MemoryStorageParameters(String name, long size) {
            super(name);
            this.size = size;
        }
        public long getSize() {
            return size;
        }
    }
    public static class FileSystemStorageParameters extends MessageStorageParameters {
        private String basedir;

        public FileSystemStorageParameters(String name) {
            super(name);
        }
        public FileSystemStorageParameters(String name, String basedir) {
            super(name);
            this.basedir = basedir;
        }
        public String getBasedir() {
            return basedir;
        }
    }
    public static class JDBCStorageParameters extends MessageStorageParameters {
        public JDBCStorageParameters(String name) {
            super(name);
        }
    }
    /**
     * Creates a Memory Storage Parameters given its name and size limit.
     *
     * @param name the storage name
     * @param size the storage size limit or -1 to avoid size limit checking.
     *
     * @return the newly created MemoryStorageParameters object
     */
    public static MessageStorageParameters createMemoryStorageParameters(String name, long size) {
        return new MemoryStorageParameters(name, size);
    }
    /**
     * Creates a FileSystem Storage Paramters given its name and basedir.
     *
     * @param name the storage name
     * @param basedir the storage basedir
     *
     * @return the newly create FileSystemStorageParamters object
     */
    public static MessageStorageParameters createFileSystemStorageParameters(String name, String basedir) {
        return new FileSystemStorageParameters(name, basedir);
    }

    /**
     * Creates a FileSystem Storage Paramters given its name.
     *
     * @param name the storage name
     *
     * @return the newly create FileSystemStorageParamters object
     */
    public static MessageStorageParameters createFileSystemStorageParameters(String name) {
        return new FileSystemStorageParameters(name);
    }
    public static MessageStorageParameters createJDBCStorageParameters(String name) {
        return new JDBCStorageParameters(name);
    }
    protected String name;
    protected MessageStorageParameters(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

 

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/04/03/2997659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值