我是第一次基于JMS API开发应用程序,并在将多个消息发送到同一队列时获得以下异常。对于每个消息,我使用相同的连接和队列资源,我不使用单独的用户事务。对于每个消息,在发送消息之后创建并关闭新会话。以下示例显示了发送消息的方法。有谁知道,我做错了什么。以下帖子JMS Exception处理类似的问题,但不能将MessageDriven Bean声明为无状态。如果只发送一条消息,一切正常。感谢您的回复
@Resource(lookup=NAME_CONNECTION_FACTORY)
private ConnectionFactory connectionFactory;
@Resource(lookup=NAME_QUEUE_CALCULATE)
private Queue queueCalculate;
public void send(Destination destination, List<RequestObject> lstRequestObjectList) throws ExceptionJavaMessageQueue {
try {
if(destination == null) {
throw new IllegalArgumentException("message could not be send because of missing destination");
}
for(RequestObject currentRequestObject : lstRequestObject) {
final Session session = this.createSession();
final MessageProducer producer = session.createProducer(destination);
ObjectMessage objectMessage = session.createObjectMessage(currentRequestObject);
producer.send(objectMessage);
session.close();
}
} catch (JMSException e) {
Logger.getLogger(super.getClass().getName()).log(Level.SEVERE, "error while sending JMS Message", e);
throw new ExceptionJavaMessageQueue("error while sending JMS Message");
} catch (SecurityException e) {
Logger.getLogger(super.getClass().getName()).log(Level.SEVERE, "error while sending JMS Message", e);
throw new ExceptionJavaMessageQueue("error while sending JMS Message");
} catch (IllegalStateException e) {
Logger.getLogger(super.getClass().getName()).log(Level.SEVERE, "error while sending JMS Message", e);
throw new ExceptionJavaMessageQueue("error while sending JMS Message");
}
}
Caused by: javax.ejb.EJBException: java.lang.IllegalStateException: EJB is already associated with an incomplete transaction
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:2004)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
at com.sun.proxy.$Proxy423.getEntityManager(Unknown Source)
at de.sanctionlist.database.dao.__EJB31_Generated__Database__Intf____Bean__.getEntityManager(Unknown Source)
at de.sanctionlist.database.dao.DataAccessObject.createNamedQuery(DataAccessObject.java:115)
at de.sanctionlist.database.dao.DAOEntityJob.findByCheckId(DAOEntityJob.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
at sun.reflect.GeneratedMethodAccessor371.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
at sun.reflect.GeneratedMethodAccessor380.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
... 32 more