/ / SEVERE: No se pudo enviar el evento: Eventbus com.google.common.eventbus.SubscriberExceptionContext - java, spring, guava

SEVERE: No se pudo enviar el evento: Eventbus com.google.common.eventbus.SubscriberExceptionContext - java, spring, guava

Para EventBus, fusioné el código dentro de mi aplicación java Spring y tengo el control total, pero el resultado no cambió.

Cuando ejecuto The EventBus en spring sts (javaw), no hay ningún problema, pero cuando ejecuto en el servidor con java -jar project.jar, aparece el mismo SEVERE: No se pudo enviar el evento: error

El siguiente no funcionó para mí ..

package edu.uams.event;

import java.awt.EventQueue;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.Executor;

import org.apache.log4j.Logger;

import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventHandler;
import com.google.common.eventbus.SubscriberExceptionHandler;


import edu.uams.domain.TirEvent;
import edu.uams.pacs.IncomingFileMonitor;

public class AysncTraumaEventBus extends AsyncEventBus {

private final static Logger logger = Logger.getLogger(AysncTraumaEventBus.class);
private String name = null;

public AysncTraumaEventBus(Executor executor,
SubscriberExceptionHandler subscriberExceptionHandler) {
super(executor, subscriberExceptionHandler);

logger.info("AysncTraumaEventBus created.");
}

public AysncTraumaEventBus(String name, Executor executor) {
super(name,executor);
this.name=name;
logger.info("AysncTraumaEventBus created. Name:"+this.name);
}

@Override
public void register(Object object) {
super.register(object);
}

@Override
public void unregister(Object object) {
super.unregister(object);
}

@Override
public void dispatch(Object event, EventHandler wrapper) {
try {
logger.info("Let"s dispatch Aysnchroneous Trauma Event:"+ ((TirEvent) event).getResultMessage());
wrapper.handleEvent(event);
} catch (InvocationTargetException e) {
// My logger
logger.error("Could not dispatch event: " + event + " to handler " + wrapper+"  e:"+e.getMessage());
logger.info("Lets try to disptach again!");
super.post(new ExceptionEvent(event, e));
}
}


public static final class ExceptionEvent {
public final Object event;
public final InvocationTargetException exception;

public ExceptionEvent(final Object event, final InvocationTargetException exception) {
this.event = event;
this.exception = exception;
}
}

}

De alguna manera, EventHandler no puede invocar el evento objetivo.

wrapper.handleEvent (evento);

Cuando miras la envoltura (EventHandler):

public void handleEvent(Object event) throws InvocationTargetException {
checkNotNull(event);
try {
method.invoke(target, new Object[] { event });
} catch (IllegalArgumentException e) {
throw new Error("Method rejected target/argument: " + event, e);
} catch (IllegalAccessException e) {
throw new Error("Method became inaccessible: " + event, e);
} catch (InvocationTargetException e) {
if (e.getCause() instanceof Error) {
throw (Error) e.getCause();
}
throw e;
}
}

Ves ese method.invoke (target, new Object [] {event}); lanza la InvocationTargetException desde la clase Method.class

public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException
{
if (!override) {
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
Class<?> caller = Reflection.getCallerClass(1);

checkAccess(caller, clazz, obj, modifiers);
}
}
MethodAccessor ma = methodAccessor;             // read volatile
if (ma == null) {
ma = acquireMethodAccessor();
}
return ma.invoke(obj, args);
}

De alguna manera no se puede invocar .. Pero la parte más interesante es que el mismo archivo jar junto con EventBus puede ejecutarse bien en STS Run (javaw), pero cuando ejecuto java desde la línea de comandos como java -jar project.jar, no se puede distribuir el evento.

Respuestas

11 para la respuesta № 1
@Subscribe
@AllowConcurrentEvents
public void receivedDicomFile(TirEvent event){

try {



} catch (ClassNotFoundException e) {
logger.error(e.getMessage());
} catch (SQLException e) {
logger.error(e.getMessage());
} catch(Exception e){
logger.error(e.getMessage());
}



}

Siempre necesita una captura de prueba ... Gracias a @dwnz por tu ayuda