日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...

發(fā)布時(shí)間:2025/3/8 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在本系列先前的文章中,我們主要講解了JDBC對(duì)本地事務(wù)的處理,本篇文章將講到一個(gè)分布式事務(wù)的例子。

請(qǐng)通過(guò)以下方式下載github源代碼:

本地事務(wù)和分布式事務(wù)的區(qū)別在于:本地事務(wù)只用于處理單一數(shù)據(jù)源事務(wù)(比如單個(gè)數(shù)據(jù)庫(kù)),分布式事務(wù)可以處理多種異構(gòu)的數(shù)據(jù)源,比如某個(gè)業(yè)務(wù)操作中同時(shí)包含了JDBC和JMS或者某個(gè)操作需要訪問多個(gè)不同的數(shù)據(jù)庫(kù)。

Java通過(guò)JTA完成分布式事務(wù),JTA本身只是一種規(guī)范,不同的應(yīng)用服務(wù)器都包含有自己的實(shí)現(xiàn)(比如JbossJTA),同時(shí)還存在獨(dú)立于應(yīng)用服務(wù)器的單獨(dú)JTA實(shí)現(xiàn),比如本篇中要講到的Atomikos。對(duì)于JTA的原理,這里不細(xì)講,讀者可以通過(guò)這篇文章了解相關(guān)知識(shí)。

在本篇文章中,我們將實(shí)現(xiàn)以下一個(gè)應(yīng)用場(chǎng)景:你在網(wǎng)上購(gòu)物,下了訂單之后,訂單數(shù)據(jù)將保存在系統(tǒng)的數(shù)據(jù)庫(kù)中,同時(shí)為了安排物流,訂單信息將以消息(Message)的方式發(fā)送到物流部門以便送貨。

以上操作同時(shí)設(shè)計(jì)到數(shù)據(jù)庫(kù)操作和JMS消息發(fā)送,為了使整個(gè)操作成為一個(gè)原子操作,我們只能選擇分布式事務(wù)。我們首先設(shè)計(jì)一個(gè)service層,定義OrderService接口:

packagedavenkin;public interfaceOrderService {public voidmakeOrder(Order order);

}

為了簡(jiǎn)單起見,我們?cè)O(shè)計(jì)一個(gè)非常簡(jiǎn)單的領(lǐng)域?qū)ο驩rder:

@XmlRootElement(name = "Order")

@XmlAccessorType(XmlAccessType.FIELD)public classOrder {

@XmlElement(name= "Id",required = true)private longid;

@XmlElement(name= "ItemName",required = true)privateString itemName;

@XmlElement(name= "Price",required = true)private doubleprice;

@XmlElement(name= "BuyerName",required = true)privateString buyerName;

@XmlElement(name= "MailAddress",required = true)privateString mailAddress;publicOrder() {

}

為了采用JAXB對(duì)Order對(duì)象進(jìn)行Marshal和Unmarshal,我們?cè)贠rder類中加入了JAXB相關(guān)的Annotation。 我們將使用Hibernate來(lái)完成數(shù)據(jù)持久化,然后使用Spring提供的JmsTemplate將Order轉(zhuǎn)成xml后以TextMessage的形式發(fā)送到物流部門的ORDER.QUEUE中。

(一)準(zhǔn)備數(shù)據(jù)庫(kù)

為了方便,我們將采用Spring提供的embedded數(shù)據(jù)庫(kù),默認(rèn)情況下Spring采用HSQL作為后臺(tái)數(shù)據(jù)庫(kù),雖然在本例中我們將采用HSQL的非XA的DataSource,但是通過(guò)Atomikos包裝之后依然可以參與分布式事務(wù)。

SQL腳本包含在createDB.sql文件中:

CREATE TABLEUSER_ORDER(

IDINT NOT NULL,

ITEM_NAMEVARCHAR (100) NOT NULL UNIQUE,

PRICEDOUBLE NOT NULL,

BUYER_NAMECHAR (32) NOT NULL,

MAIL_ADDRESSVARCHAR(500) NOT NULL,PRIMARY KEY(ID)

);

在Spring中配置DataSource如下:

(二)啟動(dòng)ActiveMQ

我們將采用embedded的ActiveMQ,在測(cè)試之前啟動(dòng)ActiveMQ提供的BrokerService,在測(cè)試執(zhí)行完之后關(guān)閉BrokerService。

@BeforeClasspublic static void startEmbeddedActiveMq() throwsException {

broker= newBrokerService();

broker.addConnector("tcp://localhost:61616");

broker.start();

}

@AfterClasspublic static void stopEmbeddedActiveMq() throwsException {

broker.stop();

}

(三)實(shí)現(xiàn)OrderService

創(chuàng)建一個(gè)DefaultOrderService,該類實(shí)現(xiàn)了OrderService接口,并維護(hù)一個(gè)JmsTemplate和一個(gè)Hibernate的SessionFactory實(shí)例變量,分別用于Message的發(fā)送和數(shù)據(jù)庫(kù)處理。

packagedavenkin;importorg.hibernate.SessionFactory;importorg.hibernate.classic.Session;importorg.springframework.beans.factory.annotation.Required;importorg.springframework.jms.core.JmsTemplate;importorg.springframework.transaction.annotation.Transactional;public class DefaultOrderService implementsOrderService{privateJmsTemplate jmsTemplate;privateSessionFactory sessionFactory;

@Override

@Transactionalpublic voidmakeOrder(Order order) {

Session session=sessionFactory.getCurrentSession();

session.save(order);

jmsTemplate.convertAndSend(order);

}

@Requiredpublic voidsetJmsTemplate(JmsTemplate jmsTemplate) {this.jmsTemplate =jmsTemplate;

}

@Requiredpublic voidsetSessionFactory(SessionFactory sessionFactory) {this.sessionFactory =sessionFactory;

}

}

(四)創(chuàng)建Order的Mapping配置文件

/p>

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

(五)配置Atomikos事務(wù)

在Spring的IoC容器中,我們需要配置由Atomikos提供的UserTransaction和TransactionManager,然后再配置Spring的JtaTransactionManager:

com.atomikos.icatch.standalone.UserTransactionServiceFactory

(六)配置JMS

對(duì)于JMS,為了能使ActiveMQ加入到分布式事務(wù)中,我們需要配置ActiveMQXAConnectionFactory,而不是ActiveMQConnectionFactory,然后再配置JmsTemplate,此外還需要配置MessageConvertor在Order對(duì)象和XML之間互轉(zhuǎn)。

(七)測(cè)試

在測(cè)試中,我們首先通過(guò)(二)中的方法啟動(dòng)ActiveMQ,再調(diào)用DefaultOrderService,最后對(duì)數(shù)據(jù)庫(kù)和QUEUE進(jìn)行驗(yàn)證:

@Testpublic voidmakeOrder(){

orderService.makeOrder(createOrder());

JdbcTemplate jdbcTemplate= newJdbcTemplate(dataSource);

assertEquals(1, jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER_ORDER"));

String dbItemName= jdbcTemplate.queryForObject("SELECT ITEM_NAME FROM USER_ORDER", String.class);

String messageItemName=((Order) jmsTemplate.receiveAndConvert()).getItemName();

assertEquals(dbItemName, messageItemName);

}

@Test(expected= IllegalArgumentException.class)public voidfailToMakeOrder()

{

orderService.makeOrder(null);

JdbcTemplate jdbcTemplate= newJdbcTemplate(dataSource);

assertEquals(0, jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER_ORDER"));

assertNull(jmsTemplate.receiveAndConvert());

}

總結(jié)

以上是生活随笔為你收集整理的java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。