/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.tools.monitoring; import org.jboss.errai.bus.client.api.messaging.Message; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ActivityProcessor { private List<List<MessageMonitor>> messageMonitors = new ArrayList<List<MessageMonitor>>(20); private ThreadPoolExecutor workers; public ActivityProcessor() { messageMonitors = new ArrayList<List<MessageMonitor>>(20); workers = new ThreadPoolExecutor(2, Runtime.getRuntime().availableProcessors(), 30, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(500, false)); workers.setRejectedExecutionHandler(new RejectedExecutionHandler() { public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // just run on calling thread. r.run(); } }); } private void padList(int size) { for (int i = messageMonitors.size() - 1; i < size; i++) { messageMonitors.add(new ArrayList<MessageMonitor>(10)); } } public Handle registerEvent(EventType type, MessageMonitor monitor) { padList(type.ordinal()); messageMonitors.get(type.ordinal()).add(monitor); return new Handle(this, type, monitor); } public void notifyEvent(final long time, final EventType type, final SubEventType subType, final String fromBus, final String toBus, final String subject, final Message message, final Throwable error, final boolean replay) { workers.execute(new Runnable() { public void run() { MessageEvent evt = type == EventType.ERROR ? new MessageEvent() { public long getTime() { return time; } public SubEventType getSubType() { return subType; } public String getSubject() { return subject; } public String getFromBus() { return fromBus; } public String getToBus() { return toBus; } public Object getContents() { return error; } public boolean isReplay() { return replay; } } : new MessageEvent() { public long getTime() { return time; } public SubEventType getSubType() { return subType; } public String getSubject() { return subject; } public String getFromBus() { return fromBus; } public String getToBus() { return toBus; } public Object getContents() { return message; } public boolean isReplay() { return replay; } }; if (type.ordinal() > messageMonitors.size()) { return; } for (MessageMonitor monitor : messageMonitors.get(type.ordinal())) { monitor.monitorEvent(evt); } } }); } public class Handle { private ActivityProcessor processor; private EventType type; private MessageMonitor monitor; public Handle(ActivityProcessor processor, EventType type, MessageMonitor monitor) { this.processor = processor; this.type = type; this.monitor = monitor; } public void dispose() { processor.messageMonitors.get(type.ordinal()).remove(monitor); } } }