1. 首页 > WebSphere教程 > 正文

WebSphere教程FG014-WebSphere与Java EE应用集成实战案例

本文档风哥主要介绍WebSphere Application Server 9.0.5与Java EE应用的集成,包括Java EE规范支持、EJB应用、JPA数据访问、JMS消息、JTA事务等内容,风哥教程参考WebSphere官方文档Java EE应用开发章节,适合WebSphere管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 Java EE规范概述

Java EE(Java Platform, Enterprise Edition)是企业级Java应用开发的标准平台,WebSphere 9.0.5完整支持Java EE 7和部分Java EE 8规范。学习交流加群风哥微信: itpux-com

Java EE核心规范:

  • Servlet/JSP:Web层组件
  • EJB:业务逻辑组件
  • JPA:数据持久化
  • JMS:消息服务
  • JTA:事务管理

1.1.1 Java EE版本支持

# WebSphere Java EE版本支持

WebSphere 9.0.5支持的规范:

Java EE 7完整支持:
– Servlet 3.1
– JSP 2.3
– JSF 2.2
– EJB 3.2
– JPA 2.1
– JMS 2.0
– JTA 1.2
– CDI 1.1
– JAX-RS 2.0
– WebSocket 1.0

Java EE 8部分支持:
– Servlet 4.0(通过补丁)
– JPA 2.2(通过补丁)

# Java EE架构层次

┌─────────────────────────────────────────────────────────┐
│ 客户端层 │
│ Web浏览器 / 移动应用 / 桌面应用 │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ Web层 │
│ Servlet / JSP / JSF / WebSocket │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 业务逻辑层 │
│ EJB / CDI / JAX-RS │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 数据访问层 │
│ JPA / JDBC / JMS │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 数据层 │
│ 数据库 / 消息队列 / 外部系统 │
└─────────────────────────────────────────────────────────┘

# Java EE应用类型

1. Web应用(WAR)
– Servlet/JSP/JSF
– 静态资源
– Web配置

2. 企业应用(EAR)
– Web模块
– EJB模块
– 应用客户端模块
– 资源适配器模块

3. EJB模块(JAR)
– 会话Bean
– 消息驱动Bean
– 实体Bean(JPA)

1.2 WebSphere Java EE支持

WebSphere Java EE支持:

1.2.1 WebSphere容器服务

# WebSphere容器服务

1. Web容器
– Servlet容器
– JSP引擎
– WebSocket支持
– 会话管理

2. EJB容器
– 会话Bean管理
– 消息驱动Bean管理
– 依赖注入
– 事务管理

3. JPA容器
– 实体管理
– 持久化上下文
– 二级缓存

4. JMS容器
– 消息队列管理
– 消息驱动Bean
– 连接工厂

# WebSphere Java EE特性

1. 类加载
– 类加载器层次
– 类加载策略
– 共享库

2. 命名服务(JNDI)
– 资源查找
– EJB引用
– 环境条目

3. 事务服务(JTA)
– 全局事务
– 事务传播
– 事务隔离

4. 安全服务
– 认证
– 授权
– 安全上下文传播

# WebSphere特性支持

特性 描述
──────────────────────────────────────────────────────
类加载隔离 每个应用独立类加载器
热部署 应用更新无需重启
共享库 多应用共享类库
资源引用 统一资源访问方式

1.3 Java EE核心组件

Java EE核心组件:

1.3.1 组件类型

# Java EE核心组件

1. Servlet
– 处理HTTP请求
– 生成动态内容
– Web应用入口

示例:
@WebServlet(“/fgedu”)
public class FGeduServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) {
response.getWriter().println(“Hello FGedu”);
}
}

2. EJB(Enterprise JavaBean)
– 会话Bean:业务逻辑
– 消息驱动Bean:异步处理
– 单例Bean:全局状态

示例:
@Stateless
public class FGeduService {
@PersistenceContext
private EntityManager em;

public void save(FGeduEntity entity) {
em.persist(entity);
}
}

3. JPA实体
– 对象关系映射
– 数据持久化
– 查询语言

示例:
@Entity
@Table(name = “FGEDU_USER”)
public class FGeduUser {
@Id
@GeneratedValue
private Long id;

private String username;
private String email;
}

4. JMS消息
– 异步通信
– 消息队列
– 发布订阅

示例:
@MessageDriven
public class FGeduMessageListener implements MessageListener {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
System.out.println(“Received: ” + textMessage.getText());
}
}

5. JAX-RS资源
– RESTful服务
– JSON/XML支持
– HTTP方法映射

示例:
@Path(“/fgedu”)
public class FGeduResource {
@GET
@Path(“/users”)
@Produces(MediaType.APPLICATION_JSON)
public List getUsers() {
return userService.findAll();
}
}

1.4 Java EE应用部署模型

Java EE应用部署模型:

1.4.1 部署结构

# Java EE应用部署结构

1. WAR文件结构
fgeduapp.war
├── WEB-INF/
│ ├── web.xml # Web应用部署描述符
│ ├── beans.xml # CDI配置
│ ├── faces-config.xml # JSF配置
│ ├── classes/ # 编译后的类文件
│ │ └── com/fgedu/
│ │ ├── servlet/
│ │ ├── service/
│ │ └── entity/
│ └── lib/ # 依赖库
│ └── *.jar
├── META-INF/
│ └── persistence.xml # JPA配置
└── *.jsp, *.html # Web资源

2. EAR文件结构
fgeduapp.ear
├── META-INF/
│ ├── application.xml # 应用部署描述符
│ └── MANIFEST.MF
├── fgeduweb.war # Web模块
├── fgeduejb.jar # EJB模块
└── lib/ # 共享库
└── *.jar

3. EJB模块结构
fgeduejb.jar
├── META-INF/
│ ├── ejb-jar.xml # EJB部署描述符
│ └── persistence.xml # JPA配置
└── com/fgedu/
├── service/
├── entity/
└── dao/

# 部署描述符

application.xml(EAR):




fgeduweb.war
/fgeduapp



fgeduejb.jar

web.xml(WAR):



FGeduServlet
com.fgedu.servlet.FGeduServlet


FGeduServlet
/fgedu

persistence.xml(JPA):
jdbc/fgedudb
com.fgedu.entity.FGeduUser

风哥提示:Java EE应用部署需要了解各种部署描述符的配置,合理组织应用结构,充分利用WebSphere的容器服务。

Part02-生产环境规划与建议

2.1 Java EE应用规划

Java EE应用规划需要考虑多个因素:

2.1.1 应用规划要素

# Java EE应用规划要素

1. 应用类型选择
– Web应用(WAR):纯Web应用
– 企业应用(EAR):需要EJB的应用
– 微服务:独立部署的服务

2. 技术栈选择
– Web层:Servlet/JSP/JSF
– 业务层:EJB/CDI
– 数据层:JPA/JDBC
– 消息层:JMS

3. 资源需求
– 数据源:数据库连接
– JMS资源:队列/主题
– 邮件资源:邮件会话
– URL资源:外部服务

4. 安全需求
– 认证方式
– 授权策略
– 数据加密

# 应用规划模板

应用名称:fgedu电商系统
应用类型:EAR
技术栈:
– Web层:JSF 2.2 + PrimeFaces
– 业务层:EJB 3.2 + CDI 1.1
– 数据层:JPA 2.1
– 消息层:JMS 2.0

资源需求:
– 数据源:jdbc/fgedudb
– JMS队列:jms/fgeduQueue
– 邮件会话:mail/fgeduMail

安全需求:
– 认证:LDAP
– 授权:基于角色

2.2 Java EE架构规划

Java EE架构规划:

2.2.1 架构设计

# Java EE架构设计

1. 分层架构
┌─────────────────────────────────────────────────────────┐
│ 表现层(Web) │
│ Servlet / JSF / JAX-RS │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 业务层(Service) │
│ EJB / CDI Bean │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 数据访问层(DAO) │
│ JPA / JDBC │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ 数据层 │
│ 数据库 / 消息队列 │
└─────────────────────────────────────────────────────────┘

2. 模块划分
fgeduapp.ear
├── fgedu-web.war # Web模块
│ ├── 表现层组件
│ └── 静态资源
├── fgedu-ejb.jar # EJB模块
│ ├── 业务层组件
│ └── 数据访问组件
└── fgedu-common.jar # 公共模块
├── 工具类
└── 常量定义

3. 依赖管理
– 使用Maven/Gradle管理依赖
– 避免依赖冲突
– 合理使用共享库

# 架构设计原则

1. 关注点分离
– 表现层只处理展示
– 业务层只处理业务逻辑
– 数据层只处理数据访问

2. 松耦合
– 使用接口定义契约
– 依赖注入解耦组件
– 面向接口编程

3. 高内聚
– 相关功能放在同一模块
– 单一职责原则
– 模块边界清晰

2.3 Java EE资源配置

Java EE资源配置:

2.3.1 资源配置规划

# Java EE资源配置

1. 数据源配置
资源名称:jdbc/fgedudb
JNDI名称:jdbc/fgedudb
类型:javax.sql.DataSource
连接池:最小10,最大50

2. JMS资源配置
队列连接工厂:jms/fgeduQCF
队列:jms/fgeduQueue
主题:jms/fgeduTopic

3. 邮件资源配置
邮件会话:mail/fgeduMail
SMTP服务器:smtp.fgedu.net.cn
端口:25/465/587

4. URL资源配置
URL资源:url/fgeduApi
目标URL:http://api.fgedu.net.cn

# 资源引用配置

web.xml资源引用:

jdbc/fgedudb
javax.sql.DataSource
Container


jms/fgeduQCF
javax.jms.QueueConnectionFactory
Container

ejb-jar.xml资源引用:


FGeduService

jdbc/fgedudb
javax.sql.DataSource

com.fgedu.service.FGeduService
dataSource



# 注解方式资源注入

@Stateless
public class FGeduService {
@Resource(lookup = “jdbc/fgedudb”)
private DataSource dataSource;

@Resource(lookup = “jms/fgeduQCF”)
private QueueConnectionFactory qcf;

@Resource(lookup = “jms/fgeduQueue”)
private Queue queue;
}

2.4 Java EE安全规划

Java EE安全规划:

2.4.1 安全配置

# Java EE安全配置

1. 认证配置
方式:FORM认证
登录页面:/login.jsp
错误页面:/error.jsp

web.xml:

FORM
/login.jsp /error.jsp

2. 授权配置
角色:fgeduAdmin, fgeduUser, fgeduGuest

web.xml:

fgeduAdmin


fgeduUser



Admin
/admin/*


fgeduAdmin

3. EJB安全配置
@Stateless
@DeclareRoles({“fgeduAdmin”, “fgeduUser”})
public class FGeduService {

@RolesAllowed(“fgeduAdmin”)
public void adminOperation() {
// 管理员操作
}

@RolesAllowed({“fgeduAdmin”, “fgeduUser”})
public void userOperation() {
// 用户操作
}

@PermitAll
public void publicOperation() {
// 公开操作
}
}

# 安全角色映射

WebSphere管理控制台:
应用程序 > 应用程序类型 > WebSphere企业应用程序
> fgeduapp > 安全角色到用户/组映射

角色映射:
fgeduAdmin -> cn=fgeduadmins,ou=groups,dc=fgedu,dc=net,dc=cn
fgeduUser -> cn=fgeduusers,ou=groups,dc=fgedu,dc=net,dc=cn

Part03-生产环境项目实施方案

3.1 EJB应用集成实战

EJB应用集成操作:

3.1.1 EJB开发与部署

# EJB开发与部署

1. 创建EJB模块
# Maven项目结构
fgedu-ejb/
├── src/main/java/
│ └── com/fgedu/
│ ├── service/
│ │ ├── FGeduService.java
│ │ └── FGeduServiceBean.java
│ └── entity/
│ └── FGeduUser.java
├── src/main/resources/
│ └── META-INF/
│ └── persistence.xml
└── pom.xml

2. EJB接口定义
public interface FGeduService {
FGeduUser findById(Long id);
List findAll();
void save(FGeduUser user);
void delete(FGeduUser user);
}

3. EJB实现类
@Stateless
@Local(FGeduService.class)
public class FGeduServiceBean implements FGeduService {

@PersistenceContext(unitName = “fgeduPU”)
private EntityManager em;

@Override
public FGeduUser findById(Long id) {
return em.find(FGeduUser.class, id);
}

@Override
public List findAll() {
return em.createQuery(“SELECT u FROM FGeduUser u”, FGeduUser.class)
.getResultList();
}

@Override
public void save(FGeduUser user) {
if (user.getId() == null) {
em.persist(user);
} else {
em.merge(user);
}
}

@Override
public void delete(FGeduUser user) {
em.remove(em.contains(user) ? user : em.merge(user));
}
}

4. 部署EJB模块
# 打包EJB JAR
mvn clean package

# 部署到WebSphere
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123

AdminApp.install(‘/WebSphere/apps/fgedu-ejb.jar’, ‘[-appname fgeduEjb]’)
AdminConfig.save()

# 验证部署
AdminApp.list()

fgeduEjb

5. EJB调用
# 在Web模块中调用EJB
@WebServlet(“/users”)
public class UserServlet extends HttpServlet {

@EJB
private FGeduService fgeduService;

protected void doGet(HttpServletRequest request,
HttpServletResponse response) {
List users = fgeduService.findAll();
request.setAttribute(“users”, users);
request.getRequestDispatcher(“/users.jsp”).forward(request, response);
}
}

3.2 JPA数据访问实战

JPA数据访问配置:

3.2.1 JPA配置与使用

# JPA配置与使用

1. JPA实体定义
@Entity
@Table(name = “FGEDU_USER”)
@NamedQuery(name = “FGeduUser.findByUsername”,
query = “SELECT u FROM FGeduUser u WHERE u.username = :username”)
public class FGeduUser {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “ID”)
private Long id;

@Column(name = “USERNAME”, nullable = false, unique = true, length = 50)
private String username;

@Column(name = “PASSWORD”, nullable = false, length = 100)
private String password;

@Column(name = “EMAIL”, length = 100)
private String email;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = “CREATE_TIME”)
private Date createTime;

@OneToMany(mappedBy = “user”, cascade = CascadeType.ALL)
private List orders;

// getters and setters
}

2. JPA配置文件
persistence.xml:
jdbc/fgedudb
com.fgedu.entity.FGeduUser
com.fgedu.entity.FGeduOrder

3. JPA使用示例
@Stateless
public class FGeduUserService {

@PersistenceContext(unitName = “fgeduPU”)
private EntityManager em;

// 保存用户
public FGeduUser createUser(FGeduUser user) {
user.setCreateTime(new Date());
em.persist(user);
return user;
}

// 更新用户
public FGeduUser updateUser(FGeduUser user) {
return em.merge(user);
}

// 删除用户
public void deleteUser(Long id) {
FGeduUser user = em.find(FGeduUser.class, id);
if (user != null) {
em.remove(user);
}
}

// 查询用户
public FGeduUser findById(Long id) {
return em.find(FGeduUser.class, id);
}

// 按用户名查询
public FGeduUser findByUsername(String username) {
TypedQuery query = em.createNamedQuery(
“FGeduUser.findByUsername”, FGeduUser.class);
query.setParameter(“username”, username);
try {
return query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}

// 分页查询
public List findAll(int page, int size) {
TypedQuery query = em.createQuery(
“SELECT u FROM FGeduUser u ORDER BY u.createTime DESC”,
FGeduUser.class);
query.setFirstResult((page – 1) * size);
query.setMaxResults(size);
return query.getResultList();
}

// 统计数量
public long count() {
Query query = em.createQuery(“SELECT COUNT(u) FROM FGeduUser u”);
return (Long) query.getSingleResult();
}
}

4. JPA Criteria查询
public List searchUsers(String username, String email) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(FGeduUser.class);
Root user = cq.from(FGeduUser.class);

List predicates = new ArrayList<>();

if (username != null && !username.isEmpty()) {
predicates.add(cb.like(user.get(“username”), “%” + username + “%”));
}

if (email != null && !email.isEmpty()) {
predicates.add(cb.like(user.get(“email”), “%” + email + “%”));
}

cq.where(predicates.toArray(new Predicate[0]));

return em.createQuery(cq).getResultList();
}

3.3 JMS消息集成实战

JMS消息集成配置:

3.3.1 JMS配置与使用

# JMS配置与使用

1. 创建JMS资源
# 通过管理控制台
资源 > JMS > 队列连接工厂
资源 > JMS > 队列

# 通过wsadmin创建
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123

# 创建队列连接工厂
AdminJMS.createWASQueueConnectionFactory(‘[-name fgeduQCF -jndiName jms/fgeduQCF -scope Node]’)

# 创建队列
AdminJMS.createWASQueue(‘[-name fgeduQueue -jndiName jms/fgeduQueue -scope Node]’)

AdminConfig.save()

2. JMS消息发送
@Stateless
public class FGeduMessageService {

@Resource(lookup = “jms/fgeduQCF”)
private QueueConnectionFactory qcf;

@Resource(lookup = “jms/fgeduQueue”)
private Queue queue;

public void sendMessage(String message) {
Connection connection = null;
Session session = null;
MessageProducer producer = null;

try {
connection = qcf.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(queue);

TextMessage textMessage = session.createTextMessage(message);
producer.send(textMessage);

System.out.println(“消息发送成功: ” + message);

} catch (JMSException e) {
throw new RuntimeException(“消息发送失败”, e);
} finally {
try {
if (producer != null) producer.close();
if (session != null) session.close();
if (connection != null) connection.close();
} catch (JMSException e) {
// ignore
}
}
}
}

3. JMS消息接收(消息驱动Bean)
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = “destinationType”,
propertyValue = “javax.jms.Queue”),
@ActivationConfigProperty(propertyName = “destination”,
propertyValue = “jms/fgeduQueue”)
}
)
public class FGeduMessageListener implements MessageListener {

@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println(“收到消息: ” + text);

// 处理消息
processMessage(text);
}
} catch (JMSException e) {
e.printStackTrace();
}
}

private void processMessage(String message) {
// 业务处理逻辑
}
}

4. JMS事务配置
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class FGeduOrderService {

@Resource(lookup = “jms/fgeduQCF”)
private QueueConnectionFactory qcf;

@Resource(lookup = “jms/fgeduQueue”)
private Queue queue;

@PersistenceContext
private EntityManager em;

public void createOrder(FGeduOrder order) {
// 保存订单到数据库
em.persist(order);

// 发送消息通知
sendMessage(“订单创建: ” + order.getId());

// 如果任何一步失败,整个事务回滚
}

private void sendMessage(String message) {
// JMS消息发送
}
}

3.4 JTA事务管理实战

JTA事务管理配置:

3.4.1 JTA事务配置

# JTA事务管理

1. 事务属性配置
@Stateless
public class FGeduTransactionService {

// 默认:REQUIRED
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void requiredMethod() {
// 如果存在事务则加入,否则创建新事务
}

// 需要新事务
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void requiresNewMethod() {
// 总是创建新事务,挂起当前事务
}

// 强制要求事务
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public void mandatoryMethod() {
// 必须在事务中调用,否则抛出异常
}

// 不支持事务
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void notSupportedMethod() {
// 挂起当前事务,以非事务方式执行
}

// 支持事务
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public void supportsMethod() {
// 如果存在事务则加入,否则以非事务方式执行
}

// 从不使用事务
@TransactionAttribute(TransactionAttributeType.NEVER)
public void neverMethod() {
// 必须在非事务中调用,否则抛出异常
}
}

2. 分布式事务示例
@Stateless
public class FGeduDistributedService {

@PersistenceContext(unitName = “fgeduPU”)
private EntityManager em1;

@PersistenceContext(unitName = “fgeduPU2”)
private EntityManager em2;

@Resource(lookup = “jms/fgeduQCF”)
private QueueConnectionFactory qcf;

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void distributedOperation() {
// 操作数据库1
FGeduUser user = new FGeduUser();
user.setUsername(“fgedu”);
em1.persist(user);

// 操作数据库2
FGeduLog log = new FGeduLog();
log.setMessage(“用户创建”);
em2.persist(log);

// 发送JMS消息
// sendMessage(“操作完成”);

// 所有操作在同一事务中
// 任何失败都会回滚所有操作
}
}

3. 事务超时配置
@Stateless
@TransactionTimeout(300) // 5分钟超时
public class FGeduLongRunningService {

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void longRunningOperation() {
// 长时间运行的事务
}
}

4. 事务回滚控制
@Stateless
public class FGeduRollbackService {

@Resource
private SessionContext sessionContext;

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void rollbackExample() {
try {
// 业务操作
doSomething();
} catch (Exception e) {
// 标记事务回滚
sessionContext.setRollbackOnly();
throw e;
}
}

private void doSomething() {
// 业务逻辑
}
}

# WebSphere事务配置

管理控制台:
服务器 > server1 > 容器服务 > 事务服务

配置项:
– 总事务超时:120秒
– 客户端事务超时:300秒
– 最大事务数:10000
– 启用Heuristic处理:是

风哥提示:Java EE应用开发需要充分利用WebSphere的容器服务,包括事务管理、安全、资源管理等。建议使用注解方式配置,减少XML配置文件。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 电商系统Java EE集成案例

电商系统Java EE集成案例:

4.1.1 案例背景

# 电商系统Java EE集成案例

企业背景:
– 应用类型:电商系统
– 技术栈:Java EE 7
– 部署方式:EAR
– 用户规模:100万+

系统架构:
– Web层:JSF + PrimeFaces
– 业务层:EJB 3.2
– 数据层:JPA 2.1
– 消息层:JMS 2.0

4.1.2 实施方案

# 电商系统实施

1. 项目结构
fgedu-shop.ear
├── fgedu-shop-web.war
│ ├── WEB-INF/
│ │ ├── web.xml
│ │ ├── faces-config.xml
│ │ └── beans.xml
│ └── pages/
│ ├── index.xhtml
│ ├── product.xhtml
│ └── cart.xhtml
├── fgedu-shop-ejb.jar
│ ├── META-INF/
│ │ ├── ejb-jar.xml
│ │ └── persistence.xml
│ └── com/fgedu/
│ ├── service/
│ │ ├── ProductService.java
│ │ ├── OrderService.java
│ │ └── UserService.java
│ └── entity/
│ ├── Product.java
│ ├── Order.java
│ └── User.java
└── lib/
└── fgedu-common.jar

2. 核心EJB实现
@Stateless
public class OrderService {

@PersistenceContext
private EntityManager em;

@Resource(lookup = “jms/fgeduOrderQCF”)
private QueueConnectionFactory qcf;

@Resource(lookup = “jms/fgeduOrderQueue”)
private Queue orderQueue;

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Order createOrder(User user, List items) {
// 创建订单
Order order = new Order();
order.setUser(user);
order.setCreateTime(new Date());
order.setStatus(OrderStatus.PENDING);

BigDecimal totalAmount = BigDecimal.ZERO;
for (OrderItem item : items) {
item.setOrder(order);
totalAmount = totalAmount.add(item.getAmount());
}
order.setTotalAmount(totalAmount);

em.persist(order);

// 发送订单消息
sendOrderMessage(order);

return order;
}

private void sendOrderMessage(Order order) {
try (Connection conn = qcf.createConnection();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(orderQueue)) {

TextMessage message = session.createTextMessage();
message.setText(“ORDER:” + order.getId());
producer.send(message);

} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}

3. 部署配置
# 部署应用
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123

AdminApp.install(‘/WebSphere/apps/fgedu-shop.ear’, ”’
[-appname fgedu-shop
-MapModulesToServers [[.* .* fgeduCluster]]
-MapWebModToVH [[.* .* default_host]]
-DataSourceBinding [[.* jdbc/fgedudb jdbc/fgedudb]]
-JMSBinding [[.* jms/fgeduOrderQCF jms/fgeduOrderQCF]]]
”’)

AdminConfig.save()

# 启动应用
AdminControl.invoke(AdminControl.queryNames(‘type=ApplicationManager,process=server1,*’),
‘startApplication’, ‘fgedu-shop’)

4. 验证部署
# 检查应用状态
AdminApp.list()

fgedu-shop

# 访问应用
curl http://localhost:9080/fgedu-shop/

# 测试功能
# – 商品浏览
# – 购物车
# – 订单创建

4.2 金融系统Java EE集成案例

金融系统Java EE集成案例:

4.2.1 案例背景

# 金融系统Java EE集成案例

企业背景:
– 应用类型:银行核心系统
– 技术栈:Java EE 7
– 安全要求:高
– 事务要求:强一致性

系统特点:
– 高并发交易
– 分布式事务
– 严格安全控制
– 审计日志

4.2.2 实施方案

# 金融系统实施

1. 安全配置
@Stateless
@DeclareRoles({“TELLER”, “MANAGER”, “ADMIN”})
@RunAs(“SYSTEM”)
public class AccountService {

@RolesAllowed({“TELLER”, “MANAGER”, “ADMIN”})
public Account getAccount(String accountNo) {
// 查询账户
}

@RolesAllowed({“MANAGER”, “ADMIN”})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transfer(String fromAccount, String toAccount,
BigDecimal amount) {
// 转账操作
debit(fromAccount, amount);
credit(toAccount, amount);
logTransaction(fromAccount, toAccount, amount);
}

@RolesAllowed(“ADMIN”)
public void freezeAccount(String accountNo) {
// 冻结账户
}
}

2. 分布式事务配置
@Stateless
@TransactionTimeout(60)
public class TransferService {

@PersistenceContext(unitName = “corePU”)
private EntityManager coreEm;

@PersistenceContext(unitName = “auditPU”)
private EntityManager auditEm;

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transfer(TransferRequest request) {
// 核心账务处理
Account from = coreEm.find(Account.class, request.getFromAccount());
Account to = coreEm.find(Account.class, request.getToAccount());

from.debit(request.getAmount());
to.credit(request.getAmount());

// 审计日志
AuditLog log = new AuditLog();
log.setOperation(“TRANSFER”);
log.setDetails(request.toString());
log.setTimestamp(new Date());
auditEm.persist(log);

// 同一事务,保证一致性
}
}

3. 消息驱动处理
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = “destinationType”,
propertyValue = “javax.jms.Queue”),
@ActivationConfigProperty(propertyName = “destination”,
propertyValue = “jms/fgeduTransQueue”)
}
)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class TransactionProcessor implements MessageListener {

@EJB
private TransferService transferService;

@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
TransferRequest request = parseRequest(textMessage.getText());
transferService.transfer(request);
} catch (Exception e) {
// 事务回滚,消息重新投递
throw new RuntimeException(e);
}
}
}

4. 监控与告警
@WebListener
public class TransactionMonitor implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
// 启动监控线程
startMonitoring();
}

private void startMonitoring() {
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
// 监控交易量
// 监控响应时间
// 监控错误率
}, 0, 1, TimeUnit.MINUTES);
}
}

4.3 Java EE应用故障处理案例

Java EE应用故障处理案例:

4.3.1 事务超时案例

# 事务超时案例

故障现象:
应用报错:Transaction timed out

故障诊断:
1. 检查日志
grep -i “transaction” /WebSphere/app/profiles/AppSrv01/logs/server1/SystemOut.log

[4/10/26 10:00:00:000 CST] 00000001 WsTransaction E WTRN0006E: 事务已超时

2. 分析原因
– 事务执行时间过长
– 事务超时设置过短
– 数据库锁等待

解决方案:
1. 增加事务超时时间
# 通过管理控制台
服务器 > server1 > 容器服务 > 事务服务
> 总事务超时:300秒

# 通过注解
@TransactionTimeout(300)

2. 优化事务逻辑
@Stateless
public class OptimizedService {

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void optimizedMethod() {
// 只在事务中执行必要的操作
// 将耗时操作移到事务外
}

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void nonTransactionalWork() {
// 非事务操作
}
}

3. 优化数据库操作
– 添加索引
– 优化SQL
– 减少锁持有时间

# 故障处理结果
问题原因:事务超时
解决方案:增加超时时间、优化事务逻辑
处理时间:30分钟

Part05-风哥经验总结与分享

5.1 Java EE应用集成检查清单

Java EE应用集成检查清单:

# Java EE应用集成检查清单

开发检查:
□ EJB接口定义正确
□ JPA实体映射正确
□ JMS资源配置正确
□ 事务配置合理
□ 安全注解正确

部署检查:
□ 部署描述符配置正确
□ 资源引用绑定正确
□ 类加载器配置正确
□ 共享库配置正确

测试检查:
□ 单元测试通过
□ 集成测试通过
□ 性能测试通过
□ 安全测试通过

# Java EE应用检查脚本
#!/bin/bash
# javaee_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “=== Java EE应用检查 ===”

# 检查应用状态
echo “1. 应用状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminApp.list()” 2>/dev/null

# 检查数据源
echo “”
echo “2. 数据源:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.list(‘DataSource’)” 2>/dev/null

# 检查JMS资源
echo “”
echo “3. JMS资源:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.list(‘JMSProvider’)” 2>/dev/null

echo “”
echo “=== 检查完成 ===”

5.2 Java EE应用常见问题

Java EE应用常见问题及解决方案:

5.2.1 常见问题汇总

# Java EE应用常见问题

问题1:类加载冲突
原因:多个版本的同名类
解决:使用共享库、调整类加载顺序

问题2:JNDI查找失败
原因:资源未配置或JNDI名称错误
解决:检查资源配置、验证JNDI名称

问题3:事务回滚
原因:异常、超时、锁冲突
解决:检查异常、调整超时、优化锁

问题4:JPA性能差
原因:N+1查询、缺少索引
解决:优化查询、添加索引、使用缓存

问题5:JMS消息丢失
原因:消息持久化配置、确认模式
解决:配置持久化、调整确认模式

5.3 Java EE应用最佳实践

基于多年WebSphere运维经验,总结Java EE应用最佳实践:

5.3.1 开发最佳实践

  • 使用注解:减少XML配置,提高可读性
  • 接口编程:面向接口编程,降低耦合
  • 合理分层:表现层、业务层、数据层分离
  • 异常处理:统一异常处理机制

5.3.2 部署最佳实践

  • 资源隔离:不同应用使用不同资源
  • 版本管理:使用Maven管理版本
  • 配置外置:环境相关配置外置
  • 监控完善:完善的监控和告警
生产环境建议:Java EE应用开发需要充分利用WebSphere的容器服务,遵循Java EE规范,合理设计架构,确保应用的可维护性和可扩展性。from WebSphere视频:www.itpux.com

本文档详细介绍了WebSphere 9.0.5与Java EE应用的集成,包括Java EE规范支持、EJB应用、JPA数据访问、JMS消息、JTA事务等内容。通过学习本文档,读者可以掌握WebSphere Java EE应用集成的方法和最佳实践。更多视频教程www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息