私はhibernate3と春を使用しています。
Javaコード:
クラスCommunicationServiceImpl、メソッドsendAllMessages:
Collection<MessageToSend> messagesToSend = this.repositoriesLocator.getMessageToSendRepository().getMessagesToSend();
Iterator<MessageToSend> iteratorMesToSe = messagesToSend.iterator();
while (iteratorMesToSe.hasNext()) {
MessageToSend mts = iteratorMesToSe.next();
MessageSender sender = new SmsSender(mts, this.repositoriesLocator);
sender.start(); //run thread
}
SmsSender:
public class SmsSender extends MessageSender {
public SmsSender(MessageToSend messageToSend, RepositoriesLocator repositoriesLocator) {
super(messageToSend, repositoriesLocator);
}
public void sendMessages() {
try {
MessageToSendSms messageToSendSms = (MessageToSendSms) this.messageToSend;
Iterator<CustomerByMessage> itCbmsgs = messageToSendSms.getCustomerByMessage().iterator();
while (itCbmsgs.hasNext()) {
CustomerByMessage cbm = (CustomerByMessage) itCbmsgs.next();
//sms sending
String sResult = this.sendSMS(cb.getBody(), cbm.getCellPhone());
cbm.setStatus(CustomerByMessageStatus.SENT_OK);
cbm.setSendingDate(Calendar.getInstance().getTime());
}
messageToSendSms.setStatus(messageToSendStats.PROCESSED)
this.log.info("saving messageToSend...");
//this line dont work!
this.repositoriesLocator.getMessageToSendRepository().update(messageToSendSms);
this.log.info("messageToSend saved!");
} catch (Exception e) {
this.log.error("Error sms sender " + e.getMessage());
}
}
これは私のappContext.xmlの一部です:
<bean id="serviceCommunication"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="communicationServiceImpl" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="communicationServiceImpl"
class="com.ninatec.fnet3.services.communication.impl.CommunicationServiceImpl"
parent="serviceParent">
</bean>
HibernateRepository
repositoriesLocator.getMessageToSendRepository()。updateコード:
public void update(MessageToSend messageToSend) {
try {
this.getSession().update(messageToSend);
} catch (HibernateException e) {
this.log.error(e.getMessage(), e);
throw e;
}
}
エンティティMessageToSendは更新されていません。
CommunicationServiceImpl.sendAllMessages()を呼び出すと、コレクションにすべてのmessagesToSendがあります。MessageToSendごとに、メッセージを送信するためのスレッドを作成します。スレッドsmsSenderは正常に機能しますが、データベースの永続性は機能しません。オブジェクトMessageToSendの変更は、私のデータベースでは更新されていません。
ランダムエラーは次のとおりです。
セッションは終了しました、
プロキシを初期化できませんでした-セッションがありません、
プロキシを初期化できませんでした-所有しているセッションが閉じられました、
コレクションを休止状態の2つのオープンセッションに関連付けようとする違法な試みと
ロールのコレクションを遅延初期化できませんでした:セッションがないか、セッションが閉じられていません
- スレッドについて。xsmsに1つのスレッドを使用したい。すべてのSMS送信者は、SMSのグループを送信します。
私のアーキテクチャでオブジェクトをセッションから明示的に切り離す方法がわかりません。