Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 18

62
votes
answers
17 views
+10

Sharing one encoder/pattern among multiple Appenders in Logback

This is my first foray into the world of LogBack, however I couldn't find anywhere in the documentation where I could define an encoder/pattern once and share it among multiple appenders. Any idea how to accomplish this?

+420

使用變量替換可以重複使用模式。

 <結構> < property name =“defaultPattern”value =“%d {HH:mm:ss.SSS} [%thread]%-5level%logger {36}  - %msg%n”/> < appender name =“STDOUT”class =“ch.qos.logback.core.ConsoleAppender”> <編碼器> <模式> $ {defaultPattern}< /圖案> < /編碼器> < /附加器> < root level =“debug”> < appender-ref ref =“STDOUT”/> < /根> < /結構>  
     
			
        
up vote 20 down vote accepted favorite
板凳
+200
+50

對於任何有興趣的人,我都會從LogBack文檔的第4章中找到這個小寶石: “每個佈局/編碼器都與一個且只有一個appender相關聯,稱為擁有的appender。” 這對我來說就好像Appender無法共享一個單個編碼器實例。

24
votes
answers
20 views
+10

Java EE Fundamentals

I've read the wikipedia articles. I've browsed the Oracle tutorials. I've Googled, binged and Yahooed, and still, I am choking on the most basic fundamentals of Java EE (5+).

  1. Must all Java EE architectures involve an application server, such as JBoss or GlassFish, at some point? Essentially, is the concept of the application server fundamental to Java EE, and why/why not?

  2. Beyond application servers, are there any other major components that a Java EE architecture depends on? If so, what are they and how do they "snap into" the architecture and relate to the application server?

  3. I'm really choking on the concept of EJBs. From everything I've been able to find on them, I can't tell if EJB is a specification for developers to use (whereby complying with the EJB spec produces a unit of code that can be called a "bean"), or if its like any other Java library, like JDBC or JMS.

    (a) In the King's English, without using advanced, already-in-the-know concepts or marketing buzzwords, what is EJB? Can you provide a few quick & dirty examples of (an) EJB?

    (b) How does EJB interface/interact with an application server?

    (c) What is an EJB "container", and what does it do?

  4. It seems to me like there are a lot of top-level components that make up a Java EE backend, and that for each type of these components, there are a lot of both open- and closed-source varieties out there that you, the system engineer, must choose from.

    Seeing that I am so confused on Java EE fundamental already, below is a list of some products I have heard about. I am simply asking for someone to help me categorize these products so I can see, in plain sight, what they are. For instance, if I list "GlassFish" and "JBoss", then they might appear in the category of "Application Servers." If I list "Tomcat" and "WebSphere", they might appear under "Servlet Engines", etc.

    The list:

    • JBoss
    • Geronimo
    • Jetty
    • GlassFish
    • Tomcat
    • Spring RabbitMQ
    • Spring GemFire
    • Spring ers
    • Spring tc Server
    • Hibernate

5. What's the difference between Java EE 6 and Java EE 6 "Web Profile"?

沙发
+160
  1. 沒有。您可以在不是應用程序服務器的容器中運行JavaEE的多個部分。Servlet / JSP / JSF可以在servlet容器上運行。JPA - 您可以使用任何設置。

  2. JavaEE“系列”的所有部分都可以單獨使用,即在應用程序服務器之外使用。Servlet容器。JMS提供者。JTA經理。甚至是EJB容器。

  3. 在版本3之前的EJB提供了一組接口,您應該實現這些接口,以便EJB容器管理您的類。從3.0開始,EJB規範主要定義了註釋(從開發人員的角度來看)。除此之外,它是關於EJB容器(應用程序服務器的一部分)應如何處理EJB的規範

  4. Glassfish,JBoss和Geronimo(以及其他一些)是功能齊全的應用服務器。Tomcat,Jetty和Spring tc服務器只是servlet容器 - 它們只處理JavaEE的servlet / jsp部分。它們可能具有其他功能(如tc服務器的企業監控功能)。Hibernate是JPA的實現 - 對象關係映射(簡而言之 - 您使用對象而不是JDBC)。RabbitMQ是一個消息隊列,我甚至不確定它是否符合JMS規範(JavaEE的一部分)。GemFire與JavaEE無關

  5. “Web Profile”僅包含JavaEE的一些部分(Web應用程序中最常用的部分) - servlets,jsp,CDI,JPA ,JSF,EJB(lite)。它不包括JMS,JAX-WS等等。

謝謝Bozho!那麼可以肯定地說EJB容器是所有JavaEE應用程序服務器的組成部分,並且它們是管理EJB兼容bean的地方嗎?最後一個問題:如果GlassFish是JavaEE參考實現,那是否意味著它包含JavaEE所需的每個組件(servlet容器,EJB容器,JMS提供程序,JTA管理器等)?GlassFish缺少完整JavaEE後端所需的任何東西嗎?再次感謝讓一切都如此清晰! - Zac 2010年12月29日20:33

Glassfish擁有一切。作為其他應用服務器。他們獲得認證的一切:) - Bozho 2010年12月29日20:43

@Zac - 順便說一句,如果答案適合你,你被邀請將其標記為已被接受(在投票櫃檯下面打勾) - Bozho 2010年12月30日19:54

板凳
+50

Bozho確實給出了一個很好的答案。有關Java EE的一些其他詳細信息,我給另一個問題的以下答案可能是相關的:用於分層可重用體系結構的框架

您可能還想閱讀我在維基百科上編輯的關於EJB的文章: http://en.wikipedia.org/wiki/Enterprise_JavaBean

在子問題3中添加一點:

您可以將EJB容器視為一種擴展JVM。“普通”JVM提供自動管理Java類內存的服務。EJB容器提供了其他服務,如自動管理事務和池。

要使常規類成為EJB非常簡單。您只需要添加@Stateless註釋:

  @Stateless public class SomeBean {// ...}   

在此之後,所有方法都在bean是自動事務性的,SomeBean的實例會自動合併,而不是在需要時重新創建。

要意識到的一件重要的事情是,這種“託管bean”無法通過常規新實例化運營商。它們必須通過註釋注入。如果再次使用普通JVM的類比,可以說這個註釋是一種“託管新運算符”:

 < code> public class SomeOtherManagedBean {@EJB SomeBean someBean; }   

這裡的注入只適用於其他託管bean。在非託管環境中,您可以通過JNDI查找來引導實例。

在Java EE中,EJB bean傳統上只包含純業務邏輯。在Java EE的最新版本Java EE 6中,已經開始嘗試將統一組件模型中的託管bean概念引入應用程序的所有部分。這是通過CDI規範完成的,CDI規範還定義了一個簡單稱為“託管bean”的組件類型。EJB模型最終可能會被改進為一組CDI註釋。 p>問題是這裡的注入僅適用於其他託管bean。在非託管環境中,您可以通過JNDI查找來引導實例。

在Java EE中,EJB bean傳統上只包含純業務邏輯。在Java EE的最新版本Java EE 6中,已經開始嘗試將統一組件模型中的託管bean概念引入應用程序的所有部分。這是通過CDI規範完成的,CDI規範還定義了一個簡單稱為“託管bean”的組件類型。EJB模型最終可能會被改進為一組CDI註釋。 p>問題是這裡的注入僅適用於其他託管bean。在非託管環境中,您可以通過JNDI查找來引導實例。

在Java EE中,EJB bean傳統上只包含純業務邏輯。在Java EE的最新版本Java EE 6中,已經開始嘗試將統一組件模型中的託管bean概念引入應用程序的所有部分。這是通過CDI規範完成的,CDI規範還定義了一個簡單稱為“託管bean”的組件類型。EJB模型最終可能會被改進為一組CDI註釋。 傳統上,EJB bean只包含純粹的業務邏輯。在Java EE的最新版本Java EE 6中,已經開始嘗試將統一組件模型中的託管bean概念引入應用程序的所有部分。這是通過CDI規範完成的,CDI規範還定義了一個簡單稱為“託管bean”的組件類型。EJB模型最終可能會被改進為一組CDI註釋。 傳統上,EJB bean只包含純粹的業務邏輯。在Java EE的最新版本Java EE 6中,已經開始嘗試將統一組件模型中的託管bean概念引入應用程序的所有部分。這是通過CDI規範完成的,CDI規範還定義了一個簡單稱為“託管bean”的組件類型。EJB模型最終可能會被改進為一組CDI註釋。

列表底部最後回答了最令人不安的問題:什麼是EJB和容器。謝謝。我希望我能更多地投票。 - Croo 12年4月25日19:53

地板
+30

Bozho對你的問題給出了很好的答案,所以我只想補充一點。

你掙扎的原因並不是因為他們很難學,因為有很多東西要做學習,你正試圖同時學習它們。如果你要一次學習一個,你會沒事的。

最簡單的入門方法是Servlet和JSP。大多數Java EE應用程序使用這些技術,新手開發人員將在大多數項目中獲得這些任務,因此它們很實用。Servlet和JSP是一種規範,它允許您主要生成具有動態(=可變)內容的網頁。Tomcat是一個Web容器,它實現了Servlet和JSP,並為Servlet和JSP組件提供了運行時環境。我推薦Tomcat,因為它是開源的,並且擁有最大的市場份額。

我推薦Marty Hall的Core Servlets和Javaserver Pages作為初學者的書。這是非常易讀。

湯姆 - 謝謝你的意見。我很高興聽到另一位已經“在那裡”的開發人員說這個東西在一個環境中很難咀嚼。對於整個JavaEE平台的介紹,您有任何書籍/文章/ PDF建議嗎?也許,如果GlassFish是一個完整的JavaEE實現,那麼一個關於GlassFish的好教程會給我這個概述嗎?再次感謝! - Zac 2010年12月29日20:35

我沒有特別推薦的內容,但我認為大多數關於EJB或JEE應用程序服務器的入門書都會對主要組件進行概述。 - 湯姆塔克2010年12月29日22:39

0
votes
answers
29 views
+10

What is the difference between Eclipse 3.7 and Eclipse 4.1?

I see there are two main distributions of Eclipse going on - One is on 3.6, 3.7, 3.8 path and the other is 4.0, 4.1 path(http://www.eclipse.org/e4/).

I don't have clarity on what is the difference between these two distributions?

43
votes
answers
47 views
+10

Accessing ServletContext and HttpSession in @OnMessage of a JSR-356 @ServerEndpoint

I need to get the ServletContext from inside a @ServerEndpoint in order to find Spring ApplicationContext and lookup for a Bean.

For the moment my best approach is to bind that bean in the JNDI naming context and lookup it in the Endpoint. Any better solution is welcome.

I'm also looking for a reasonable way to sync servlet's HttpSession with websocket's Session.

up vote 38 down vote accepted favorite
沙发
+380
+50

servlet HttpSession 在JSR-356中,由 HandshakeRequest#getHttpSession() @ServerEndpoint ServletContext 又可以通過/ code> 方法。 HandshakeRequest 在這裡可用作方法參數。您可以將 HttpSession 放入 <代碼> EndpointConfig#getUserProperties() EndpointConfig 又可用作方法參數 @OnOpen

這是 ServerEndpointConfig.Configurator 實現的啟動示例:

  公共類ServletAwareConfig擴展ServerEndpointConfig.Configurator {@Override public void modifyHandshake(ServerEndpointConfig config,HandshakeRequest request,HandshakeResponse response){HttpSession httpSession =(HttpSession)request.getHttpSession(); config.getUserProperties()。put(“httpSession”,httpSession); }   

以下是如何使用它,請注意 配置器 屬性 @ServerEndpoint

  @ServerEndpoint(value =“/ your_socket”,configurator = ServletAwareConfig。class)public class YourSocket {private EndpointConfig config; @OnOpen public void onOpen(Session websocketSession,EndpointConfig config){this.config = config; } @OnMessage public void onMessage(String message){HttpSession httpSession =(HttpSession)config.getUserProperties()。get(“httpSession”); ServletContext servletContext = httpSession.getServletContext(); // ...}}   

作為設計提示,最好讓 @ServerEndpoint 完全不受servlet API依賴的影響。您可以在 modifyHandshake()實現中更好地立即提取 您需要從servlet會話或上下文中將信息(通常是可變的Javabean)放入用戶屬性映射中。如果你不這樣做,那麼你應該記住,websocket會話可以比HTTP會話更長壽。因此,當你仍然將 HttpSession 帶入端點時,當你嘗試在它過期時訪問它時,你可能會遇到 IllegalStateException

In如果您碰巧有CDI(也許還有JSF),您可以從 OmniFaces <的源代碼中獲取靈感。代碼>&lt; o:socket&gt; (鏈接位於展示的最底部)。

另見:
    <

感謝您的解釋,尤其是提示保持Endpoints不受servlet API依賴的影響。 - hfmanson 2014年5月18日11:09

而是將servlet上下文作為我插入的用戶屬性注入Spring上下文; 它不喜歡自動裝配bean,但它起作用並解決了我的問題。 - Sombriks於2014年5月20日13:04

對於websocket,似乎Omniface示例中的代碼使用HTTP請求來遞增計數器。我在這裡想念的是什麼,它不是無視這一點嗎? - Ced於2016年5月8日4:11

@Ced:它只會觸發推送。 - BalusC 2016年5月8日19:41

這仍然可以在2019年的Tomcat 9中使用 - gbenroscience 5月2日8:13

+50

更新了BalusC的答案代碼,onOpen方法需要用@OnOpen進行修飾。然後就不再需要擴展Endpoint類了:

  @ServerEndpoint(value =“/ your_socket”,configurator = ServletAwareConfig.class)public class YourSocket {private EndpointConfig config; @OnOpen public void onOpen(Session websocketSession,EndpointConfig config){this.config = config; } @OnMessage public void onMessage(String message){HttpSession httpSession =(HttpSession)config.getUserProperties()。get(“httpSession”); ServletContext servletContext = httpSession.getServletContext(); // ...}}  
     
			
        

謝謝,我已經相應地更新了我的答案。 - BalusC於2014年5月18日19:51

0

我嘗試了BalusC對Tomcat(版本7.0.56和8.0.14)的回答。在兩個容器上,modifyHandshake的request參數不包含HttpSession(因此沒有servletContext)。由於我只需要servlet上下文來訪問“全局”變量(web-application global,即),我只是將這些變量存儲在holder類的普通靜態字段中。這是不優雅的,但它確實有效。

這就像這個特定的tomcat版本中的一個錯誤 - 有沒有人在那裡也見過這個?

不,這不是一個錯誤。它表示根本不創建httpSession。你可以事先自己創建它。有關詳細信息,請參閱stackoverflow.com/questions/20240591/。 - Kalle 2016年1月17日21:54

謝謝 - 這是我沒有想到的解決方案(我認為Session總是由基礎架構創建)。唉,因為我只想將它用於應用程序全局數據,我仍然會堅持使用手工製作的解決方案,因為它現在可以使用。 - Wolfgang Liebich於2016年2月1日10:45

(這不應該作為答案發布)Jetty中的行為是相同的。正如@Kalle指出的那樣; 只需使用HttpFilter或ServletRequestListener並調用request.getSession(true) - 恥辱HandshakeRequest.getHttpSession()上沒有類似的重載 - earcam 17年11月24日在13:29

0

有時我們無法使用BalusC的上述 ServletAwareConfig 獲取 session ,這是因為仍然沒有創建會話。因為我們不是在尋找session而是servletContext,在tomcat中我們可以這樣做:

  public static class ServletAwareConfig extends ServerEndpointConfig.Configurator {@Override public void modifyHandshake(ServerEndpointConfig config,HandshakeRequest request,HandshakeResponse)響應){try {Field reqfld = request.getClass()。getDeclaredField(“request”); reqfld.setAccessible(真); HttpServletRequest req =(HttpServletRequest)reqfld.get(request); ServletContext ctxt = req.getServletContext(); Map&lt; String,Object&gt; up = config。getUserProperties(); up.put(“servletContext”,ctxt); } catch(NoSuchFieldException e){} catch(SecurityException e){} catch(IllegalArgumentException e){} catch(IllegalAccessException e){}}}   

如果我們想立即進行init會話,我們可以調用request.getSession()。

參考: Websocket - httpSession返回null

50
votes
answers
93 views
+10

EJB 3.0 - Nested Transaction != Requires New?

I just read the Transactions Chapter (10) of "Mastering EJB 3.0" and now I'm confused about nested transactions.

The book says

"The EJB-defined transaction manager does not support nested transactions; it requires support for only flat transactions." (Site 278, Note)

This fact is described not only by this book, I found this statement in other books / websites.

But if I call a "Requires New" annotated Method from a, let's say "Required" annotated Methode, what I have is a nested transaction, isn't it? I can roll back the inner transaction or commit it, without affecting the outer transaction. And if I want the outer Transaction to be aborted, I throw an EJBException back and the whole transaction will be rolled back.

So is it just that this behavior is not required by the EJB 3.0 specification or have i misunderstood something? I just can't get the difference between nested transactions and the described behavior.

Regards Norman

up vote 41 down vote accepted favorite
沙发
+410
+50

RequiresNew不會創建嵌套事務,因為第一個事務在第二個事務運行時被掛起。嵌套事務如下所示:

 嵌套事務示例&gt; method1  -  begin tran1&gt; method2  -  begin tran2 workA&lt; method2  -  commit tran2&lt; method1  -  rollback tran1(tran2也回滾,因為它是嵌套的)  

相反,RequiresNew看起來像這樣:

  EJB RequiresNew example&gt; method1  -  begin tran1&gt; method2  -  suspend tran1,begin tran2 workA&lt; method2  -  commit tran2,resume tran1&lt; method1  -  rollback tran1(tran2保持提交) 
     
			
        

感謝這個答案,現在我很清楚:)但如果我使用mandatoy或內部事務所需,它的行為就像一個嵌套的事務,雖然它屬於外部事務,對吧? - NorRen於2012年5月30日18:44

如果使用mandatory或required,則容器不會對inner方法執行任何操作。沒有“內部”/“外部”事務區別,容器只留下事務。 - Brett Kail於2012年5月30日18:53

是的,EJB RequiresNew與該文檔中描述的“嵌套頂級事務”相同。EE沒有與該文檔中描述的“嵌套子事務”相同的內容。 - Brett Kail 2013年4月24日0:18

@MikeArgyriou不,對於非嵌套(JTA)事務,這兩個事務是完全獨立的:一個事務的提交/回滾對另一個沒有影響。 - Brett Kail 2015年7月23日6:21

@MikeArgyriou不,在那種情況下,企業bean方法重用客戶端的現有事務,它不會開始新的事務(嵌套或其他)。此時,您可能應該打開一個新問題,而不是在這個舊答案上提問。 - Brett Kail 2015年7月23日16:27

+90

簡單回答是“外部”交易在新交易開始前暫停。兩個事務的命運沒有任何關聯,所以所有意圖和目的都不會嵌套到另一個事務中。

如果 REQUIRES_NEW 方法拋出 EJBException 它創建的新事務將被回滾,而不是“外部”事務。

54
votes
answers
17 views
+10

Batch inserts using JPA EntityManager

Is there a way where we can use batch inserts using JPA EntityManager. I know there is no direct way to achieve this but there must be some way to achieve this mechanism.

Actually, for every insert operation it's taking me 300ms which I want to reduce using batch inserts instead of single inserts.

Here's code I am using currently executing for single inserts

        @PersistenceContext(unitName = "testing")
        EntityManager eM;

        Query querys = this.eM.createNativeQuery(insertQuery);
        for (String s : someList) {
            //setting parameters
            querys.executeUpdate();
        }

Thanks in advance.

up vote 12 down vote accepted favorite
沙发
+120
+50

可以使用JPA執行批量寫入,但它高度依賴於持久性提供程序,數據庫和JDBC驅動程序的特定實現。例如,文章解釋瞭如何使用EclipseLink JPA 2.3和Oracle數據庫啟用批量寫入(優化#8)。查看特定環境中的類似配置參數。

嗨,我正在使用org.eclipse.persistence.jpa.PersistenceProvider。如果使用批量插入物有任何限制,請告訴我。 - 於12月14日14:26離開

@Rana全部在鏈接文章中,您必須編輯persistence.xml文件並添加類似 。請花點時間先閱讀這篇文章。 - ÓscarLópez於2012年5月14日14:30

嗨,我已經添加了,我正在尋找有關我需要使用此聲明觀察的任何陷阱的信息。謝謝。 - 於12月14日14:39離開

+230

根據事務是否包含循環,批處理通常已在您的情況下發生。

JPA將在其L1緩存中收集所有更新,並且通常在批處理時將所有更新寫入數據庫。事務提交。這與在JDBC中進行批處理並沒有什麼不同,在您調用更新方法之前,您添加的每個批處理項目也暫時存在於內存中。

可能存在的問題是您沒有對JPA的硬性保證確實這個批處理完成,如果在事務提交或達到閾值時這樣做,但我發現在實踐中幾乎在所有情況下,特別是在涉及這種簡單更新循環的情況下,它確實進行了批處理。

一個問題是,即使JPA確實已經進行批處理,您仍然可能希望控制批量大小。通過其他答案鏈接的文章為此提供了非常有用的信息。

最後,您應該知道您的L1緩存在循環中不斷增長,因此如果更新的數量非常大,請定期清除它。或者,如果您的業務邏輯可以維持它,請在多個事務中進行部分更新。例如,交易1中的項目0到100.000,交易2中的100.001到200.000等等。 如果您的業務邏輯可以支持它,請在多個事務中進行部分更新。例如,交易1中的項目0到100.000,交易2中的100.001到200.000等等。 如果您的業務邏輯可以支持它,請在多個事務中進行部分更新。例如,交易1中的項目0到100.000,交易2中的100.001到200.000等等。

嘿我現在使用了spring數據jpa,所以你的意思是如果我在方法中的循環中更新對象並且這個方法被@Transactional標記,它將自動批量更新,如jdbc批量更新。 - zhuguowei 2015年11月30日4:26

+160

我知道這是一個相當古老的問題,並且接受了答案。儘管如此,我想對這個非常具體的主題“JPA批量插入”給出新的答案。

  @PersistenceContext private EntityManager entityManager; @Value(“$ {hibernate.jdbc.batch_size}”)private int batchSize; public&lt; T extends MyClass&gt; 收集和LT; T&GT; bulkSave(Collection&lt; T&gt; entities){final List&lt; T&gt; savedEntities = new ArrayList&lt; T&gt;(entities.size()); int i = 0; for(T t:entities){savedEntities.add(persistOrMerge(t)); 我++; if(i%batchSize == 0){//刷新一批插入並釋放內存。entityManager.flush(); entityManager.clear(); 返回savedEntities; } private&lt; T擴展了MyClass&gt; T persistOrMerge(T t){if(t.getId()== null){entityManager.persist(t); 返回; } else {return entityManager.merge(t); }   

來源: http://frightanic.com/software-發展/ JPA分批插入/

我想我們需要在最後再次flush()和clear()以保存任何未完成批量大小的剩餘對象? - Ram Patra 2017年1月25日15:45

聽起來沒錯,謝謝@RamPatra。 - MarcelStör於2017年1月25日21:57

+30

JPA本身沒有任何批量設置。但是,有一些依賴於實現的設置。以下是hibernate的示例

38
votes
answers
29 views
+10

What is the difference between Eclipse for Java (EE) Developers and Eclipse Classic?

What is the difference between Eclipse for Java (EE) Developers and Eclipse Classic?

Both are marked as version 3.6.

Which one should I use?

沙发
+380

如果要構建Java EE應用程序,最好使用 Eclipse IDE for Java EE 它有從HTML到JSP / JSF,Javascript的編輯器。它非常適合webapps開發,並提供插件和工具來輕鬆開發Java EE應用程序(全部捆綁在一起)。

Eclipse Classic 基本上是沒有Java EE部分的全功能Eclipse。

提示:理論上,您應該能夠使用常規Eclipse Classic並安裝與Eclipse IDE for Java EE捆綁在一起的所有其他組件。畢竟,Eclipse基本上是作為一大包插件而構建的。但在實踐中,我和許多其他人發現這是不可能的。如果您需要Java EE功能(例如與Tomcat或其他Servlet引擎集成),請切換版本而不是編制自己的升級路徑。 - Basil Bourque 2013年8月19日0:09

@Abdul,這意味著該軟件包包含源代碼(這意味著您不僅可以獲取jar /包,還可以編譯打包到的源代碼)。不要忘記(有些?)Eclipse IDE是一個開源項目,因此一些軟件包可以附帶源代碼。 - Buhake Sindi 2014年5月11日19:15

43
votes
answers
16 views
+10

What use are EJBs

I'm currently learning Jave-EE, having plenty of C++ experience and having learned Java SE. I don't understand the purpose of Enterprise Java Beans; can someone clarify this for me. I'm not interested in legacy uses: this is in the context of EJB-3.1 and Java-EE 6.

It seems that some people use them to contain the business logic, for implementing the business layer of the conventional 3-layer architecture. That separates the domain logic from the domain objects, leading to an anemic domain model. But that goes against all my OOD instincts; I agree with Martin Fowler that it is an anti-pattern. Should I relax my objections to an anemic domain model? Or do EJBs have other uses?

沙发
+60
+50

使用Java EE並不會自動暗示一個貧血的域模型,就像你在java中編寫代碼一樣,沒有充分利用最佳實踐並不意味著它在java中是不可能的。我相信Martin Fowler的觀點是J2EE(注意使用J2EE而不是Java EE)幾乎強制執行邏輯和數據操作。使用基於POJO的實體允許數據和行為適當地建模。EJB中的“業務邏輯”通常編排業務邏輯的應用程序,但通常不會實際執行它,它通常是一個非常薄的包裝器。

EJB因此構成了您的Service API,您需要這個無論您使用哪個平台/框架,您都需要擁有可以物理調用的東西,這是一個切入點。無論您是使用spring,Web服務等實現。..你需要一個服務層,沒有什麼能阻止它在Java EE中實現。一個相當人為的例子

  @Stateless public SomeServiceImpl實現SomeService someServiceMethod(){delegate.doSomething(); public SomeServiceDelegate實現SomeService someServiceMethod(){modelObject.doSomething();   

我沒有考慮優先選擇EJB而不是任何其他技術的原因,只是想指出使用它們並不意味著你的實現不能使用最佳實踐。 @Stateless public SomeServiceImpl實現SomeService someServiceMethod(){delegate.doSomething(); public SomeServiceDelegate實現SomeService someServiceMethod(){modelObject.doSomething();

我沒有考慮優先選擇EJB而不是任何其他技術的原因,只是想指出使用它們並不意味著你的實現不能使用最佳實踐。 @Stateless public SomeServiceImpl實現SomeService someServiceMethod(){delegate.doSomething(); public SomeServiceDelegate實現SomeService someServiceMethod(){modelObject.doSomething();

我沒有考慮優先選擇EJB而不是任何其他技術的原因,只是想指出使用它們並不意味著你的實現不能使用最佳實踐。

+200

如其他幾個答案所示,EJB非常適合實現服務層。它們是Java EE中非常現代,輕量級的bean。儘管有這個名字,你無法將它們與J2EE中嚴酷的重型EJB2野獸進行比較。每個人都同意那些是一場災難,但它不再是2002年了。

自從EJB3(2006)以來,EJB bean已經成為一種非常精細的技術。

他們通過提供聲明性事務來幫助很多(每個入口方法自動啟動一個事務,如果還沒有進行,儘管可以根據需要更改),池,安全性,鎖定,遠程處理然後一些。有關其他詳細信息,請參閱以下答案:

你提到池是允許使用輕量級存根。CDI也使用存根,但不使用池。我更傾向於認為池化是EJB1 / 2的延續,它可能是一個好主意,現在幾乎毫無意義,甚至可能是有害的。 - 湯姆安德森於2012年5月20日20:35

合併可能仍有其用途,但對於選擇加入或選擇退出那些不必要或有害的情況,肯定有話要說。目前使用@Stateless,您可以在一個註釋中獲得所有內容。無論如何,即使在EJB3中實例化依賴項(可能是外部系統)也可能很昂貴,然後池化肯定是有用的。 - Arjan Tijms於2012年5月21日18:43

是的,這一切都歸結為昂貴的依賴。但是,我認為這就是JCA資源的用途 - 管理昂貴的資源,特別是外部連接。使用資源適配器可以只集中資源,而不必集中註入資源的對象。遺憾的是,編寫池化EJB比編寫資源適配器要容易得多。 - 湯姆安德森2012年5月22日8:07

@Geek代理不一定要包含任何數據或邏輯。它可能是一個小包裝器,對於每個調用的方法,方法X只會說:“get bean”xyz.foo.kaz“來自池A並調用方法X”。實際上你可以看到這只是對“A://xyz.foo.kaz/X”的http請求。代理可以非常輕量級,因為它甚至不需要包含對真實bean的引用,只需要對池的“命令/請求”。 - Arjan Tijms 2014年7月18日20:08

@ArjanTijms我現在看到了你的觀點。感謝您的跟進和+1。 - 極客2014年7月19日8:49

+60

您已經引用了“實現業務邏輯”用例。

EJB - 在EJB 3.x會話Bean,消息驅動Bean和3.1中,新的Singleton Beans確實允許您實現biz邏輯。會話Bean通常作為客戶端連接的Facade服務器。這些客戶端可以是Servlet,通過例如HTTP或“胖”客戶端來提供內容,這些客戶端通過其他(更多二進制)協議與EJB進行通信。

消息驅動Bean充當異步通信的端點,並且可以自己調用會話Bean的方法作為一個例子。

所有的EJB都有一個共同點,這使它們非常有吸引力:它們由容器管理。所以容器負責實例化,池化,事務,安全性等。

如果你在EJB中編寫

  @Resource DataSource x;   

容器確保當你的bean準備好接收方法調用時,變量'x'包含一個合適的數據源。

Bean的匯集允許你由於實例是共享的(無狀態SB),或者如果內存緊張,可以通過容器將實例交換到第二存儲,並在以後重新激活它們,從而使更多的客戶端連接到站點。 / p>

在EJB 3中,EJB 1.x和2.x中的舊EntityBeans消失了,取而代之的是JPA,後者構建了POJO的域數據模型,可以註釋它們以提供關係語義或者語義可能由外部XML文件提供。

使用JPA(根本不需要EJB),EJB通常用於實現對這些實體的處理:

  @Stateless public class MyBean {@PersistenceContext EntityManager em; public Foo getFoo(String name){Query q = em.createQuery(“SELECT f FROM Foo f WHERE f.name =:name”); q.setParameter(“姓名”,名字); return q.getSingleValue(); }}  
     
			
        

“Session Beans經常服務器作為Facade”你會說這是主要的用途,作為你的域對象的Facade嗎? - Raedwald 2011年4月7日11:27

不是主要用途,但非常受歡迎。特別是wrt域對象,SB還包含查詢它們和處理ORM框架的邏輯。 - Heiko Rupp 2011年4月7日11:31

stackoverflow.com/questions/4773927/強調“必須啟動和提交/回滾交易的要求自己消失” - Raedwald 2011年4月7日14:58

+50

有幾點:

  • EJB本身不存在; 它們位於一個EJB容器中,通過它們為您提供一些非常有用的服務,例如聲明性安全性,聲明性事務和相對容易的集群。
  • 雖然貧窮的域模型是反模式的,但是一旦你的業務發生了邏輯變得更加複雜,例如當多個應用程序在同一模型上運行時,將大部分邏輯與模型分離就成了關注點分離的問題。

@Michael Borgwardt:第一點的所有服務甚至都是春天提供的。 - 死程序員2011年4月7日11:05

@Suresh:那又怎樣?EJB容器在Spring存在之前提供它們。 - Michael Borgwardt 2011年4月7日11:08

@Raedwald:不,我說在將所有邏輯強行保留在域模型之外,將更專業或複雜的邏輯放入單獨的類中以實現關注點分離之間存在差異。 - Michael Borgwardt 2011年4月7日11:29

EJB 3沒有EntityEJBs - EntityBeans是EJB 1.x和2.x - Heiko Rupp 2011年4月7日11:31

@Raedwald:來自同一篇文章:“如果業務規則邏輯跨越兩個或更多個Entity對象,那麼它應該成為Service類的一部分。” - 無狀態會話EJB就是服務類。請注意,本文還將服務類視為域層的一部分。 - Michael Borgwardt 2011年4月7日16:56

+30

只是來自個人經驗的評論...

我不懷疑EJB的好處,但是曾經使用它們,我看到EJB只適用於安全性和事務處理非常好的情況重要的(即:財務申請)。對於90%的情況,沒有EJB就可以了。另一件事......可伸縮性和EJB不是好朋友。

你從哪裡得到最後的想法?EJB非常適合擴展。 - Heiko Rupp 2011年4月7日11:39

如果這是真的,我們會看到使用它們的更多高度使用的門戶網站(twitter,facebook,google,...)。正如我所說,如果你的系統大量使用事務和安全性,那麼MAYBE EJB是一個很好的選擇,否則就像在大多數情況下它們是一種矯枉過正。 - Manuel Salvadores 2011年4月7日12:39

@msalvadores不了解twitter,但Facebook和谷歌有自己的框架高度配置他們需要的。大多數企業都無法承擔龐大的團隊。JEE運行著驚人數量的全球業務,這是有原因的,易於部署,低開發成本和良好的可擴展性是其中一些原因。在企業層面,沒有任何東西(恕我直言)接近。 - vickirk 2011年4月7日13:57

我沒有進行長時間的討論,(可能是最後的評論),但是如果你不需要事務/安全性,那麼它就不會使用它,也不會使用額外的資源。但是如果你想要做的就是舉辦一項瑣碎的服務,那就太複雜了。您的觀點是可擴展性,EJB是可擴展的,並且使用我使用的所有ejb容器都是微不足道的。 - vickirk 2011年4月7日14:17

但是使用EJB,管理事務的痛苦大大降低到變得微不足道的程度。這極大地提高了簡單和復雜應用程序的穩健性。在引擎蓋下,事務本質上仍然是複雜的,但EJB使它們變得容易。正如FK的實現在內部可能很複雜,但是您的數據庫使得向列添加一個很簡單。 - Arjan Tijms 2011年4月12日9:17

+20

有些人在這樣的討論中告訴我,在此之前,EJB在EJB3中變得有用,而這並不是真的。它特別適用於JPA變得更強大,但EJB1.0和EJB2.1仍然做了很多。也許他們沒有在大型應用程序中使用它,所以他們這麼說。

例如POJO不能處理Transaction,所以在EJB中你可以指定特定方法的事務類型是否需要新事務或不是來自事務。

在我的組織中,我們從頭開始使用ERP構建,我們在業務邏輯中使用EJB,它來自2000,EJB是版本1.0。並且它不僅將業務層與其他層分開,而且還將系統彼此分開,例如:財務模塊與HR模塊分開。

0
votes
answers
32 views
+10

How to create join table with JPA annotations?

I need to create a join table in my database using JPA annotations so the result will be this:

enter image description here

So far I just implemented 2 entities:

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id 
    @Column(nullable = false)
    private String userid;  

    @Column(nullable = false)
    private String password;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @Column(nullable = false)
    private String groupid;

    public String getGroupid() {
        return groupid;
    }
    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }
}

Should i create another entity called USER_GROUP or i can just add some annotations, so the join table will be created automatically when i run create tables from entities(ORM)?

How should i annotate my entities to achieve the same as in the image?

68
votes
answers
47 views
+10

log4j 2 adding multiple colors to console appender

Hi I just downloaded and configured log4j-2. I am stuck on applying color codes to the SlowConsole console appender. My console appender is like below.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
        </Console>
        <Console name="SlowConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=black, DEBUG=green, TRACE=blue}"/>
        </Console>
        <File name="File" fileName="C:logout.txt">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <logger name="org.abc.ea.web" level="ALL" additivity="false">
            <!--Log4j for the WEB MODULE -->
            <appender-ref ref="SlowConsole"/>
        </logger>
        <logger name="org.abc.ea.ejb" level="ALL" additivity="false">
            <!--Log4j for the EJB MODULE -->
            <appender-ref ref="SlowConsole"/>
        </logger>
        <Root level="ERROR">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File" />
        </Root>
    </Loggers>
</Configuration>

I have two questions,

  1. I am new to log4j, is this the right way to write xml config file?

  2. How can i add two color codes to each log level?

    for example: DEBUG=green -> will output light green font, But i need it to be dim and bold

up vote 39 down vote accepted favorite
沙发
+390
+50

我想我找到了解決方案。我下載了log4j2-core-sources.jar並追踪了來源你可以寫如下;

 &lt; Console name =“SlowConsole”target =“SYSTEM_OUT”&gt; &lt; PatternLayout pattern =“%highlight {%d {HH:mm:ss.SSS}%-5level%logger {36}。%M()@%L  - %msg%n} {FATAL =紅色閃爍,ERROR =紅色,WARN =黃色粗體,INFO =黑色,DEBUG =綠色粗體,TRACE =藍色}“/&gt; &LT; /控制台&GT;   

我認為log4j2 文檔<

找到一個手冊logging.apache.org/log4j/2.x/manual/layouts.html搜索高亮{pattern} {style} - Harmeet Singh 2016年3月5日21:30

@HarmeetSingh是的,現在這個答案有點老了。 - Rasika Perera 2016年3月7日4:15

我不得不做禁用安西尼=“假” - Kalpesh Soni Jun 11於19:57

+180

對於看起來非常接近Spring Boot的默認logback控制台輸出的log4j2彩色輸出:

 &lt; Console name =“ConsoleAppender”target =“SYSTEM_OUT”follow =“true”&gt; &lt; PatternLayout pattern =“%d {$ {LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}%highlight {$ {LOG_LEVEL_PATTERN: - %5p}} {FATAL =紅色閃爍,ERROR =紅色, WARN =黃色粗體,INFO =綠色,DEBUG =綠色粗體,TRACE =藍色}%style {$ {sys:PID}} {magenta} [%15.15t]%style {% -  40.40C {1。}} {青色}:%m%n $ {LOG_EXCEPTION_CONVERSION_WORD: - %wEx}“/&gt; &LT; /控制台&GT;   

應用自定義日誌配置後,我想要的正是我想要的! - 達里亞18年5月7日14:35

這應該是公認的答案,謝謝 - mahieddine 18年3月3日12:15

我從轉換模式的209位開始得到無法識別的轉換說明符[wEx]。有誰知道發生了什麼事? - ycomp 1月26日7:23

+60

使用eclipse控制台時,很高興看到紅色錯誤和所有其他黑色錯誤。您可以使用過濾器執行此操作:

 &lt; Appenders&gt; &lt; Console name =“ConsoleStdOut”target =“SYSTEM_OUT”&gt; &lt; ThresholdFilter level =“ERROR”onMatch =“DENY”onMismatch =“ACCEPT”/&gt; &lt; PatternLayout pattern =“%d {HH:mm:ss} [%t]%-5level%logger {36}  - %msg%n”/&gt; &LT; /控制台&GT; &lt; Console name =“ConsoleStdErr”target =“SYSTEM_ERR”&gt; &lt; ThresholdFilter level =“ERROR”onMatch =“ACCEPT”onMismatch =“DENY”/&gt; &lt; PatternLayout pattern =“%d {HH:mm:ss} [%t]%-5level%logger {36}  - %msg%n”/&gt; &LT; /控制台&GT; &LT; /附加目的地&GT; &LT;記錄器&GT; &lt; Root level =“info”&gt; &lt; AppenderRef ref =“ConsoleStdOut”/&gt; &lt; AppenderRef ref =“ConsoleStdErr”/&gt; &LT; /根和GT; &LT; /記錄器&GT;  
     
			
        
+30
 &lt;?xml version =“1.0”encoding =“UTF-8”?&gt; &lt;配置狀態=“警告”&gt; &LT;附加目的地&GT; &lt; Console name =“Console”target =“SYSTEM_OUT”follow =“true”&gt; &lt; PatternLayout pattern =“%clr {%d {yyyy-MM-dd HH:mm:ss.SSS}} {faint}%clr {%5p}%clr {$ {sys:PID}} {magenta}%clr {---} {faint}%clr {[%15.15t]} {faint}%clr {% -  40.40c {1。}} {cyan}%clr {:} {faint}%m%n%xwEx“ /&GT; &LT; /控制台&GT; &LT; /附加目的地&GT; &LT;記錄器&GT; &lt; Root level =“info”&gt; &lt; AppenderRef ref =“控制台”/&gt; &LT; /根和GT; &LT; /記錄器&GT; &LT; /結構&gt;  <
     
			
        

謝謝,它對我有用--Berkin Jan 11 21:52

+20

1:是的,沒關係!你可以添加一些其他選項。請參閱 http://logging.apache.org/log4j/2.x/ manual / configuration.html

2:您可以使用HTMLLayout作為文件追加器。

參見 http://logging.apache.org/log4j/2.x/manual/layouts.html

http://www.tutorialspoint.com/log4j/log4j_htmllayout.htm

謝謝@Homayoun!我的第二個問題尚未解決。我正在使用consoleAppender。我想在netbeans,eclipse或任何STD_OUT上查看我的日誌。所以HTMLLayout不會工作,不是嗎? - Rasika Perera 2014年2月24日12:38

這取決於你的stdout查看器...例如eclipse stdout(輸出)沒有任何關於粗體的感覺。 - Taher Khorshidi 2014年2月24日12:49

謝謝!有用。 - sudoz於18年1月3日7:53