EJB接口实现jms队列发送,然后同步方法receive()接收消息。在通过客户端远程调用的时候,发现服务器线程阻塞在receive()处直到超时异常抛出,观察发现 send()方法执行后,并没有立即把消息发出。而通过普通的java类直接实现jms消息收发,则正常发送和接收。
MessageSendAndReceiveForSync.java类的sendAndReceive(String reqMessage)方法实现发送和接收。 Company.java类是提供的远程EJB调用接口方法。CompanyBean.java是远程接口实现。TestCompany.java是远程客户端调用
package com.jms; import java.util.Hashtable; import javax.jms.Message; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class MessageSendAndReceiveForSync { public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; public final static String PROVIDER_URL = "t3://localhost:7001"; public final static String JMS_FACTORY = "jndiConnectionFactory"; public final static String QUEUE = "jndiQueue"; public final static String RSPQUEUE = "GSRspQueue"; public String sendAndReceive (String reqMessage)throws Exception { InitialContext ctx = getInitialContext(); QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup(JMS_FACTORY); QueueConnection qconn = factory.createQueueConnection(); qconn.start(); //=========================消息发送================================ Queue queue = (Queue)ctx.lookup(QUEUE); final QueueSession session = qconn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); Message message = session.createTextMessage(reqMessage); // message.setJMSMessageID(System.currentTimeMillis()); QueueSender qs = session.createSender(queue); qs.send(message); System.out.println(System.currentTimeMillis()+"=======Send Message Completed!"); //=========================同步消息接收================================ Queue rspQ = (Queue)ctx.lookup(RSPQUEUE); QueueReceiver qr = session.createReceiver(rspQ); System.out.println(System.currentTimeMillis()+"=======receive()方法开始被调用---"); Message recvMessage = qr.receive(180000L); System.out.println(System.currentTimeMillis()+"=======receive()方法已执行完成---"); TextMessage tm = (TextMessage)recvMessage; String rspMessage = tm.getText(); qr.close(); qs.close(); qconn.close(); return rspMessage; } public InitialContext getInitialContext() throws NamingException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.put(Context.PROVIDER_URL, PROVIDER_URL); return new InitialContext(env); } public static void main(String[] args) { MessageSendAndReceiveForSync msar = new MessageSendAndReceiveForSync(); try { String sendAndReceive = msar.sendAndReceive("htjs"); System.out.println(System.currentTimeMillis()+"=======客户端收到返回消息:"+sendAndReceive); } catch (Exception e) { e.printStackTrace(); } } }
package com.ejb; import javax.ejb.Stateless; import com.jms.MessageSendAndReceive; import com.jms.MessageSendAndReceiveForSync; @Stateless(mappedName = "Company") public class CompanyBean implements Company { public String getNameForSync(String name) { String rspMessage ="系统错误"; try { MessageSendAndReceiveForSync qs = new MessageSendAndReceiveForSync(); rspMessage = qs.sendAndReceive(name); } catch (Exception e) { e.printStackTrace(); } return rspMessage; } }
package com.ejb; import javax.ejb.Remote; @Remote public interface Company { public String getNameForSync(String name); }
客户端代码
写道
package com.ejb;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.ejb.Company;
public class TestCompany
{
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");
InitialContext ctx = new InitialContext(props);
Company companyRemote = (Company) ctx.lookup("Company#com.ejb.Company");
String name = companyRemote.getNameForSync("htjs");
System.out.println(name);
}
}
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.ejb.Company;
public class TestCompany
{
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");
InitialContext ctx = new InitialContext(props);
Company companyRemote = (Company) ctx.lookup("Company#com.ejb.Company");
String name = companyRemote.getNameForSync("htjs");
System.out.println(name);
}
}
相关推荐
4. **容器管理**: EJB容器在调用实际的bean实例前,会进行一系列容器管理操作,如事务管理、安全验证、性能监控等。 5. **分发请求**: 容器将客户端请求转换为本地方法调用,分发给EJB组件实例。 6. **执行业务逻辑*...
5. EJB容器管理:Java EE应用服务器作为EJB容器,负责管理Bean的生命周期、事务、安全性和资源。这使得开发者能够专注于业务逻辑,而不必关心底层实现。 6. JNDI(Java Naming and Directory Interface):EJB通过...
当JMS客户端发送消息时,EJB容器会从池中选取一个实例来处理消息。处理完成后,实例返回池中等待下一次消息。这种机制确保了MDB的异步处理能力,同时避免了频繁创建和销毁bean实例的开销。 **激活与钝化机制** 对于...
这是在采用WebLogic作为EJB容器时,远程调用EJB的一种常见模式。初学者可以通过这种方式熟悉基本的远程调用流程。 6. **注意事项** - 在实际部署过程中,需要注意EJB的版本兼容性问题,以及安全认证机制。例如,...
EJB容器管理着EJB组件的生命周期,处理事务、安全、并发等问题,对开发者隐藏了这些复杂的服务的实现细节。 文档进一步介绍了EJB的分类,包括实体Bean、会话Bean和消息驱动Bean。实体Bean代表了持久化存储中的数据...
EJB容器提供了运行在其内的组件(即EJBs)所需的高级管理功能。只要满足J2EE(Java 2 Platform, Enterprise Edition)规范的EJB部署到容器中,容器将自动进行高效管理。EJB可以通过容器提供的API轻松获取系统级别的...
- **远程方法调用 (Remote Method Invocation, RMI)**:客户端通过接口调用EJB的方法,该接口由EJB容器生成并暴露,实现跨JVM通信。 - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行...
3. **Container Provider (容器提供商)**:实现EJB容器并提供所需的基础设施服务。 #### 二、编写和部署第一个EJB程序 **编写第一个EJB程序** 1. **定义接口**:为EJB定义本地和远程接口。 2. **实现EJB类**:...
- JBoss EJB容器的实现库,因为EJB的部署和执行通常需要特定的容器支持。 - 持久化提供者的实现,如Hibernate或OpenJPA,这些是JPA的具体实现,用于实际的数据操作。 - JMS(Java Message Service)库,用于EJB之间...
4. **透明的事务管理**:EJB容器自动管理事务,开发者无需关注事务的开始、提交或回滚。 5. **安全管理**:容器提供了基于角色的安全性,可以控制不同用户对Bean的访问权限。 **Web服务与EJB 3.0的结合** EJB 3.0...
- **远程接口调用(Remote Interface Invocation)**:客户端通过EJB的远程接口调用EJB方法,适用于客户端不在EJB容器内的场景。 - **本地接口调用(Local Interface Invocation)**:当客户端和EJB在同一个JVM内...
EJB服务器负责管理和协调EJB容器,同时提供对操作系统服务及Java相关服务的访问,如通过JNDI(Java Naming and Directory Interface)访问命名空间和基于OTSI(Object Transaction Service Interface)的事务处理...
- **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,实现跨JVM的通信。适用于客户端不在同一个应用服务器上的情况。 - **本地方法调用(Local Method Invocation)**:当客户端和...
EJB容器是EJB组件的运行环境,它提供了上述的管理服务。容器负责创建、初始化、激活、钝化和销毁EJB实例,以及处理与客户端的交互。 **4. EJB编程模型** EJB编程模型包括接口定义、实现类以及部署描述符。接口定义...
EJB容器是EJB类访问所需服务的接口。 - **EJB服务器**:管理EJB容器,为容器提供必要的系统服务。常见的EJB服务器包括JBoss、GlassFish等。 ##### EJB基本特征 - **兼容性**:EJB允许在不废弃现有企业级应用的前提...
调用过程涉及了远程方法调用(RMI,Remote Method Invocation)、EJB容器的拦截器(Interceptors)以及可能的JNDI查找。调用完成后,容器负责执行必要的清理工作,如关闭数据库连接。 通过深入理解上述知识点,并...
EJB容器提供了强大的事务管理支持,它自动处理事务的开始、提交、回滚等操作,确保了业务逻辑中数据处理的原子性、一致性、隔离性和持久性(ACID属性)。开发者无需编写复杂逻辑来管理事务,这减少了错误发生的可能...