Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何监视多个JMS队列_Java_Multithreading_Queue_Jms - Fatal编程技术网

Java 如何监视多个JMS队列

Java 如何监视多个JMS队列,java,multithreading,queue,jms,Java,Multithreading,Queue,Jms,我的应用程序需要监视多个JMS队列 如何做到这一点? 开始两个线程? 是否可以同时监视两个队列 一个队列的示例代码: ... queue1 = session.createQueue("queue-1"); consumer = session.createConsumer(queue1); connection.start(); while (true) { Message m = consumer.receive(10000); if (m == null) {

我的应用程序需要监视多个JMS队列

如何做到这一点? 开始两个线程? 是否可以同时监视两个队列

一个队列的示例代码:

...
queue1 = session.createQueue("queue-1");
consumer = session.createConsumer(queue1);

connection.start();

while (true) {
    Message m = consumer.receive(10000);

    if (m == null) {
        ...nothing...
    } else {
        ...do something with the message...
    }
}
...

我应该如何观看队列1和队列2?

您可以使用quartz scheduler进行此操作。执行一个(或多个)quartz作业,如下所示:

public class MessageReaderJob1 implements Job {
private QueueReader1 qr;
@Override
public synchronized void execute(JobExecutionContext arg0) throws JobExecutionException {
    qr = QueueReader1.getInstance();

    try {
        Message message = qr.getConsumer().receiveNoWait();
        ....
    }
}
public class QueueReader1 {

private MessageConsumer consumer = null;
private Context jndiContext = null;
private QueueConnectionFactory queueConnectionFactory = null;
private QueueConnection queueConnection = null;
private QueueSession queueSession = null;
private Queue queue = null;

private static final QueueReader instance = new QueueReader();

public synchronized static QueueReader getInstance() {
    return instance;
}

private QueueReader() {

    /*
     * Create a JNDI API InitialContext object if none exists
     * yet.
     */
     try {
        jndiContext = new InitialContext();


    } catch (NamingException e) {
        System.err.println(e.getMessage())
        System.exit(1);
    }

    /*
     * Look up connection factory and queue.  If either does
     * not exist, exit.
     */
    try {
        queueConnectionFactory = (QueueConnectionFactory) jndiContext.lookup("connection_factory_name");
        queue = (Queue) jndiContext.lookup("queue_name");
        queueConnection =
                queueConnectionFactory.createQueueConnection();
        queueSession =
                queueConnection.createQueueSession(false,
                Session.AUTO_ACKNOWLEDGE);

        consumer = queueSession.createConsumer(queue);

        queueConnection.start();

    } catch (JMSException ex) {
         System.err.println(ex.getMessage());
    } catch (NamingException e) {
         System.err.println(e.getMessage());
    }
}

}
然后,您需要一个从应用程序(主方法或servlet)运行的调度器,请注意,您还可以为第二个队列实现不同的触发器:

public class TestCasesSchedule {

private Scheduler scheduler;

public void createSchedule() {
    JobDetail job1 = JobBuilder.newJob(MessageReaderJob1.class)
            .withIdentity("jobname", Scheduler.DEFAULT_GROUP)
            .build();

    JobDetail job2 = JobBuilder.newJob(MessageReaderJob2.class)
            .withIdentity("jobname", Scheduler.DEFAULT_GROUP)
            .build();

    Trigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("minutestrigger", "triggergroup")
            .startNow()
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMinutes(5)
                    .repeatForever())
            .build();

    try {
        SchedulerFactory sf = new StdSchedulerFactory();
        scheduler = sf.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job1, trigger);
        scheduler.scheduleJob(job2, trigger);
    } catch (SchedulerException se) {
        System.err.println(se.getMessage())
    }
}
其中一个队列的QueueReader如下所示:

public class MessageReaderJob1 implements Job {
private QueueReader1 qr;
@Override
public synchronized void execute(JobExecutionContext arg0) throws JobExecutionException {
    qr = QueueReader1.getInstance();

    try {
        Message message = qr.getConsumer().receiveNoWait();
        ....
    }
}
public class QueueReader1 {

private MessageConsumer consumer = null;
private Context jndiContext = null;
private QueueConnectionFactory queueConnectionFactory = null;
private QueueConnection queueConnection = null;
private QueueSession queueSession = null;
private Queue queue = null;

private static final QueueReader instance = new QueueReader();

public synchronized static QueueReader getInstance() {
    return instance;
}

private QueueReader() {

    /*
     * Create a JNDI API InitialContext object if none exists
     * yet.
     */
     try {
        jndiContext = new InitialContext();


    } catch (NamingException e) {
        System.err.println(e.getMessage())
        System.exit(1);
    }

    /*
     * Look up connection factory and queue.  If either does
     * not exist, exit.
     */
    try {
        queueConnectionFactory = (QueueConnectionFactory) jndiContext.lookup("connection_factory_name");
        queue = (Queue) jndiContext.lookup("queue_name");
        queueConnection =
                queueConnectionFactory.createQueueConnection();
        queueSession =
                queueConnection.createQueueSession(false,
                Session.AUTO_ACKNOWLEDGE);

        consumer = queueSession.createConsumer(queue);

        queueConnection.start();

    } catch (JMSException ex) {
         System.err.println(ex.getMessage());
    } catch (NamingException e) {
         System.err.println(e.getMessage());
    }
}

}

这是我的解决方案。它起作用了。欢迎任何额外的建议

主要类别:

public class Notifier {
    public static void main(String[] args) throws Exception {
        // Start a thread for each JMQ queue to monitor.
        DestinationThread destination1 = new DestinationThread("queue1");
        DestinationThread destination2 = new DestinationThread("queue2");
        destination1.start();
        destination2.start();
    }
}
线程:

public class DestinationThread extends Thread {

    private String destinationQueue;

    private static ActiveMQConnectionFactory connectionFactory = null;
    private static Connection connection = null;
    private static Session session = null;
    private static Destination destination = null;
    private static MessageConsumer consumer = null;

    public DestinationThread(String destinationQueue) {
        this.destinationQueue = destinationQueue;
    }

    @Override
    public void run() {
        try {
                initializeThread(destinationQueue);
                startThread(destinationQueue);
        } catch (Exception e) {
            //TODO
        }
    }

    private void initializeThread(String destinationQueue) {
        boolean connectionMade = false;
        while (!connectionMade) {
            try {
                connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
                connection = connectionFactory.createConnection();
                connection.start();
                session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
                destination = session.createQueue(destinationQueue);
                consumer = session.createConsumer(destination);
                connectionMade = true;
            } catch (JMSException e) {
                //TODO
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException ie) {
                }
            }
        }
    }


    private void startThreadOther(String destinationQueue) throws Exception {
        while (true) {
            try {
                Message message = consumer.receive(300000);
                if (message == null) {
                    //No message received for 5 minutes - Re-initializing the connection
                    initializeThread(destinationQueue);
                } else if (message instanceof TextMessage) {
                    if (destinationQueue.equals("queue1") {
                        //Message received from queue1 - do something with it
                    } else if (destinationQueue.equals("queue2") {
                        //Message received from queue2 - do something with it
                    } else {
                        //nothing
                    }
                } else {
                    //nothing
                }
            } catch (Exception e) {
                //TODO
            }
        }
    }
}

您研究过JMXAPI吗?我对API和实现有基本的了解。一个队列上有多个客户端,但无法轻松找到如何将一个客户端连接到多个队列上的信息。您能否编写一个以队列名称为参数的队列接收器,然后在
main
(或等效方法)中,分别使用构造函数参数“queue-1”和“queue-2”创建两个实例?我可以使用参数并创建多个实例。但必须对这两个队列进行监控。我应该启动不同的线程吗?